当前位置:  开发笔记 > 编程语言 > 正文

25个不错PHP的游戏编程脚本代码分享

本文介绍了25个不错PHP的游戏编程脚本代码,包括简单的掷骰器、随机名称生成器、场景生成器、牌组创建器(Deckbuilder)和装备(shuffler)、简单的扑克发牌器、Hangman游戏、纵横字谜助手、米德里比斯、乐透机等。希望能够对你的工作有所帮助。简单的掷骰器">

   本文介绍了25个不错PHP的游戏编程脚本代码,包括简单的掷骰器、随机名称生成器、场景生成器、牌组创建器(Deck builder)和装备(shuffler)、简单的扑克发牌器、Hangman游戏、纵横字谜助手、米德里比斯、乐透机等。希望能够对你的工作有所帮助。

  简单的掷骰器

  许多游戏和游戏系统都需要骰子。让我们先从简单的部分入手:掷一个六面骰子。实际上,滚动一个六面骰子就是从 1 到 6 之间选择一个随机数字。在 PHP 中,这十分简单:echo rand(1,6);。

  在许多情况下,这基本上很简单。但是在处理机率游戏时,我们需要一些更好的实现。PHP 提供了更好的随机数字生成器:mt_rand()。在不深入研究两者差别的情况下,可以认为 mt_rand 是一个更快、更好的随机数字生成器:echo mt_rand(1,6);。如果把该随机数字生成器放入函数中,则效果会更好。

  清单 1. 使用 mt_rand() 随机数字生成器函数

  function roll () {

  return mt_rand(1,6);

  }

  echo roll();

  然后可以把需要滚动的骰子类型作为参数传递给函数。

  清单 2. 将骰子类型作为参数传递

  function roll ($sides) {

  return mt_rand(1,$sides);

  }

  echo roll(6); // roll a six-sided die

  echo roll(10); // roll a ten-sided die

  echo roll(20); // roll a twenty-sided die

  从这里开始,我们可以继续根据需要一次滚动多个骰子,返回结果数组;也可以一次性滚动多个不同类型的骰子。但是大多数任务都可以使用这个简单的脚本。

  随机名称生成器

  如果正在运行游戏、编写故事或者一次性创建大批字符,有时会疲于应付不断出现的新名字。让我们看一看可用于解决此问题的一个简单随机名称生成器。首先,让我们创建两个简单数组 — 一个用于名字,一个用于姓氏。

  清单 3. 名字和姓氏的两个简单数组

  $male = array(

  "William",

  "Henry",

  "Filbert",

  "John",

  "Pat",

  );

  $last = array(

  "Smith",

  "Jones",

  "Winkler",

  "Cooper",

  "Cline",

  );

  然后就可以从每个数组中选择一个随机元素:echo $male[array_rand($male)] . ' ' . $last[array_rand($last)];。要一次性提取多个名称,只需混合数组并根据需要提取。

  清单 4. 混合名称数组

  shuffle($male);

  shuffle($last);

  for ($i = 0; $i <= 3; $i++) {

  echo $male[$i] . ' ' . $last[$i];

  }

  基于此基本概念,我们可以创建保存名字和姓氏的文本文件。如果在文本文件的每一行中存放一个名字,则可以轻松地用换行符分隔文件内容以构建源代码数组。

  清单 5. 创建名称的文本文件

  $male = explode('\n', file_get_contents('names.female.txt'));

  $last = explode('\n', file_get_contents('names.last.txt'));

  构建或查找一些好的名字文件(代码归档 中附带了一些文件),此后我们绝不再需要为名字烦恼。

  场景生成器

  利用构建名字生成器使用的相同基本原理,我们可以构建场景生成器。此生成器不但在角色扮演游戏中十分有用,而且在需要用到伪随机环境集合(可用于角 色扮演、即兴创作、写作等情况)的情况下也十分有用。我最喜欢的游戏之一,Paranoia 在其 GM Pack 中包括了 “任务混合器(mission blender)”。任务混合器可用于在快速滚动骰子时整合完整任务。让我们整合自己的场景生成器。

  考虑以下场景:您醒来后发现自己迷失于丛林中。您知道自己必须赶去纽约,但是不知道原因。您可以听到附近的狗叫声及清晰的敌方搜寻者的声音。您浑身发冷、不住颤抖,而且没有武器。该场景中的每一句话都介绍场景的特定方面:

  “您醒来后发现自己迷失于丛林中” — 这句话将建立设置。

  “您知道自己必须赶去纽约” — 这句话将描述目标。

  “您可以听到狗叫声” — 这句话将介绍敌人。

  “您浑身发冷、不住颤抖,而且没有武器” — 这句话将添加复杂度。

  就像创建名字和姓氏的文本文件一样,首先分别创建设置、目标、敌人和复杂度的文本文件。代码归档中附带了样例文件。在拥有这些文件后,生成场景的代码与生成名称的代码基本相同。

  清单 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('scenario.complicati****.txt'));

  shuffle($settings);

  shuffle($objectives);

  shuffle($antagonists);

  shuffle($complicati****);

  echo $settings[0] . ' ' . $objectives[0] . ' ' . $antagonists[0] . ' '

  . $complicati****[0] . "\n";

  我们可以通过添加新文本文件向场景中添加元素,也可能希望添加多重复杂度。添加到基本文本文件中的内容越多,场景随时间的变化就越多。

  牌组创建器(Deck builder)和装备(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 ($suits as $suit) {

  foreach ($faces as $face) {

  $deck[] = array ("face"=>$face, "suit"=>$suit);

  }

  }

  在构建了一副扑克牌数组后,我们可以轻松地洗牌并随机抽出一张牌。

  清单 9. 洗牌并随机抽出一张牌

  shuffle($deck);

  $card = array_shift($deck);

  echo $card['face'] . ' of ' . $card['suit'];

  现在,我们就获得了抽取多副牌或构建多层牌盒(multideck shoe)的捷径。

  胜率计算器:发牌

  由于构建扑克牌时会分别跟踪每张牌的牌面和花色,因此可以通过编程方式利用这副牌来计算得到特定牌的几率。首先每只手分别抽出五张牌。

  清单 10. 每只手抽出五张牌

  $hands = array(1 => array(), 2=>array());

  for ($i = 0; $i <5; $i++) {

  $hands[1][] = implode(" of ", array_shift($deck));

  $hands[2][] = implode(" of ", array_shift($deck));

  }

  然后可以查看这副牌,看看剩余多少张牌以及抽到特定牌的机率是多少。查看剩余的牌数十分简单。只需要计算 $deck 数组中包含的元素数。要获得抽到特定牌的机率,我们需要一个函数来遍历整副牌并估算其余牌以查看是否匹配。

  清单 11. 计算抽到特定牌的几率

  function calculate_odds($draw, $deck) {

  $remaining = count($deck);

  $odds = 0;

  foreach ($deck as $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');

  echo implode(" of ", $draw) . ' : ' . calculate_odds($draw, $deck);

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

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

  $draw = array('face' => '', 'suit' => 'Spades');

  $draw = array('face' => 'Ace', 'suit' => '');

  简单的扑克发牌器

  现在已经得到牌组构建器和一些工具,可以帮助计算出抽出特定卡的机率,我们可以整合一个真正简单的发牌器来进行发牌。出于本例的目的,我们将构建一 个可以抽出五张牌的发牌器。发牌器将从整副牌中提供五张牌。使用数字指定需要放弃哪些牌,并且发牌器将用一副牌中的其他牌替换这些牌。我们无需指定发牌限 制或特殊规则,但是您可能会发现这些是非常有益的个人经验。

  如上一节所示,生成并洗牌,然后每只手五张牌。按数组索引显示这些牌,以便可以指定返回哪些牌。您可以使用表示要替换哪些牌的复选框来完成此操作。

  清单 14. 使用复选框表示要替换的牌

  foreach ($hand as $index =>$card) {

  echo " . $index . "]'> <>

  " . $card['face'] . ' of ' . $card['suit'] . "";

  }

  然后,计算输入 array $_POST['card'],查看哪些牌已被选择用于替换。

  清单 15. 计算输入

  $i = 0;

  while ($i <5) {

  if (isset($_POST['card'][$i])) {

  $hand[$i] = array_shift($deck);

  }

  }

  使用此脚本,您可以尝试找到处理特定一组牌的最佳方法。


推荐阅读
  • 树莓派 4 HDMI 音频输出问题求解:无声音解决方案探讨 ... [详细]
  • 《Offer冲刺:剑指Offer学习心得与经验分享》 ... [详细]
  • 《思归乐》译文与原文赏析:唐代诗人元稹的诗意解读 ... [详细]
  • 大数据应用实例:电视收视率分析企业项目实操第二篇
    本文继续探讨大数据在电视收视率分析中的应用,详细介绍了如何在CentOS系统中进行防火墙管理。针对CentOS 6.5及更早版本,提供了具体的命令操作步骤,包括停止防火墙服务和禁用防火墙启动。此外,还深入讨论了这些操作对数据传输和系统安全的影响,为实际项目实施提供了宝贵的技术参考。 ... [详细]
  • 如何在华为手机上配置应用后台运行模式? ... [详细]
  • 石大师教你解决电脑黑屏问题:专业重装系统方法详解
    石大师教你解决电脑黑屏问题:专业重装系统方法详解 ... [详细]
  • Spring Security 认证模块的项目构建与初始化
    本文详细介绍了如何构建和初始化Spring Security认证模块的项目。首先,通过创建一个分布式Maven聚合工程,该工程包含四个模块,分别为core、browser(用于演示)、app等,以构成完整的SeehopeSecurity项目。在项目构建过程中,还涉及日志生成机制,确保能够输出关键信息,便于调试和监控。 ... [详细]
  • Navicat for MariaDB 15:可视化数据洞察与智能图表功能详解
    Navicat for MariaDB 15:可视化数据洞察与智能图表功能详解 ... [详细]
  • 轻食餐饮行业进阶指南:从初学者到实现可持续运营
    根据美团外卖的数据,2020年下半年轻食外卖订单量同比增长了50%,同时在线轻食商家的数量也显著增加。本文旨在为轻食餐饮行业的初学者提供全面的进阶指南,从市场趋势分析、产品开发到营销策略,帮助创业者实现可持续运营。通过深入探讨行业动态和成功案例,本文将助力轻食餐饮企业在竞争激烈的市场中脱颖而出。 ... [详细]
  • 如何在IDEA中安装和配置反编译插件以提高代码审查效率
    在 IntelliJ IDEA 中提升代码审查效率的一种方法是安装和配置反编译插件。首先,进入 IDEA 的设置界面,然后导航到插件管理部分。接下来,搜索 "ideaJad" 插件并进行安装。安装完成后,重启 IDEA 以确保插件生效。这将帮助你在审查二进制文件时更加高效地查看源代码。 ... [详细]
  • 本周的工作与生活经历颇为波折。原本决心坚决要与妻子离婚,但令人意外的是,她突然提出和好。这种突如其来的变化让人感到困惑和不解,不知是自己的态度过于软弱还是她的行为背后有其他原因。尽管她再次表示愿意修复关系,但她的冷漠和不关心依旧让我感到失望和无奈。 ... [详细]
  • 织梦系统多条件联动筛选功能详细教程及删除操作指南
    多条件联动筛选功能广泛应用于图片展示、装修设计、机械设备和在线商城等场景,通常筛选条件应聚焦于用户最关心的要素,而非涵盖所有可能的选项。在DedeCMS中,多条件筛选的PHP开发并未内置删除已选条件的功能,但通过理解PHP筛选与JS筛选的不同机制,实现这一功能相对简单且易于操作。 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
  • 优化后的标题:数据网格视图(DataGridView)在应用程序中的高效应用与优化策略
    在应用程序中,数据网格视图(DataGridView)的高效应用与优化策略至关重要。本文探讨了多种优化方法,包括但不限于:1)通过合理的数据绑定提升性能;2)利用虚拟模式处理大量数据,减少内存占用;3)在格式化单元格内容时,推荐使用CellParsing事件,以确保数据的准确性和一致性。此外,还介绍了如何通过自定义列类型和优化渲染过程,进一步提升用户体验和系统响应速度。 ... [详细]
  • QQ坦白说功能详解:身份标签全解析与应用指南
    如今,许多用户正在体验手机QQ的坦白说功能,许多人对这一功能中的身份标签选择感到好奇。本文将详细介绍可用的身份标签及其具体应用,帮助大家更好地理解和使用坦白说功能。如果你对坦白说还不熟悉,欢迎点击链接了解更多详细信息。 ... [详细]
author-avatar
紫竹林素食坊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有