解析PHP編寫的25個(gè)游戲腳本(2)_PHP教程
推薦:解析php生成靜態(tài)頁(yè)面的辦法首先說原理。某駝查了那么多資料,發(fā)現(xiàn)不管用什么方法,原理都是一樣的。就是用程序讀取相應(yīng)的數(shù)據(jù)來替換模版中的變量,然后生成靜態(tài)頁(yè)。php中主要用到的就是要用到fread()和fwirte()。而靜態(tài)頁(yè)面生成了之后,就會(huì)牽扯到修改的問題。這里可以用到正則匹配的
清單 13. 查找指定牌面或花色的牌
$draw = array('face' => '', 'suit' => 'Spades'); $draw = array('face' => 'Ace', 'suit' => ''); |
簡(jiǎn)單的撲克發(fā)牌器
現(xiàn)在已經(jīng)得到牌組構(gòu)建器和一些工具,可以幫助計(jì)算出抽出特定卡的機(jī)率,我們可以整合一個(gè)真正簡(jiǎn)單的發(fā)牌器來進(jìn)行發(fā)牌。出于本例的目的,我們將構(gòu)建一個(gè)可以抽出五張牌的發(fā)牌器。發(fā)牌器將從整副牌中提供五張牌。使用數(shù)字指定需要放棄哪些牌,并且發(fā)牌器將用一副牌中的其他牌替換這些牌。我們無需指定發(fā)牌限制或特殊規(guī)則,但是您可能會(huì)發(fā)現(xiàn)這些是非常有益的個(gè)人經(jīng)驗(yàn)。
如上一節(jié)所示,生成并洗牌,然后每只手五張牌。按數(shù)組索引顯示這些牌,以便可以指定返回哪些牌。您可以使用表示要替換哪些牌的復(fù)選框來完成此操作
。
清單 14. 使用復(fù)選框表示要替換的牌
foreach ($hand as $index =>$card) { echo "<input type='checkbox' name='card[" . $index . "]'> " . $card['face'] . ' of ' . $card['suit'] . "<br />"; } |
然后,計(jì)算輸入 array $_POST['card'],查看哪些牌已被選擇用于替換。
清單 15. 計(jì)算輸入
$i = 0; while ($i < 5) { if (isset($_POST['card'][$i])) { $hand[$i] = array_shift($deck); } } |
使用此腳本,您可以嘗試找到處理特定一組牌的最佳方法。
Hangman 游戲
Hangman 實(shí)質(zhì)上是一款猜字游戲。給定單詞的長(zhǎng)度,我們使用有限的幾次機(jī)會(huì)猜這個(gè)單詞。如果猜出了出現(xiàn)在該單詞中的一個(gè)字母,則填充該字母出現(xiàn)的所有位置。在猜錯(cuò)若干次(通常為六次)后,您就輸了比賽。要構(gòu)建一個(gè)簡(jiǎn)陋的 hangman 游戲,我們需要從單詞列表開始。現(xiàn)在,讓我們把單詞列表制作成一個(gè)簡(jiǎn)單的數(shù)組。
清單 16. 創(chuàng)建單詞列表
$words = array ( "giants", "triangle", "particle", "birdhouse", "minimum", "flood" ); |
使用前面介紹的技術(shù),我們可以把這些單詞移動(dòng)到外部單詞列表文本文件中,然后根據(jù)需要導(dǎo)入。
在得到單詞列表后,需要隨機(jī)選出一個(gè)單詞,將每個(gè)字母顯示為空,然后開始猜測(cè)。我們需要在每次進(jìn)行猜測(cè)時(shí)跟蹤正確和錯(cuò)誤的猜測(cè)。只需序列化猜測(cè)數(shù)組并在每次猜測(cè)時(shí)傳遞它們,就可實(shí)現(xiàn)跟蹤目的。如果需要阻止人們通過查看頁(yè)面源代碼僥幸猜對(duì),則需要執(zhí)行一些更安全的操作。
構(gòu)建數(shù)組以保存字母和正確/錯(cuò)誤的猜測(cè)。對(duì)于正確的猜測(cè),我們將用字母作為鍵并用句點(diǎn)作為值填充數(shù)組。
清單 17. 構(gòu)建保存字母和猜測(cè)結(jié)果的數(shù)組
$letters = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', 'p','q','r','s','t','u','v','w','x','y','z'); $right = array_fill_keys($letters, '.'); $wrong = array(); |
現(xiàn)在需要一些代碼來評(píng)估猜測(cè)并在完成猜字游戲的過程中顯示該單詞。
清單 18. 評(píng)估猜測(cè)并顯示進(jìn)度
if (stristr($word, $guess)) { $show = ''; $right[$guess] = $guess; $wordletters = str_split($word); foreach ($wordletters as $letter) { $show .= $right[$letter]; } } else { $show = ''; $wrong[$guess] = $guess; if (count($wrong) == 6) { $show = $word; } else { foreach ($wordletters as $letter) { $show .= $right[$letter]; } } } |
在源代碼歸檔 中,可以看到如何序列化猜測(cè)數(shù)組并將該數(shù)組從一次猜測(cè)傳遞到另一次猜測(cè)中。
縱橫字謎助手
我知道這樣做不合適,但是有時(shí)在玩縱橫拼字謎時(shí),您不得不費(fèi)勁地找出以 C 開頭并以 T 結(jié)尾、包含五個(gè)字母的單詞。使用為 Hangman 游戲構(gòu)建的相同單詞列表,我們可以輕松地搜索符合某個(gè)模式的單詞。首先,找到一種傳輸單詞的方法。為了簡(jiǎn)單起見,用句點(diǎn)替換缺少的字母:$guess = "c...t";。由于正則表達(dá)式將把句點(diǎn)處理為單個(gè)字符,因此我們可以輕松地遍歷單詞列表以查找匹配。
清單 19. 遍歷單詞列表
foreach ($words as $word) { if (preg_match("/^" . $_POST['guess'] . "$/",$word)) { echo $word . "<br />\n"; } } |
根據(jù)單詞列表的質(zhì)量及猜測(cè)的準(zhǔn)確度,我們應(yīng)當(dāng)能夠得到合理的單詞列表以用于可能的匹配。您必須自己決定 “表示 ‘不按規(guī)則玩’ 的由五個(gè)字母組成的單詞” 的謎底是 “chest” 還是 “cheat”。
米德里比斯
米德里比斯是一款文字游戲,玩家在游戲中得到一個(gè)簡(jiǎn)短的故事并用同一類型的不同單詞替換主要類型的單詞,從而創(chuàng)建同一個(gè)故事的更無聊的新版本。閱讀以下文本:“I was walking in the park when I found a lake. I jumped in and swallowed too much water. I had to go to the hospital.” 開始用其他單詞標(biāo)記替換單詞類型。開始和結(jié)束標(biāo)記帶有下劃線用于阻止意外的字符串匹配。
清單 20. 用單詞標(biāo)記替換單詞類型
$text = "I was _VERB_ing in the _PLACE_ when I found a _NOUN_. I _VERB_ed in, and _VERB_ed too much _NOUN_. I had to go to the _PLACE_."; |
接下來,創(chuàng)建幾個(gè)基本單詞列表。對(duì)于本例,我們也不會(huì)做得太復(fù)雜。
清單 21. 創(chuàng)建幾個(gè)基本單詞列表
$verbs = array('pump', 'jump', 'walk', 'swallow', 'crawl', 'wail', 'roll'); $places = array('park', 'hospital', 'arctic', 'ocean', 'grocery', 'basement', 'attic', 'sewer'); $nouns = array('water', 'lake', 'spit', 'foot', 'worm', 'dirt', 'river', 'wankel rotary engine'); |
現(xiàn)在可以重復(fù)地評(píng)估文本來根據(jù)需要替換標(biāo)記。
清單 22. 評(píng)估文本
while (preg_match("/(_VERB_)|(_PLACE_)|(_NOUN_)/", $text, $matches)) { switch ($matches[0]) { case '_VERB_' : shuffle($verbs); $text = preg_replace($matches[0], current($verbs), $text, 1); break; case '_PLACE_' : shuffle($places); $text = preg_replace($matches[0], current($places), $text, 1); break; case '_NOUN_' : shuffle($nouns); $text = preg_replace($matches[0], current($nouns), $text, 1); break; } } echo $text; |
很明顯,這是一個(gè)簡(jiǎn)單而粗糙的示例。單詞列表越精確,并且花在基本文本上的時(shí)間越多,結(jié)果就越好。我們已經(jīng)使用了文本文件創(chuàng)建名稱列表及基本單詞列表。使用相同原則,我們可以創(chuàng)建按類型劃分的單詞列表并使用這些單詞列表創(chuàng)建更加變化多端的米德里比斯游戲。
樂透機(jī)
全部選中樂透的六個(gè)正確號(hào)碼 —— 退一步說 —— 在統(tǒng)計(jì)學(xué)上是不可能的。不過,許多人仍然花錢去玩,而且如果您喜歡號(hào)碼,則查看趨勢(shì)圖可能很有趣。讓我們構(gòu)建一個(gè)腳本,該腳本將允許跟蹤贏獎(jiǎng)號(hào)碼并在列表中提供選擇次數(shù)最少的 6 個(gè)號(hào)碼。
(免責(zé)聲明:這不會(huì)幫助您中樂透獎(jiǎng),因此請(qǐng)不要花錢購(gòu)買獎(jiǎng)券。這只是為了娛樂)。
把贏獎(jiǎng)的樂透選擇保存到文本文件中。用逗號(hào)分隔各個(gè)號(hào)碼并把每組號(hào)碼放在單獨(dú)一行中。使用換行符分隔文件內(nèi)容并使用逗號(hào)分隔行后,可以得到類似清單 23 的內(nèi)容。
清單 23. 把選擇的贏獎(jiǎng)樂透保存到文本文件中
$picks = array( array('6', '10', '18', '21', '34', '40'), array('2', '8', '13', '22', '30', '39'), array('3', '9', '14', '25', '31', '35'), array('11', '12', '16', '24', '36', '37'), array('4', '7', '17', '26', '32', '33') ); |
很明顯,這不足以成為繪制統(tǒng)計(jì)數(shù)據(jù)的基本文件。但是它是一個(gè)開端,并且足以演示基本原理。
設(shè)置一個(gè)基本數(shù)組以保存選擇范圍。例如,如果選擇 1 到 40 之間(例如,$numbers = array_fill(1,40,0);)的號(hào)碼,則遍歷我們的選擇,遞增相應(yīng)的匹配值。
清單 24. 遍歷選擇
foreach ($picks as $pick) { foreach ($pick as $number) { $numbers[$number]++; } } |
最后,根據(jù)值將號(hào)碼排序。此操作應(yīng)當(dāng)會(huì)把最少選擇的號(hào)碼放在數(shù)組的前部。
清單 25. 根據(jù)值將號(hào)碼排序
asort($numbers); $pick = array_slice($numbers,0,6,true); echo implode(',', array_keys($pick)); |
通過有規(guī)律地向包含中獎(jiǎng)號(hào)碼列表的文本文件添加實(shí)際的樂透中獎(jiǎng)號(hào)碼,可以發(fā)現(xiàn)選號(hào)的長(zhǎng)期趨勢(shì)。查看某些號(hào)碼的出現(xiàn)頻率十分有趣。
分享:淺談微軟對(duì)PHP支持的改進(jìn) 及其它一些胡言亂語(yǔ)這里有一份我覺得值得推薦給大家的幻燈片(下載鏈接)。這個(gè)幻燈片是不久前舉辦的WordCamp China 2009上微軟王超群的演講,演講主題是《熟悉的陌生人:微軟對(duì)PHP的新支持使WordPress在IIS7上雄起》。WordCamp是業(yè)界著名的PHP大會(huì),不過我這里推薦這個(gè)幻燈片
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-解析PHP編寫的25個(gè)游戲腳本(2)。