成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

25個不錯PHP的游戲編程腳本代碼分享

開發 后端 前端
本文將與大家分享25個不錯PHP游戲編程腳本代碼,使大家開心之余工作編程事半功倍!

簡單的擲骰器

許多游戲和游戲系統都需要骰子。讓我們先從簡單的部分入手:擲一個六面骰子。實際上,滾動一個六面骰子就是從 1 到 6 之間選擇一個隨機數字。在 PHP 中,這十分簡單:echo rand(1,6);。

在許多情況下,這基本上很簡單。但是在處理機率游戲時,我們需要一些更好的實現。PHP 提供了更好的隨機數字生成器:mt_rand()。在不深入研究兩者差別的情況下,可以認為 mt_rand 是一個更快、更好的隨機數字生成器:echo mt_rand(1,6);。如果把該隨機數字生成器放入函數中,則效果會更好。

清單 1. 使用 mt_rand() 隨機數字生成器函數

  1. function roll () {  
  2. return mt_rand(1,6);  
  3. }  
  4. echo roll(); 

然后可以把需要滾動的骰子類型作為參數傳遞給函數。

清單 2. 將骰子類型作為參數傳遞

  1. function roll ($sides) {  
  2. return mt_rand(1,$sides);  
  3. }  
  4. echo roll(6);  // roll a six-sided die  
  5. echo roll(10);  // roll a ten-sided die  
  6. echo roll(20);  // roll a twenty-sided die 

從這里開始,我們可以繼續根據需要一次滾動多個骰子,返回結果數組;也可以一次性滾動多個不同類型的骰子。但是大多數任務都可以使用這個簡單的腳本。

隨機名稱生成器

如果正在運行游戲、編寫故事或者一次性創建大批字符,有時會疲于應付不斷出現的新名字。讓我們看一看可用于解決此問題的一個簡單隨機名稱生成器。首先,讓我們創建兩個簡單數組 — 一個用于名字,一個用于姓氏。

清單 3. 名字和姓氏的兩個簡單數組

  1. $male = array(  
  2. "William",  
  3. "Henry",  
  4. "Filbert",  
  5. "John",  
  6. "Pat",  
  7. );  
  8. $last = array(  
  9. "Smith",  
  10. "Jones",  
  11. "Winkler",  
  12. "Cooper",  
  13. "Cline",  
  14. ); 

然后就可以從每個數組中選擇一個隨機元素:echo $male[array_rand($male)] . ' ' . $last[array_rand($last)];。要一次性提取多個名稱,只需混合數組并根據需要提取。

清單 4. 混合名稱數組

  1. shuffle($male);  
  2. shuffle($last);  
  3. for ($i = 0; $i <= 3; $i++) {  
  4. echo $male[$i] . ' ' . $last[$i];  

基于此基本概念,我們可以創建保存名字和姓氏的文本文件。如果在文本文件的每一行中存放一個名字,則可以輕松地用換行符分隔文件內容以構建源代碼數組。

清單 5. 創建名稱的文本文件

  1. $male = explode('\n'file_get_contents('names.female.txt'));  
  2. $last = explode('\n'file_get_contents('names.last.txt')); 

構建或查找一些好的名字文件(代碼歸檔 中附帶了一些文件),此后我們絕不再需要為名字煩惱。

場景生成器

利用構建名字生成器使用的相同基本原理,我們可以構建場景生成器。此生成器不但在角色扮演游戲中十分有用,而且在需要用到偽隨機環境集合(可用于角色扮演、即興創作、寫作等情況)的情況下也十分有用。我最喜歡的游戲之一,Paranoia 在其 GM Pack 中包括了 “任務混合器(mission blender)”。任務混合器可用于在快速滾動骰子時整合完整任務。讓我們整合自己的場景生成器。

考慮以下場景:您醒來后發現自己迷失于叢林中。您知道自己必須趕去紐約,但是不知道原因。您可以聽到附近的狗叫聲及清晰的敵方搜尋者的聲音。您渾身發冷、不住顫抖,而且沒有武器。該場景中的每一句話都介紹場景的特定方面:

“您醒來后發現自己迷失于叢林中” — 這句話將建立設置。

“您知道自己必須趕去紐約” — 這句話將描述目標。

“您可以聽到狗叫聲” — 這句話將介紹敵人。

“您渾身發冷、不住顫抖,而且沒有武器” — 這句話將添加復雜度。

就像創建名字和姓氏的文本文件一樣,首先分別創建設置、目標、敵人和復雜度的文本文件。代碼歸檔中附帶了樣例文件。在擁有這些文件后,生成場景的代碼與生成名稱的代碼基本相同。

清單 6. 生成場景

  1. $settings = explode("\n"file_get_contents('scenario.settings.txt'));  
  2. $objectives = explode("\n"file_get_contents('scenario.objectives.txt'));  
  3. $antagonists = explode("\n"file_get_contents('scenario.antagonists.txt'));  
  4. $complicati**** = explode("\n"file_get_contents('scenario.complicati****.txt'));  
  5. shuffle($settings);  
  6. shuffle($objectives);  
  7. shuffle($antagonists);  
  8. shuffle($complicati****);  
  9. echo $settings[0] . ' ' . $objectives[0] . ' ' . $antagonists[0] . ' ' 
  10. $complicati****[0] . "\n"

我們可以通過添加新文本文件向場景中添加元素,也可能希望添加多重復雜度。添加到基本文本文件中的內容越多,場景隨時間的變化就越多。

牌組創建器(Deck builder)和裝備(shuffler)

如果您要玩紙牌并且要處理與紙牌相關的腳本,我們需要用裝備中的工具整合一副牌組構建器。首先,讓我們構建一副標準紙牌。需要構建兩個數組 — 一個用于保存同花色的組牌,而另一個用于保存牌面。如果稍后需要添加新組牌或牌類型,則這樣做將獲得很好的靈活性。

清單 7. 構建一副標準撲克牌

  1. $suits = array (  
  2. "Spades""Hearts""Clubs""Diamonds" 
  3. );  
  4. $faces = array (  
  5. "Two""Three""Four""Five""Six""Seven""Eight",  
  6. "Nine""Ten""Jack""Queen""King""Ace" 
  7. ); 

然后構建一副牌數組來保存所有紙牌值。只需使用一對 foreach 循環即可完成此操作。

清單 8. 構建一副牌數組

  1. $deck = array();  
  2. foreach ($suits as $suit) {  
  3. foreach ($faces as $face) {  
  4. $deck[] = array ("face"=>$face"suit"=>$suit);  
  5. }  

在構建了一副撲克牌數組后,我們可以輕松地洗牌并隨機抽出一張牌。

清單 9. 洗牌并隨機抽出一張牌

  1. shuffle($deck);  
  2. $card = array_shift($deck);  
  3. echo $card['face'] . ' of ' . $card['suit']; 

現在,我們就獲得了抽取多副牌或構建多層牌盒(multideck shoe)的捷徑。

勝率計算器:發牌

由于構建撲克牌時會分別跟蹤每張牌的牌面和花色,因此可以通過編程方式利用這副牌來計算得到特定牌的幾率。首先每只手分別抽出五張牌。

清單 10. 每只手抽出五張牌

  1. $hands = array(1 => array(), 2=>array());  
  2. for ($i = 0; $i < 5; $i++) {  
  3. $hands[1][] = implode(" of "array_shift($deck));  
  4. $hands[2][] = implode(" of "array_shift($deck));  

然后可以查看這副牌,看看剩余多少張牌以及抽到特定牌的機率是多少。查看剩余的牌數十分簡單。只需要計算 $deck 數組中包含的元素數。要獲得抽到特定牌的機率,我們需要一個函數來遍歷整副牌并估算其余牌以查看是否匹配。

清單 11. 計算抽到特定牌的幾率

  1. function calculate_odds($draw$deck) {  
  2. $remaining = count($deck);  
  3. $odds = 0;  
  4. foreach ($deck as $card) {  
  5. if (  ($draw['face'] == $card['face'] && $draw['suit'] ==  
  6. $card['suit'] ) ||  
  7. ($draw['face'] == '' && $draw['suit'] == $card['suit'] ) ||  
  8. ($draw['face'] == $card['face'] && $draw['suit'] == '' ) ) {  
  9. $odds++;  
  10. }  
  11. }  
  12. return $odds . ' in ' $remaining;  

現在可以選出嘗試抽出的牌。為了簡單起見,傳入看上去類似某張牌的數組。我們可以查找特定的一張牌。

清單 12. 查找指定的一張牌

  1. $draw = array('face' => 'Ace''suit' => 'Spades');  
  2. echo implode(" of "$draw) . ' : ' . calculate_odds($draw$deck); 

或者可以查找指定牌面或花色的牌。

清單 13. 查找指定牌面或花色的牌

  1. $draw = array('face' => '''suit' => 'Spades');  
  2. $draw = array('face' => 'Ace''suit' => ''); 

#p#

簡單的撲克發牌器

現在已經得到牌組構建器和一些工具,可以幫助計算出抽出特定卡的機率,我們可以整合一個真正簡單的發牌器來進行發牌。出于本例的目的,我們將構建一個可以抽出五張牌的發牌器。發牌器將從整副牌中提供五張牌。使用數字指定需要放棄哪些牌,并且發牌器將用一副牌中的其他牌替換這些牌。我們無需指定發牌限制或特殊規則,但是您可能會發現這些是非常有益的個人經驗。

如上一節所示,生成并洗牌,然后每只手五張牌。按數組索引顯示這些牌,以便可以指定返回哪些牌。您可以使用表示要替換哪些牌的復選框來完成此操作。

清單 14. 使用復選框表示要替換的牌

  1. foreach ($hand as $index =>$card) {  
  2. echo " . $index . "]'>  
  3. " . $card['face'] . ' of ' . $card['suit'] . "";  

然后,計算輸入 array $_POST['card'],查看哪些牌已被選擇用于替換。

清單 15. 計算輸入

  1. $i = 0;  
  2. while ($i < 5) {  
  3. if (isset($_POST['card'][$i])) {  
  4. $hand[$i] = array_shift($deck);  
  5. }  

使用此腳本,您可以嘗試找到處理特定一組牌的最佳方法。

Hangman 游戲

Hangman 實質上是一款猜字游戲。給定單詞的長度,我們使用有限的幾次機會猜這個單詞。如果猜出了出現在該單詞中的一個字母,則填充該字母出現的所有位置。在猜錯若干次(通常為六次)后,您就輸了比賽。要構建一個簡陋的 hangman 游戲,我們需要從單詞列表開始。現在,讓我們把單詞列表制作成一個簡單的數組。

清單 16. 創建單詞列表

  1. $words = array (  
  2. "giants",  
  3. "triangle",  
  4. "particle",  
  5. "birdhouse",  
  6. "minimum",  
  7. "flood" 
  8. ); 

使用前面介紹的技術,我們可以把這些單詞移動到外部單詞列表文本文件中,然后根據需要導入。

在得到單詞列表后,需要隨機選出一個單詞,將每個字母顯示為空,然后開始猜測。我們需要在每次進行猜測時跟蹤正確和錯誤的猜測。只需序列化猜測數組并在每次猜測時傳遞它們,就可實現跟蹤目的。如果需要阻止人們通過查看頁面源代碼僥幸猜對,則需要執行一些更安全的操作。

構建數組以保存字母和正確/錯誤的猜測。對于正確的猜測,我們將用字母作為鍵并用句點作為值填充數組。

清單 17. 構建保存字母和猜測結果的數組

  1. $letters = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',  
  2. 'p','q','r','s','t','u','v','w','x','y','z');  
  3. $right = array_fill_keys($letters'.');  
  4. $wrong = array(); 

現在需要一些代碼來評估猜測并在完成猜字游戲的過程中顯示該單詞。

清單 18. 評估猜測并顯示進度

  1. if (stristr($word$guess)) {  
  2. $show = '';  
  3. $right[$guess] = $guess;  
  4. $wordletters = str_split($word);  
  5. foreach ($wordletters as $letter) {  
  6. $show .= $right[$letter];  
  7. }  
  8. else {  
  9. $show = '';  
  10. $wrong[$guess] = $guess;  
  11. if (count($wrong) == 6) {  
  12. $show = $word;  
  13. else {  
  14. foreach ($wordletters as $letter) {  
  15. $show .= $right[$letter];  
  16. }  
  17. }  

在源代碼歸檔 中,可以看到如何序列化猜測數組并將該數組從一次猜測傳遞到另一次猜測中。

縱橫字謎助手

我知道這樣做不合適,但是有時在玩縱橫拼字謎時,您不得不費勁地找出以 C 開頭并以 T 結尾、包含五個字母的單詞。使用為 Hangman 游戲構建的相同單詞列表,我們可以輕松地搜索符合某個模式的單詞。首先,找到一種傳輸單詞的方法。為了簡單起見,用句點替換缺少的字母:$guess = "c...t";。由于正則表達式將把句點處理為單個字符,因此我們可以輕松地遍歷單詞列表以查找匹配。

清單 19. 遍歷單詞列表

  1. foreach ($words as $word) {  
  2. if (preg_match("/^" . $_POST['guess'] . "$/",$word)) {  
  3. echo $word . "\n";  
  4. }  

根據單詞列表的質量及猜測的準確度,我們應當能夠得到合理的單詞列表以用于可能的匹配。您必須自己決定 “表示 ‘不按規則玩’ 的由五個字母組成的單詞” 的謎底是 “chest” 還是 “cheat”。

米德里比斯

米德里比斯是一款文字游戲,玩家在游戲中得到一個簡短的故事并用同一類型的不同單詞替換主要類型的單詞,從而創建同一個故事的更無聊的新版本。閱讀以下文本:“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.” 開始用其他單詞標記替換單詞類型。開始和結束標記帶有下劃線用于阻止意外的字符串匹配。

清單 20. 用單詞標記替換單詞類型

  1. $text = "I was _VERB_ing in the _PLACE_ when I found a _NOUN_.  
  2. I _VERB_ed in, and _VERB_ed too much _NOUN_.  I had to go to the _PLACE_."; 

接下來,創建幾個基本單詞列表。對于本例,我們也不會做得太復雜。

清單 21. 創建幾個基本單詞列表

  1. $verbs = array('pump''jump''walk''swallow''crawl''wail''roll');  
  2. $places = array('park''hospital''arctic''ocean''grocery''basement',  
  3. 'attic''sewer');  
  4. $nouns = array('water''lake''spit''foot''worm',  
  5. 'dirt''river''wankel rotary engine'); 

現在可以重復地評估文本來根據需要替換標記。

清單 22. 評估文本

  1. while (preg_match("/(_VERB_)|(_PLACE_)|(_NOUN_)/"$text$matches)) {  
  2. switch ($matches[0]) {  
  3. case '_VERB_' :  
  4. shuffle($verbs);  
  5. $text = preg_replace($matches[0], current($verbs), $text, 1);  
  6. break;  
  7. case '_PLACE_' :  
  8. shuffle($places);  
  9. $text = preg_replace($matches[0], current($places), $text, 1);  
  10. break;  
  11. case '_NOUN_' :  
  12. shuffle($nouns);  
  13. $text = preg_replace($matches[0], current($nouns), $text, 1);  
  14. break;  
  15. }  
  16. }  
  17. echo $text

很明顯,這是一個簡單而粗糙的示例。單詞列表越精確,并且花在基本文本上的時間越多,結果就越好。我們已經使用了文本文件創建名稱列表及基本單詞列表。使用相同原則,我們可以創建按類型劃分的單詞列表并使用這些單詞列表創建更加變化多端的米德里比斯游戲。

樂透機

全部選中樂透的六個正確號碼 —— 退一步說 —— 在統計學上是不可能的。不過,許多人仍然花錢去玩,而且如果您喜歡號碼,則查看趨勢圖可能很有趣。讓我們構建一個腳本,該腳本將允許跟蹤贏獎號碼并在列表中提供選擇次數最少的 6 個號碼。

(免責聲明:這不會幫助您中樂透獎,因此請不要花錢購買獎券。這只是為了娛樂)。

把贏獎的樂透選擇保存到文本文件中。用逗號分隔各個號碼并把每組號碼放在單獨一行中。使用換行符分隔文件內容并使用逗號分隔行后,可以得到類似清單 23 的內容。

清單 23. 把選擇的贏獎樂透保存到文本文件中

  1. $picks = array(  
  2. array('6''10''18''21''34''40'),  
  3. array('2''8''13''22''30''39'),  
  4. array('3''9''14''25''31''35'),  
  5. array('11''12''16''24''36''37'),  
  6. array('4''7''17''26''32''33')  
  7. ); 

很明顯,這不足以成為繪制統計數據的基本文件。但是它是一個開端,并且足以演示基本原理。

設置一個基本數組以保存選擇范圍。例如,如果選擇 1 到 40 之間(例如,$numbers = array_fill(1,40,0);)的號碼,則遍歷我們的選擇,遞增相應的匹配值。

清單 24. 遍歷選擇

  1. foreach ($picks as $pick) {  
  2. foreach ($pick as $number) {  
  3. $numbers[$number]++;  
  4. }  

最后,根據值將號碼排序。此操作應當會把最少選擇的號碼放在數組的前部。

清單 25. 根據值將號碼排序

  1. asort($numbers);  
  2. $pick = array_slice($numbers,0,6,true);  
  3. echo implode(','array_keys($pick)); 

通過有規律地向包含中獎號碼列表的文本文件添加實際的樂透中獎號碼,可以發現選號的長期趨勢。查看某些號碼的出現頻率十分有趣。

原文鏈接:http://www.cnblogs.com/aiyuchen/archive/2011/02/08/1949792.html

【編輯推薦】

  1. 解析PHP中的XML數據
  2. PHP開發者工資翻倍需做到的5件事
  3. PHP企業級應用之常見緩存技術深入解讀
  4. 9大最有潛力PHP開源項目:Android開發居首
  5. PHP與Java在Web開發方面的比較
責任編輯:陳貽新 來源: 李惟的博客
相關推薦

2021-12-23 09:50:46

Python游戲腳本

2011-07-14 10:07:19

PHP

2009-06-16 11:53:21

Java試題

2022-07-22 10:06:17

JavaScript代碼

2011-07-07 15:26:28

PHP編程習慣

2011-07-07 15:36:51

PHP

2011-07-07 15:48:22

PHP編程習慣

2011-07-15 10:27:21

PHP

2011-07-07 17:24:28

PHP

2011-07-07 17:27:54

PHP

2012-01-10 12:48:52

Java

2015-10-10 14:40:36

編程游戲

2015-09-21 11:45:10

PHP編程效率要點

2023-05-04 23:59:46

React開發工具

2020-01-03 10:24:06

Python 開發編程語言

2009-04-02 09:08:00

下拉菜單腳本導航設計CSS

2014-07-08 09:27:24

SQLSERVER腳本

2012-05-15 01:38:18

編程編程技巧編程觀點

2009-11-24 13:26:17

2009-11-24 14:52:45

PHP動態多文件上傳
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久专区 | 欧美精品福利 | 久久躁日日躁aaaaxxxx | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 日韩欧美久久精品 | 国产精品久久久久久久久久久久久久 | 成年人网站免费视频 | 久久久久久国产精品免费免费狐狸 | 一区二区三区视频在线观看 | 亚洲日韩中文字幕一区 | 国产一区二区三区视频免费观看 | 国产婷婷综合 | 欧美日韩国产在线观看 | 色天堂视频 | 欧美4p| 青久草视频 | 91国在线观看 | 国产91丝袜在线播放 | 一区二区三区小视频 | www狠狠爱com | 日韩电影中文字幕在线观看 | 国产精品美女久久久av超清 | 97精品超碰一区二区三区 | 国产中文视频 | 狠狠干影院 | av网站在线看 | 亚洲精品久久久蜜桃网站 | 91久久精品一区二区二区 | av在线一区二区三区 | 国产美女视频一区 | 91久色| 992人人草 | 欧美三级在线 | 在线视频91 | 天天操网| 羞羞的视频免费在线观看 | 欧美精品一区二区免费 | 别c我啊嗯国产av一毛片 | 精品一区二区在线视频 | 国产黄色在线 | 欧美一区二区三区视频在线播放 |