解析PHP編寫的25個(gè)游戲腳本(2)_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:解析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è)幻燈片

      共2頁(yè)上一頁(yè)12下一頁(yè)
      來源:模板無憂//所屬分類:PHP教程/更新時(shí)間:2009-10-06
      相關(guān)PHP教程