用 PHP 可以編寫的 30 個遊戲腳本,第 3 部分: 創建 10 個高級腳本

火星人 @ 2014-03-12 , reply:0


  
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
				  $noteid = count($masternotes);  $masternotes[] = array('title' => htmlentities(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
___FCKpd___1

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
				  $map = array();  $terrain = array ('plains', 'forest', 'swamp', 'hills', 'mountain', 'water');  for ($row = 0; $row < 20; $row++) {      $map[] = array();      for ($column = 0; $column < 20; $column++) {          $pool = $terrain;          if (isset($map[$row-1])) {              if (isset($map[$row-1][$column-1])) {                  $pool[] = $map[$row-1][$column-1];                  $pool[] = $map[$row-1][$column-1];              }              $pool[] = $map[$row-1][$column];              $pool[] = $map[$row-1][$column];              if (isset($map[$row-1][$column+1])) {                  $pool[] = $map[$row-1][$column+1];                    $pool[] = $map[$row-1][$column+1];              }          }          if (isset($map[$row][$column-1])) {                  $pool[] = $map[$row][$column-1];                  $pool[] = $map[$row][$column-1];          }          shuffle($pool);          $map[$row][$column] = $pool[0];      }  }  

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
				  $faces = array ('Cherry', 'Bar', 'Double Bar', 'Triple Bar', 'Diamond', 'Seven');  

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
				  $payouts = array (      'Bar|Bar|Bar' => '5',      'Double Bar|Double Bar|Double Bar' => '10',      'Triple Bar|Triple Bar|Triple Bar' => '15',      'Cherry|Cherry|Cherry' => '20',      'Seven|Seven|Seven' => '70',      'Diamond|Diamond|Diamond' => '100',  );  

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
				  $wheel1 = array();  foreach ($faces as $face) {      $wheel1[] = $face;  }  $wheel2 = array_reverse($wheel1);  $wheel3 = $wheel1;  

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
				  if (isset($payouts[$result1.'|'.$result2.'|'.$result3])) {      // give the payout  }  

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
				  $balls = array();  for ($i = 1; $i <= 80; $i++) {      $balls[] = $i;  }    shuffle($balls);  

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
				  $unencoded = str_split(preg_replace('/[^a-z]/', '', strtolower(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
				  $noteid = count($masternotes);  $masternotes[] = array('title' => htmlentities(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
___FCKpd___1

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
				  $map = array();  $terrain = array ('plains', 'forest', 'swamp', 'hills', 'mountain', 'water');  for ($row = 0; $row < 20; $row++) {      $map[] = array();      for ($column = 0; $column < 20; $column++) {          $pool = $terrain;          if (isset($map[$row-1])) {              if (isset($map[$row-1][$column-1])) {                  $pool[] = $map[$row-1][$column-1];                  $pool[] = $map[$row-1][$column-1];              }              $pool[] = $map[$row-1][$column];              $pool[] = $map[$row-1][$column];              if (isset($map[$row-1][$column+1])) {                  $pool[] = $map[$row-1][$column+1];                    $pool[] = $map[$row-1][$column+1];              }          }          if (isset($map[$row][$column-1])) {                  $pool[] = $map[$row][$column-1];                  $pool[] = $map[$row][$column-1];          }          shuffle($pool);          $map[$row][$column] = $pool[0];      }  }  

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
				  $faces = array ('Cherry', 'Bar', 'Double Bar', 'Triple Bar', 'Diamond', 'Seven');  

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
				  $payouts = array (      'Bar|Bar|Bar' => '5',      'Double Bar|Double Bar|Double Bar' => '10',      'Triple Bar|Triple Bar|Triple Bar' => '15',      'Cherry|Cherry|Cherry' => '20',      'Seven|Seven|Seven' => '70',      'Diamond|Diamond|Diamond' => '100',  );  

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
				  $wheel1 = array();  foreach ($faces as $face) {      $wheel1[] = $face;  }  $wheel2 = array_reverse($wheel1);  $wheel3 = $wheel1;  

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
				  if (isset($payouts[$result1.'|'.$result2.'|'.$result3])) {      // give the payout  }  

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
				  $balls = array();  for ($i = 1; $i <= 80; $i++) {      $balls[] = $i;  }    shuffle($balls);  

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
				  $pegs = array ('R','O','Y','G','B','V');  $code = array();  for ($i = 0; $i < 4; $i++) {      $code[] = $pegs[rand(0,5)];  }  

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
				  $guess = str_split(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
				  $noteid = count($masternotes);  $masternotes[] = array('title' => htmlentities(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
___FCKpd___1

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
				  $map = array();  $terrain = array ('plains', 'forest', 'swamp', 'hills', 'mountain', 'water');  for ($row = 0; $row < 20; $row++) {      $map[] = array();      for ($column = 0; $column < 20; $column++) {          $pool = $terrain;          if (isset($map[$row-1])) {              if (isset($map[$row-1][$column-1])) {                  $pool[] = $map[$row-1][$column-1];                  $pool[] = $map[$row-1][$column-1];              }              $pool[] = $map[$row-1][$column];              $pool[] = $map[$row-1][$column];              if (isset($map[$row-1][$column+1])) {                  $pool[] = $map[$row-1][$column+1];                    $pool[] = $map[$row-1][$column+1];              }          }          if (isset($map[$row][$column-1])) {                  $pool[] = $map[$row][$column-1];                  $pool[] = $map[$row][$column-1];          }          shuffle($pool);          $map[$row][$column] = $pool[0];      }  }  

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
				  $faces = array ('Cherry', 'Bar', 'Double Bar', 'Triple Bar', 'Diamond', 'Seven');  

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
				  $payouts = array (      'Bar|Bar|Bar' => '5',      'Double Bar|Double Bar|Double Bar' => '10',      'Triple Bar|Triple Bar|Triple Bar' => '15',      'Cherry|Cherry|Cherry' => '20',      'Seven|Seven|Seven' => '70',      'Diamond|Diamond|Diamond' => '100',  );  

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
				  $wheel1 = array();  foreach ($faces as $face) {      $wheel1[] = $face;  }  $wheel2 = array_reverse($wheel1);  $wheel3 = $wheel1;  

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
				  if (isset($payouts[$result1.'|'.$result2.'|'.$result3])) {      // give the payout  }  

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
				  $balls = array();  for ($i = 1; $i <= 80; $i++) {      $balls[] = $i;  }    shuffle($balls);  

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
				  $unencoded = str_split(preg_replace('/[^a-z]/', '', strtolower(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
				  $noteid = count($masternotes);  $masternotes[] = array('title' => htmlentities(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
___FCKpd___1

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
				  $map = array();  $terrain = array ('plains', 'forest', 'swamp', 'hills', 'mountain', 'water');  for ($row = 0; $row < 20; $row++) {      $map[] = array();      for ($column = 0; $column < 20; $column++) {          $pool = $terrain;          if (isset($map[$row-1])) {              if (isset($map[$row-1][$column-1])) {                  $pool[] = $map[$row-1][$column-1];                  $pool[] = $map[$row-1][$column-1];              }              $pool[] = $map[$row-1][$column];              $pool[] = $map[$row-1][$column];              if (isset($map[$row-1][$column+1])) {                  $pool[] = $map[$row-1][$column+1];                    $pool[] = $map[$row-1][$column+1];              }          }          if (isset($map[$row][$column-1])) {                  $pool[] = $map[$row][$column-1];                  $pool[] = $map[$row][$column-1];          }          shuffle($pool);          $map[$row][$column] = $pool[0];      }  }  

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
				  $faces = array ('Cherry', 'Bar', 'Double Bar', 'Triple Bar', 'Diamond', 'Seven');  

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
				  $payouts = array (      'Bar|Bar|Bar' => '5',      'Double Bar|Double Bar|Double Bar' => '10',      'Triple Bar|Triple Bar|Triple Bar' => '15',      'Cherry|Cherry|Cherry' => '20',      'Seven|Seven|Seven' => '70',      'Diamond|Diamond|Diamond' => '100',  );  

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
				  $wheel1 = array();  foreach ($faces as $face) {      $wheel1[] = $face;  }  $wheel2 = array_reverse($wheel1);  $wheel3 = $wheel1;  

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
				  if (isset($payouts[$result1.'|'.$result2.'|'.$result3])) {      // give the payout  }  

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
				  $balls = array();  for ($i = 1; $i <= 80; $i++) {      $balls[] = $i;  }    shuffle($balls);  

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
				  $pegs = array ('R','O','Y','G','B','V');  $code = array();  for ($i = 0; $i < 4; $i++) {      $code[] = $pegs[rand(0,5)];  }  

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
				  $letters = str_split($link);  foreach ($letters as $key => $letter) {      foreach ($words as $word) {          if ($key == 0) {              $guess =  '.' . substr($link, 1);          } else if ($key+1 == count($letters)) {              $guess =  substr($link, 0, $key) . '.';          } else {              $guess =  substr($link, 0, $key) . '.' . substr($link, $key+1);          }          if (preg_match("/^" . $guess . "$/",$word)) {              $matches[] = $word;          }      }  }  

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['title']), 'body' => htmlentities(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
___FCKpd___1

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
___FCKpd___2

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
___FCKpd___3

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
___FCKpd___4

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
___FCKpd___5

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
___FCKpd___6

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
___FCKpd___7

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['body'])); $words = preg_split('/\s/', $note['body'] . ' ' . $note['title']); foreach ($words as $word) { $word = preg_replace('/[^0-9a-z]/', '', strtolower($word)); if (!in_array($word, $ignore_these_words)) { if (isset($counts[$word])) { $counts[$word][$noteid] = $noteid; } else { $counts[$word] = array($noteid => $noteid); } } }

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
___FCKpd___2

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
___FCKpd___3

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
___FCKpd___4

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
___FCKpd___5

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
___FCKpd___6

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
___FCKpd___7

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['unencoded']))); foreach ($unencoded as $letter) { $lettercount[$letter]++; } arsort($lettercount);

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['title']), 'body' => htmlentities(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
___FCKpd___1

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
___FCKpd___2

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
___FCKpd___3

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
___FCKpd___4

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
___FCKpd___5

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
___FCKpd___6

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
___FCKpd___7

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['body'])); $words = preg_split('/\s/', $note['body'] . ' ' . $note['title']); foreach ($words as $word) { $word = preg_replace('/[^0-9a-z]/', '', strtolower($word)); if (!in_array($word, $ignore_these_words)) { if (isset($counts[$word])) { $counts[$word][$noteid] = $noteid; } else { $counts[$word] = array($noteid => $noteid); } } }

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
___FCKpd___2

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
___FCKpd___3

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
___FCKpd___4

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
___FCKpd___5

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
___FCKpd___6

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
___FCKpd___7

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['guess']); if ($guess == $code) { // the code has been guessed. } else { for ($i = 0;$i < 4;$i++) { if ($guess[$i] == $code[$i]) { // A correct guess } else { // Keep track of the guessed colors, for output later } } }

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['title']), 'body' => htmlentities(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
___FCKpd___1

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
___FCKpd___2

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
___FCKpd___3

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
___FCKpd___4

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
___FCKpd___5

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
___FCKpd___6

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
___FCKpd___7

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['body'])); $words = preg_split('/\s/', $note['body'] . ' ' . $note['title']); foreach ($words as $word) { $word = preg_replace('/[^0-9a-z]/', '', strtolower($word)); if (!in_array($word, $ignore_these_words)) { if (isset($counts[$word])) { $counts[$word][$noteid] = $noteid; } else { $counts[$word] = array($noteid => $noteid); } } }

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
___FCKpd___2

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
___FCKpd___3

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
___FCKpd___4

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
___FCKpd___5

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
___FCKpd___6

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
___FCKpd___7

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['unencoded']))); foreach ($unencoded as $letter) { $lettercount[$letter]++; } arsort($lettercount);

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['title']), 'body' => htmlentities(
PHP 是一種易於使用、易於學習且可以廣泛獲取的編程語言。它非常適合開發在各種遊戲中可以使用的簡單腳本。無論是一個人玩簡單的使用紙和筆的遊戲,還是同一群人玩複雜的桌面角色扮演遊戲,或者任意類型的聯機遊戲,本系列都提供了適合您的內容。本文將在 “可以用 PHP 編寫的 30 個遊戲腳本” 系列的第 1 部分和第 2 部分基礎上,探究可以在各種類型的遊戲中使用的 10 個優秀腳本 — 包括清單管理系統和提示腳本、文字遊戲腳本、圖像處理和諸如基諾之類的遊戲腳本。

在本文中,我們將為角色扮演遊戲構建一個清單管理系統及提示腳本,同時處理 PHP 腳本的交互操作。我們還將構建基於圖像的 ID 卡片生成器並且嘗試用 PHP 執行圖像處理。我們將創建一個撲克牌求值程序、老虎機生成器及博彩銀行,允許您實踐一些更棘手的 PHP 邏輯。我們將通過構建一個複雜的變位詞生成器、解碼器等,進一步處理文字遊戲腳本的複雜邏輯。

這些腳本比 第 1 部分 和 第 2 部分 中的腳本難一些,因為它們將完成更多操作。本文的 代碼歸檔 包含所討論的每個腳本的完整源代碼,並且可以訪問 http://chaoticneutral.net/3d10 查看腳本實際運行情況。

在 第 1 部分 和 第 2 部分 中,我們非常快速地介紹了這些腳本。如果尚未閱讀過第 1 部分和第 2 部分,您應當閱讀前兩個部分,然後再開始閱讀本文。

基本武器清單管理系統

在整合了管理角色統計信息的腳本后,讓我們進一步豐富腳本並且添加一些基本武器清單管理功能。使用此腳本,可以跟蹤耗費的彈藥、燃燒的火把及找到的裝備(參見清單 1)。這裡並沒有嘗試展示您可能找到的所有裝備,我們將只創建兩個輸入欄位 — 一個用於裝備名稱,另一個用於裝備計數:<input name='newitem' /> <input name='newcount' />。在提交腳本后,需要將新裝備添加到武器清單數組中,並且連同角色表一起保存數組。然後遍歷武器清單數組並創建新輸入欄位以保存裝備。


清單 1. 添加一些基本清單管理
				  foreach ($character['inventory'] as $name => $count) {      echo $name . " : <input name='inventory[" . $name . "]' value='" .  $count . "' /><br />";  }  

這些輸入名稱可能看上去有些怪異,但是通過以這種樣式構造名稱,PHP 將自動創建 “inventory” 數組,並且填充了名稱-值對。參閱腳本歸檔以查看如何整合。





簡單提示腳本

在玩 RPG 時記錄一些提示十分有幫助。如果忘記了將重要提示記錄到了哪些位置,提示就沒有那麼有幫助了。讓我們整合一個幫助存儲和找到遊戲提示的腳本。

記錄提示只需要兩個表單欄位:<input name='title' /> <br /> <textarea name='body'> <br />。

與角色表一樣,提示將被添加到數組中,經過序列化並存儲到文本文件中。在保存提示時,您將分析單詞。單詞計數也存儲在同一個文本文件中。為了簡單起見,替換不是字母或數字的內容並且將整個提示小寫(只用於分析):$analyze = preg_replace('/[^0-9a-z\s]/', strtolower($_POST['body']));。然後用空白分隔提示並把提示 ID 放入每個單詞的單詞計數數組。


清單 2. 幫助輕鬆存儲並查找遊戲提示的腳本
___FCKpd___1

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
___FCKpd___2

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
___FCKpd___3

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
___FCKpd___4

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
___FCKpd___5

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
___FCKpd___6

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
___FCKpd___7

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)

POST['body'])); $words = preg_split('/\s/', $note['body'] . ' ' . $note['title']); foreach ($words as $word) { $word = preg_replace('/[^0-9a-z]/', '', strtolower($word)); if (!in_array($word, $ignore_these_words)) { if (isset($counts[$word])) { $counts[$word][$noteid] = $noteid; } else { $counts[$word] = array($noteid => $noteid); } } }

通過嘗試使用測試腳本或者在 代碼歸檔 中查找,您可以查看如何按關鍵字檢索單獨提示或者多個提示。





ID 卡片生成器

如果要玩現代遊戲,為您的角色使用一張 ID 卡片可以給您的朋友留下深刻印象並且給遊戲添加一些現實感。您將整合一些 PHP 圖像處理代碼,這些代碼將允許您創建適合貼膜(lamination)的 ID 卡片圖像。首先,需要一張基本圖像用作空白 ID。我們將使用這張未經過加工的空白 ID 作為示例。


圖 1. 空白示例 ID


需要一張基本表單來收集 ID 卡的欄位(名字、授權、家庭住址、出生日期、頭髮顏色和眼睛顏色)。然後需要把這些值作為字元串傳遞到圖像中。在確定開始文本和停止文本的正確位置時,這其中的一些值將進行檢驗並糾正錯誤的值:imagettftext ( $img , 40 , 0 , 600 , 200 , 0 , "tarzeau_-_OCR-A", $_POST['name'] );。如果一切都正確完成,您應當能夠填充表單並且得到圖 2 中所示的內容。


圖 2. 填寫完的示例 ID


指定的字體附帶在代碼歸檔中,並且源圖像為 300DPI。在某些系統中,使用字體和 ID 卡可能十分棘手,但是腳本歸檔中的源代碼將能夠正確工作。





基於圖像塊(tile)的地圖生成器

早期計算機遊戲使用了圖像塊創建遊戲地圖。如今在某些情況下,仍然使用這種基本的基於圖像塊的方法。讓我們整合一個生成基本地圖的腳本。這張地圖不會非常大,但是我們可以使用相同的原理創建含有不同詳細信息的更大型地圖。首先,創建一些不同的地形類型並且集合一些極為初步的地圖圖像塊以表示每個地形類型。


圖 3. 基本地形類型


現在有了基本地形類型,您可以想象得到接下來需要做什麼:為每一行創建一個地圖圖像塊數組。但是,只隨機獲取地形類型並放入數組中,我們將得到一個不怎麼好的結果。

讓我們製作一個大小為 20 個圖像塊的地圖。在獲取地形類型時,考慮周圍的圖像塊。查看四個最近的已知圖像塊:當前行中的最後一個圖像塊以及當前圖像塊上面緊挨的三個圖像塊。我們可以設置複雜規則來控制如何生成地形,但是現在,從簡單的內容開始:向數組中添加四個最相鄰的圖像塊的地形類型,然後再隨機獲取。添加先前的地形類型的次數越多,獲得相似區域的可能性就越多。結果是類似清單 3 中所示的內容。


清單 3. 地圖圖像塊數組
___FCKpd___2

在擁有地圖數組后,我們將遍歷每行和每列,包括每個地形類型的圖像。嘗試執行測試腳本以查看此腳本將生成哪類地圖。此腳本是沒有任何限制的。我們可以通過將地圖類型多次放入腳本中,為各種地形類型提供不同的權重,並且創建地形類型可以實現的更複雜規則。請一定要大膽實踐。





撲克牌求值程序

我們已經編寫了一個撲克發牌器和 Blackjack 發牌器。讓我們進一步編寫撲克牌求值程序。該程序更加複雜,並且處理如何排序同類牌可能需要花些時間。但是讓腳本查看五張牌並且告訴您點數是否一樣、花色是否一樣等十分簡單。

在查看手中的牌時,有幾種簡單的規則可以應用:

  1. 如果當前牌的花色不同於上一張牌的花色,則沒有同花的五張牌。
  2. 如果任意牌的牌面與任何先前牌的牌面相匹配,則沒有點數一樣的五張牌。
  3. 如果沒有牌匹配,並且 $highcard 減去 $lowcard 剛好等於五,則有點數一樣的五張牌。

準備好這些簡單規則后,應用一個簡單檢查來計算出匹配:

  1. 如果有五張不同的牌面,則沒有匹配。
  2. 如果有四張不同的牌面,則有一對。
  3. 如果有三張不同的牌面,則有兩對或三張相同的牌。
  4. 如果有兩張不同的牌面,則有滿堂紅或四張相同的牌。
  5. 如果只有一張牌面,則已經犯規。

通過查看歸檔中的樣例腳本,查看這些規則如何應用。





老虎機

現代老虎機是複雜的機器,擁有視頻屏幕、多條賠付線(payline)、更多按鈕並且只需拉動更少拉杆。對於本例,我們將模擬一條賠付線的簡單三輪旋轉老虎機。讓我們首先識別轉輪上的各個面。


清單 4. 識別轉輪上的各個面
___FCKpd___3

接下來,確定贏獎結果。贏獎結果可以有許多變形,但是為了舉例,讓我們假定贏獎結果是在一條賠付線上有三個匹配的結果。需要設置贏獎結果與獎金的一些關聯性。您可能會看到類似清單 5 中所示的內容。


清單 5. 贏獎結果和結算獎金
___FCKpd___4

在轉動轉輪時,第一個輪和第三個輪朝一個方向轉動,而第二個轉輪朝另一個方向轉動。記住這個原理后,讓我們設置轉輪。


清單 6. 設置轉輪
___FCKpd___5

在代碼中,我們反轉了數組來設置 $wheel2。我們希望跟蹤各個遊戲中的轉輪位置,但是其餘則非常簡單。每個轉輪至少必須轉一圈,不超過 10 圈。使用模數來模擬滾動轉輪:$result1 = $wheel1[rand(count($wheel1), 10*count($wheel1)) % count($wheel1)];。最後,在 $payouts 中查找結果。


清單 7. 在 $payouts 中查找結果
___FCKpd___6

請注意:這是非常初級的。實際的老虎機要複雜得多,並且結算獎金十分棘手。這只是一次練習。使用腳本歸檔中的代碼並查看是否可以把獎金調整為更合理的金額。





基諾

基諾是 bingo 與樂透的混合體。從 1 到 80 隨機選擇二十個數字,玩家把賭注下到將抽出的數字上(通過取出最多 15 個數字)。基諾獎金迥然不同,但是設置一個腳本來模擬基諾非常簡單,尤其是在我們已經在本系列中執行過類似內容之後。對於初學者,您需要包含從 1 到 80 的數字數組。


清單 8. 包含 1 到 80 的數字數組
___FCKpd___7

在單個文本欄位中輸入您的猜測結果(用逗號分隔)。然後只需從 $balls 數組中選取 20 個數字,並且針對抽取的號碼檢查猜測結果。這是可以輕鬆完成的,並且可以在 代碼歸檔 中看到。可以通過在基諾樣式板中顯示選擇結果來改進腳本。請在熟悉腳本后再嘗試這樣做。





密碼助手

密碼術是在大多數報紙中流行的遊戲,目標是將一個使用置換計算程序編碼的給定短語解碼,類似於在 第 2 部分 中編寫的置換計算程序。讓我們編寫一些程序以使用基本頻率分析將編碼信息解碼。您可以使用同一種方法來幫助解決密碼問題。

頻率分析只是 “對字母進行計數” 的另一種有趣表達。獲取一個未編碼的文本樣例,計算文本中出現特定字母的次數,然後按頻率最高到最低的順序給字母排序。然後對編碼文本執行相同操作。完成時,把兩張字母列表放在一起,然後獲得對解密密鑰的合理猜測。這種方法適用於大型文本塊,但是在處理較短的短語時仍然可以使用這種方法。首先創建兩個文本框:一個用於未編碼的文本,另一個用於密碼。計算未編碼文本中的字母並將數組結果排序。


清單 9. 計算未編碼文本中的字母並將數組結果排序
___FCKpd___8

然後,對編碼文本執行相同操作。在將數組按字母頻率排序后,創建字母圖並使用它們嘗試將文本解碼。如果您特別幸運,文本可以一次解碼成功,但是不要指望它。結果可能是部分解碼的文本 — 這是解出謎題的良好起點。查閱腳本樣例了解更多詳細信息。此腳本有很多改進空間。





策略遊戲(Mastermind)

策略遊戲是一款桌面遊戲(基於較舊的遊戲),玩家必須猜測代碼生成器設置的圓點的順序和顏色。在此版本中,腳本將是代碼生成器,然後您將做出一系列猜測。腳本將告訴您有多少次猜中了正確的顏色和錯誤的位置;以及有多少次猜測是完全正確的。策劃人將使用六種不同顏色的圓點,並且可以重複使用顏色。首先建立如下所示的代碼。


清單 10. 六種不同顏色圓點的數組
___FCKpd___9

接下來,我們需要分析猜測結果(參見清單 11)。猜測結果將被輸入到一個文本欄位中,例如 OOGBVR。


清單 11. 分析猜測結果
___FCKpd___10

查看如何將它全部整合到樣例腳本中。這是一款樂趣橫生的遊戲,可以通過多種方式進行修改。





單詞鏈

您可能曾經玩過這樣一款遊戲,得到一個單詞,然後只更改一個字母就可以得到另一個單詞。通常,這款遊戲的玩法是將一個單詞更改為另一個單詞,就像使用以下單詞鏈將單詞 BIKE 更改為單詞 FATE:BIKE、LIKE、LAKE、LATE、FATE。讓我們使用為縱橫字謎助手創建的一些代碼,創建從一個單詞生成單詞鏈的腳本(參見清單 12)。給定一個單詞,如 BIKE,我們可以創建缺少字母的四個單詞(.IKE、B.KE、BI.E 和 BIK.),可以將這些單詞傳遞給縱橫字謎助手以查找可能的匹配。


清單 12. 通過一個單詞生成單詞鏈
___FCKpd___11

在找到匹配后,我們將對匹配執行相同操作(確保不重複單詞)。重複執行這種邏輯,直到找到所有匹配。我們甚至可以針對每個可能的匹配執行這種方法。這樣做將是十分有用的練習,並且對失控遞歸非常有用。在熟悉樣例腳本后,您應當做這樣一次嘗試。





結束語

我希望 “可以用 PHP 編寫的 30 個遊戲腳本” 這一系列文章可以幫助您開始用 PHP 創建有趣的遊戲腳本。無論您多麼喜歡玩遊戲,都可以使用本系列中提供的簡單實用的程序豐富遊戲經驗。PHP 是執行這些任務的最佳選擇,而且如果您在本文之後繼續鑽研,則在獲得樂趣的同時一定會提高 PHP 編程技巧。(責任編輯:A6)






[火星人 via ] 用 PHP 可以編寫的 30 個遊戲腳本,第 3 部分: 創建 10 個高級腳本已經有198次圍觀

http://www.coctec.com/docs/linux/show-post-68998.html