解析PHP編寫的25個游戲腳本_PHP教程
推薦:解析php生成靜態頁面的辦法首先說原理。某駝查了那么多資料,發現不管用什么方法,原理都是一樣的。就是用程序讀取相應的數據來替換模版中的變量,然后生成靜態頁。php中主要用到的就是要用到fread()和fwirte()。而靜態頁面生成了之后,就會牽扯到修改的問題。這里可以用到正則匹配的
PHP是一種易于使用、易于學習且可以廣泛獲取的編程語言。它非常適合開發在各種游戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的游戲,還是同一群人玩復雜的桌面角色扮演游戲,或者任意類型的聯機游戲,本系列都提供了適合您的內容。“用 PHP 可以編寫的 30 個游戲腳本” 系列中的每篇文章都將分別用不到 300 詞的文字介紹 10 個腳本(3d10 表示 “擲三個 10 面的骰子”),這些介紹性文字甚至對于開發新手來說都十分簡單,而且對于經驗豐富的游戲玩家來說也十分有用。本系列的目的在于為您提供可以修改的內容來滿足自身的需求,以便您可以在下一次游戲交流會上通過展示您的筆記本來給朋友和玩家們留下深刻印象。
開始之前
作為一名游戲專家/設計者和開發人員,我經常發現自己在運行、規劃和玩游戲時,很少編寫有用的實用程序和腳本。有時我需要快速想出創意。其他時候,我只需要編出一大堆非玩家角色(Non-Player Character,NPC)的名稱。偶爾,我還需要處理數字、處理一些異常或者將一些文字游戲集成到游戲中。只需事先完成一點腳本工作,就可以更好地管理這些任務。
本文將探究在各種游戲中可以使用的 10 個基本腳本。代碼壓縮包包含所討論的每個腳本的完整源代碼,并且可以在 chaoticneutral 查看腳本實際運行情況。
我們將快速地介紹這些腳本。有關如何查找主機或設置服務器的內容將不做介紹。有很多 Web 托管公司提供 PHP,并且如果需要安裝自己的 PHP,XAMPP 安裝程序使用起來也十分簡單。我們將不會花費大量時間談論 PHP 最佳實踐或游戲設計技術。本文介紹的腳本易于理解、使用簡單并可以快速掌握。
簡單的擲骰器
許多游戲和游戲系統都需要骰子。讓我們先從簡單的部分入手:擲一個六面骰子。實際上,滾動一個六面骰子就是從 1 到 6 之間選擇一個隨機數字。在 PHP 中,這十分簡單:echo rand(1,6);。
在許多情況下,這基本上很簡單。但是在處理機率游戲時,我們需要一些更好的實現。PHP 提供了更好的隨機數字生成器:mt_rand()。在不深入研究兩者差別的情況下,可以認為 mt_rand 是一個更快、更好的隨機數字生成器:echo mt_rand(1,6);。如果把該隨機數字生成器放入函數中,則效果會更好。
清單 1. 使用 mt_rand() 隨機數字生成器函數
function roll () { return mt_rand(1,6); } echo roll(); |
然后可以把需要滾動的骰子類型作為參數傳遞給函數。
清單 2. 將骰子類型作為參數傳遞
function roll ($sides) { return mt_rand(1,$sides); } echo roll(6); // roll a six-sided die echo roll(10); // roll a ten-sided die echo roll(20); // roll a twenty-sided die |
從這里開始,我們可以繼續根據需要一次滾動多個骰子,返回結果數組;也可以一次性滾動多個不同類型的骰子。但是大多數任務都可以使用這個簡單的腳本。
隨機名稱生成器
如果正在運行游戲、編寫故事或者一次性創建大批字符,有時會疲于應付不斷出現的新名字。讓我們看一看可用于解決此問題的一個簡單隨機名稱生成器。首先,讓我們創建兩個簡單數組 — 一個用于名字,一個用于姓氏。
清單 3. 名字和姓氏的兩個簡單數組
$male = array( "William", "Henry", "Filbert", "John", "Pat", ); $last = array( "Smith", "Jones", "Winkler", "Cooper", "Cline", ); |
然后就可以從每個數組中選擇一個隨機元素:echo $male[array_rand($male)] . ' ' . $last[array_rand($last)];。要一次性提取多個名稱,只需混合數組并根據需要提取。
清單 4. 混合名稱數組
shuffle($male); shuffle($last); for ($i = 0; $i <= 3; $i++) { echo $male[$i] . ' ' . $last[$i]; } |
基于此基本概念,我們可以創建保存名字和姓氏的文本文件。如果在文本文件的每一行中存放一個名字,則可以輕松地用換行符分隔文件內容以構建源代碼數組。
清單 5. 創建名稱的文本文件
$male = explode('\n', file_get_contents('names.female.txt')); $last = explode('\n', file_get_contents('names.last.txt')); |
構建或查找一些好的名字文件(代碼歸檔 中附帶了一些文件),此后我們絕不再需要為名字煩惱。
場景生成器
利用構建名字生成器使用的相同基本原理,我們可以構建場景生成器。此生成器不但在角色扮演游戲中十分有用,而且在需要用到偽隨機環境集合(可用于角色扮演、即興創作、寫作等情況)的情況下也十分有用。我最喜歡的游戲之一,Paranoia 在其 GM Pack 中包括了 “任務混合器(mission blender)”。任務混合器可用于在快速滾動骰子時整合完整任務。讓我們整合自己的場景生成器。
考慮以下場景:您醒來后發現自己迷失于叢林中。您知道自己必須趕去紐約,但是不知道原因。您可以聽到附近的狗叫聲及清晰的敵方搜尋者的聲音。您渾身發冷、不住顫抖,而且沒有武器。該場景中的每一句話都介紹場景的特定方面:
“您醒來后發現自己迷失于叢林中” — 這句話將建立設置。
“您知道自己必須趕去紐約” — 這句話將描述目標。
“您可以聽到狗叫聲” — 這句話將介紹敵人。
“您渾身發冷、不住顫抖,而且沒有武器” — 這句話將添加復雜度。
就像創建名字和姓氏的文本文件一樣,首先分別創建設置、目標、敵人和復雜度的文本文件。代碼歸檔中附帶了樣例文件。在擁有這些文件后,生成場景的代碼與生成名稱的代碼基本相同。
清單 6. 生成場景
$settings = explode("\n", file_get_contents('scenario.settings.txt')); $objectives = explode("\n", file_get_contents('scenario.objectives.txt')); $antagonists = explode("\n", file_get_contents('scenario.antagonists.txt')); $complicati**** = explode("\n", file_get_contents('scenario.complicati****.txt')); shuffle($settings); shuffle($objectives); shuffle($antagonists); shuffle($complicati****); echo $settings[0] . ' ' . $objectives[0] . ' ' . $antagonists[0] . ' ' . $complicati****[0] . "<br />\n"; |
我們可以通過添加新文本文件向場景中添加元素,也可能希望添加多重復雜度。添加到基本文本文件中的內容越多,場景隨時間的變化就越多。
牌組創建器(Deck builder)和裝備(shuffler)
如果您要玩紙牌并且要處理與紙牌相關的腳本,我們需要用裝備中的工具整合一副牌組構建器。首先,讓我們構建一副標準紙牌。需要構建兩個數組 — 一個用于保存同花色的組牌,而另一個用于保存牌面。如果稍后需要添加新組牌或牌類型,則這樣做將獲得很好的靈活性。
清單 7. 構建一副標準撲克牌
$suits = array ( "Spades", "Hearts", "Clubs", "Diamonds" ); $faces = array ( "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace" ); |
然后構建一副牌數組來保存所有紙牌值。只需使用一對 foreach 循環即可完成此操作。
清單 8. 構建一副牌數組
$deck = array(); foreach ($suits as $suit) { foreach ($faces as $face) { $deck[] = array ("face"=>$face, "suit"=>$suit); } } |
在構建了一副撲克牌數組后,我們可以輕松地洗牌并隨機抽出一張牌。
清單 9. 洗牌并隨機抽出一張牌
shuffle($deck); $card = array_shift($deck); echo $card['face'] . ' of ' . $card['suit']; |
現在,我們就獲得了抽取多副牌或構建多層牌盒(multideck shoe)的捷徑。
勝率計算器:發牌
由于構建撲克牌時會分別跟蹤每張牌的牌面和花色,因此可以通過編程方式利用這副牌來計算得到特定牌的幾率。首先每只手分別抽出五張牌。
清單 10. 每只手抽出五張牌
$hands = array(1 => array(), 2=>array()); for ($i = 0; $i < 5; $i++) { $hands[1][] = implode(" of ", array_shift($deck)); $hands[2][] = implode(" of ", array_shift($deck)); } |
然后可以查看這副牌,看看剩余多少張牌以及抽到特定牌的機率是多少。查看剩余的牌數十分簡單。只需要計算 $deck 數組中包含的元素數。要獲得抽到特定牌的機率,我們需要一個函數來遍歷整副牌并估算其余牌以查看是否匹配。
清單 11. 計算抽到特定牌的幾率
function calculate_odds($draw, $deck) { $remaining = count($deck); $odds = 0; foreach ($deck as $card) { if ( ($draw['face'] == $card['face'] && $draw['suit'] == $card['suit'] ) || ($draw['face'] == '' && $draw['suit'] == $card['suit'] ) || ($draw['face'] == $card['face'] && $draw['suit'] == '' ) ) { $odds++; } } return $odds . ' in ' $remaining; } |
現在可以選出嘗試抽出的牌。為了簡單起見,傳入看上去類似某張牌的數組。我們可以查找特定的一張牌。
清單 12. 查找指定的一張牌
$draw = array('face' => 'Ace', 'suit' => 'Spades'); echo implode(" of ", $draw) . ' : ' . calculate_odds($draw, $deck); |
或者可以查找指定牌面或花色的牌。
分享:淺談微軟對PHP支持的改進 及其它一些胡言亂語這里有一份我覺得值得推薦給大家的幻燈片(下載鏈接)。這個幻燈片是不久前舉辦的WordCamp China 2009上微軟王超群的演講,演講主題是《熟悉的陌生人:微軟對PHP的新支持使WordPress在IIS7上雄起》。WordCamp是業界著名的PHP大會,不過我這里推薦這個幻燈片
- 相關鏈接:
- 教程說明:
PHP教程-解析PHP編寫的25個游戲腳本
。