25个PHP游戏编程脚本代码.docx
- 文档编号:10044674
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:11
- 大小:52.79KB
25个PHP游戏编程脚本代码.docx
《25个PHP游戏编程脚本代码.docx》由会员分享,可在线阅读,更多相关《25个PHP游戏编程脚本代码.docx(11页珍藏版)》请在冰点文库上搜索。
25个PHP游戏编程脚本代码
25个PHP游戏编程脚本代码
清单1.简单的掷骰器
许多游戏和游戏系统都需要骰子。
让我们先从简单的部分入手:
掷一个六面骰子。
实际上,滚动一个六面骰子就是从1到6之间选择一个随机数字。
在PHP中,这十分简单:
echorand(1,6);。
在许多情况下,这基本上很简单。
但是在处理机率游戏时,我们需要一些更好的实现。
PHP提供了更好的随机数字生成器:
mt_rand()。
在不深入研究两者差别的情况下,可以认为mt_rand是一个更快、更好的随机数字生成器:
echomt_rand(1,6);。
如果把该随机数字生成器放入函数中,则效果会更好。
清单1.使用mt_rand()随机数字生成器函数
functionroll(){
returnmt_rand(1,6);
}
echoroll();
然后可以把需要滚动的骰子类型作为参数传递给函数。
清单2.将骰子类型作为参数传递
functionroll($sides){
returnmt_rand(1,$sides);
}
echoroll(6);//rollasix-sideddie
echoroll(10);//rollaten-sideddie
echoroll(20);//rollatwenty-sideddie
从这里开始,我们可以继续根据需要一次滚动多个骰子,返回结果数组;也可以一次性滚动多个不同类型的骰子。
但是大多数任务都可以使用这个简单的脚本。
随机名称生成器
如果正在运行游戏、编写故事或者一次性创建大批字符,有时会疲于应付不断出现的新名字。
让我们看一看可用于解决此问题的一个简单随机名称生成器。
首先,让我们创建两个简单数组一个用于名字,一个用于姓氏。
清单3.名字和姓氏的两个简单数组
$male=array(
"William",
"Henry",
"Filbert",
"John",
"Pat",
);
$last=array(
"Smith",
"Jones",
"Winkler",
"Cooper",
"Cline",
);
境集合(可用于角色扮演、即兴创作、写作等情况)的情况下也十分有用。
我最喜欢的游戏之一,Paranoia在其GMPack中包括了任务混合器(missionblender)。
任务混合器可用于在快速滚动骰子时整合完整任务。
让我们整合自己的场景生成器。
考虑以下场景:
您醒来后发现自己迷失于丛林中。
您知道自己必须赶去纽约,但是不知道原因。
您可以听到附近的狗叫声及清晰的敌方搜寻者的声音。
您浑身发冷、不住颤抖,而且没有武器。
该场景中的每一句话都介绍场景的特定方面:
您醒来后发现自己迷失于丛林中这句话将建立设置。
您知道自己必须赶去纽约这句话将描述目标。
您可以听到狗叫声这句话将介绍敌人。
您浑身发冷、不住颤抖,而且没有武器这句话将添加复杂度。
就像创建名字和姓氏的文本文件一样,首先分别创建设置、目标、敌人和复杂度的文本文件。
代码归档中附带了样例文件。
在拥有这些文件后,生成场景的代码与生成名称的代码基本相同。
清单6.生成场景
$settings=explode("\n",file_get_contents('scenario.settings.txt'));
$objectives=explode("\n",file_get_contents('scenario.objectives.txt'));
$antagonists=explode("\n",file_get_contents('scenario.antagonists.txt'));
$complicati****=explode("\n",file_get_contents('plicati****.txt'));
shuffle($settings);
shuffle($objectives);
shuffle($antagonists);
shuffle($complicati****);
echo$settings[0].''.$objectives[0].''.$antagonists[0].''
.$complicati****[0]."br/\n";
我们可以通过添加新文本文件向场景中添加元素,也可能希望添加多重复杂度。
添加到基本文本文件中的内容越多,场景随时间的变化就越多。
牌组创建器(Deckbuilder)和装备(shuffler)
如果您要玩纸牌并且要处理与纸牌相关的脚本,我们需要用装备中的工具整合一副牌组构建器。
首先,让我们构建一副标准纸牌。
需要构建两个数组一个用于保存同花色的组牌,而另一个用于保存牌面。
如果稍后需要添加新组牌或牌类型,则这样做将获得很好的灵活性。
清单7.构建一副标准扑克牌
$suits=array(
"Spades","Hearts","Clubs","Diamonds"
);
$faces=array(
"Two","Three","Four","Five","Six","Seven","Eight",
"Nine","Ten","Jack","Queen","King","Ace" );
然后构建一副牌数组来保存所有纸牌值。
只需使用一对foreach循环即可完成此操作。
清单8.构建一副牌数组
$deck=array();
foreach($suitsas$suit){
foreach($facesas$face){
$deck[]=array("face"=$face,"suit"=$suit);
}
}
在构建了一副扑克牌数组后,我们可以轻松地洗牌并随机抽出一张牌。
清单9.洗牌并随机抽出一张牌
shuffle($deck);
$card=array_shift($deck);
echo$card['face'].'of'.$card['suit'];
现在,我们就获得了抽取多副牌或构建多层牌盒(multideckshoe)的捷径。
胜率计算器:
发牌
由于构建扑克牌时会分别跟踪每张牌的牌面和花色,因此可以通过编程方式利用这副牌来计算得到特定牌的几率。
首先每只手分别抽出五张牌。
清单10.每只手抽出五张牌
$hands=array(1=array(),2=array());
for($i=0;$i5;$i++){
$hands[1][]=implode("of",array_shift($deck));
$hands[2][]=implode("of",array_shift($deck));
}
然后可以查看这副牌,看看剩余多少张牌以及抽到特定牌的机率是多少。
查看剩余的牌数十分简单。
只需要计算$deck数组中包含的元素数。
要获得抽到特定牌的机率,我们需要一个函数来遍历整副牌并估算其余牌以查看是否匹配。
清单11.计算抽到特定牌的几率
functioncalculate_odds($draw,$deck){
$remaining=count($deck);
$odds=0;
foreach($deckas$card){
if(($draw['face']==$card['face']&&$draw['suit']==
$card['suit'])||
($draw['face']==''&&$draw['suit']==$card['suit'])||
($draw['face']==$card['face']&&$draw['suit']=='')){
$odds++;
}
}
return$odds.'in'$remaining;
}
现在可以选出尝试抽出的牌。
为了简单起见,传入看上去类似某张牌的数组。
我们可以查找特定的一张牌。
清单12.查找指定的一张牌
$draw=array('face'='Ace','suit'='Spades');
echoimplode("of",$draw).':
'.calculate_odds($draw,$deck);
或者可以查找指定牌面或花色的牌。
清单13.查找指定牌面或花色的牌
$draw=array('face'='','suit'='Spades');
$draw=array('face'='Ace','suit'='');
简单的扑克发牌器
现在已经得到牌组构建器和一些工具,可以帮助计算出抽出特定卡的机率,我们可以整合一个真正简单的发牌器来进行发牌。
出于本例的目的,我们将构建一个可以抽出五张牌的发牌器。
发牌器将从整副牌中提供五张牌。
使用数字指定需要放弃哪些牌,并且发牌器将用一副牌中的其他牌替换这些牌。
我们无需指定发牌限制或特殊规则,但是您可能会发现这些是非常有益的个人经验。
如上一节所示,生成并洗牌,然后每只手五张牌。
按数组索引显示这些牌,以便可以指定返回哪些牌。
您可以使用表示要替换哪些牌的复选框来完成此操作。
清单14.使用复选框表示要替换的牌
foreach($handas$index=$card){
echo"inputtype='checkbox'name='card[".$index."]'
".$card['face'].'of'.$card['suit']."br/";
}
然后,计算输入array$_POST['card'],查看哪些牌已被选择用于替换。
清单15.计算输入
$i=0;
while($i5){
if(isset($_POST['card'][$i])){
$hand[$i]=array_shift($deck);
}
}
使用此脚本,您可以尝试找到处理特定一组牌的最佳方法。
Hangman游戏
Hangman实质上是一款猜字游戏。
给定单词的长度,我们使用有限的几次机会猜这个单词。
如果猜出了出现在该单词中的一个字母,则填充该字母出现的所有位置。
在猜错若干次(通常为六次)后,您就输了比赛。
要构建一个简陋的hangman游戏,我们需要从单词列表开始。
现在,让我们把单词列表制作成一个简单的数组。
清单16.创建单词列表
$words=array(
"giants",
"triangle",
"particle",
"birdhouse",
"minimum",
"flood"
);
使用前面介绍的技术,我们可以把这些单词移动到外部单词列表文本文件中,然后根据需要导入。
在得到单词列表后,需要随机选出一个单词,将每个字母显示为空,然后开始猜测。
我们需要在每次进行猜测时跟踪正确和错误的猜测。
只需序列化猜测数组并在每次猜测时传递它们,就可实现跟踪目的。
如果需要阻止人们通过查看页面源代码侥幸猜对,则需要执行一些更安全的操作。
构建数组以保存字母和正确/错误的猜测。
对于正确的猜测,我们将用字母作为键并用句点作为值填充数组。
清单17.构建保存字母和猜测结果的数组
$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();
现在需要一些代码来评估猜测并在完成猜字游戏的过程中显示该单词。
清单18.评估猜测并显示进度
if(stristr($word,$guess)){
$show='';
$right[$guess]=$guess;
$wordletters=str_split($word);
foreach($wordlettersas$letter){
$show.=$right[$letter];
}
}else{
$show='';
$wrong[$guess]=$guess;
if(count($wrong)==6){
$show=$word;
}else{
foreach($wordlettersas$letter){
$show.=$right[$letter];
}
}
}
在源代码归档中,可以看到如何序列化猜测数组并将该数组从一次猜测传递到另一次猜测中。
纵横字谜助手
我知道这样做不合适,但是有时在玩纵横拼字谜时,您不得不费劲地找出以C开头并以T结尾、包含五个字母的单词。
使用为Hangman游戏构建的相同单词列表,我们可以轻松地搜索符合某个模式的单词。
首先,找到一种传输单词的方法。
为了简单起见,用句点替换缺少的字母:
$guess="c...t";。
由于正则表达式将把句点处理为单个字符,因此我们可以轻松地遍历单词列表以查找匹配。
清单19.遍历单词列表
foreach($wordsas$word){
if(preg_match("/^".$_POST['guess']."$/",$word)){
echo$word."br/\n";
}
}
根据单词列表的质量及猜测的准确度,我们应当能够得到合理的单词列表以用于可能的匹配。
您必须自己决定表示不按规则玩的由五个字母组成的单词的谜底是chest还是cheat。
米德里比斯
米德里比斯是一款文字游戏,玩家在游戏中得到一个简短的故事并用同一类型的不同单词替换主要类型的单词,从而创建同一个故事的更无聊的新版本。
阅读以下文本:
IwaswalkingintheparkwhenIfoundalake.Ijumpedinandswallowedtoomuchwater.Ihadtogotothehospital.开始用其他单词标记替换单词类型。
开始和结束标记带有下划线用于阻止意外的字符串匹配。
清单20.用单词标记替换单词类型
$text="Iwas_VERB_inginthe_PLACE_whenIfounda_NOUN_.
I_VERB_edin,and_VERB_edtoomuch_NOUN_.Ihadtogotothe_PLACE_.";
接下来,创建几个基本单词列表。
对于本例,我们也不会做得太复杂。
清单21.创建几个基本单词列表
$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','wankelrotaryengine');
现在可以重复地评估文本来根据需要替换标记。
清单22.评估文本
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;
很明显,这是一个简单而粗糙的示例。
单词列表越精确,并且花在基本文本上的时间越多,结果就越好。
我们已经使用了文本文件创建名称列表及基本单词列表。
使用相同原则,我们可以创建按类型划分的单词列表并使用这些单词列表创建更加变化多端的米德里比斯游戏。
乐透机
全部选中乐透的六个正确号码退一步说在统计学上是不可能的。
不过,许多人仍然花钱去玩,而且如果您喜欢号码,则查看趋势图可能很有趣。
让我们构建一个脚本,该脚本将允许跟踪赢奖号码并在列表中提供选择次数最少的6个号码。
(免责声明:
这不会帮助您中乐透奖,因此请不要花钱购买奖券。
这只是为了娱乐)。
把赢奖的乐透选择保存到文本文件中。
用逗号分隔各个号码并把每组号码放在单独一行中。
使用换行符分隔文件内容并使用逗号分隔行后,可以得到类似清单23的内容。
清单23.把选择的赢奖乐透保存到文本文件中
$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')
);
很明显,这不足以成为绘制统计数据的基本文件。
但是它是一个开端,并且足以演示基本原理。
设置一个基本数组以保存选择范围。
例如,如果选择1到40之间(例如,$numbers=array_fill(1,40,0);)的号码,则遍历我们的选择,递增相应的匹配值。
清单24.遍历选择
foreach($picksas$pick){
foreach($pickas$number){
$numbers[$number]++;
}
}
最后,根据值将号码排序。
此操作应当会把最少选择的号码放在数组的前部。
清单25.根据值将号码排序
asort($numbers);
$pick=array_slice($numbers,0,6,true);
echoimplode(',',array_keys($pick));
通过有规律地向包含中奖号码列表的文本文件添加实际的乐透中奖号码,可以发现选号的长期趋势。
查看某些号码的出现频率十分有趣。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 25 PHP 游戏 编程 脚本 代码