创建你自己的模拟游戏/数组之旅
在上节课中,我们讲解了如何创建一个函数,如何使用一些PHP内置函数,以及如何处理会话。现在我们将更进一步。
如果你尝试过我们现在设置的小游戏,你就会同意我的观点,它不仅无聊,而且非常非常无聊。现在,你可以点击一个按钮,要么赢得游戏,要么输掉游戏。从大局来看,我们希望我们的角色在不同的地图上四处走动,从一个地方移动到另一个地方,以及在他们死亡之前与敌人战斗或掉入陷阱。
但坦率地说,你还做不到这一点。所以,我们再次退一步,从一个更简单的方法着手——让角色在一个更大的区域内四处走动,然后再遇到找到宝藏或掉入陷阱的可能性。假设我们有一张这样的地图
地图名称:教程地图
地图等级:1(数字越小,离地面越近,数字越大,离地面越深)
W W W W W W W W S E E E E W W W E X E E W W E E E T X W W W W W W W W
S 标记着我们角色在地图上的起始位置。数字 E 代表空地,这意味着角色可以移动到那里。数字 W 代表墙壁;角色不能移动到那个位置。X 代表陷阱,T 代表我们的宝藏。现在我们已经有了更加有趣的游戏。为了让我们的角色拥有更多的移动能力,我们可以使用数据库或数组。由于数据库在某种程度上是一个非常大的数组,我们将从数组开始,这样你就不用担心数据库中出现的所有繁琐问题,然后才能过渡到数据库。
简而言之,数组是一种在同一个地方存放大量信息的方式。数组有两种类型:一维数组和多维数组。我们先讲解一维数组。
最简单的理解数组的方式是将它视为一个项目列表。列表总是从零开始,并按数字递增。我们来看一下我创建的一个名为 path 的简单数组。在 path 中的每个字段,我都存储了关于你可能在那里找到的项目类型的信息(宝藏、墙壁或空地)
<?php $path[0] = "S"; $path[1] = "E"; $path[2] = "E"; $path[3] = "E"; $path[4] = "W"; ?>
如你所见,我们的路径有一个角色的起始位置,三个空地,然后是一堵墙。如果我们尝试使用这个数组来构建任何类型的角色移动,这将非常困难。角色将从位置零开始,能够向前移动最多 3 个空格,然后在到达位置 4 的墙壁时卡住。这个角色唯一的选择就是转身回到起始位置。这样的东西有多无聊?我们希望我们的角色能够向多个方向移动,而不仅仅是向前和向后。这就是多维数组发挥作用的地方。看看这个...
<?php $path[0][0] = "W"; $path[0][1] = "W"; $path[0][2] = "W"; $path[0][3] = "W"; $path[1][0] = "W"; $path[1][1] = "S"; $path[1][2] = "E"; $path[1][3] = "W"; $path[2][0] = "W"; $path[2][1] = "E"; $path[2][2] = "E"; $path[1][3] = "W"; $path[3][0] = "W"; $path[3][1] = "E"; $path[3][2] = "T"; $path[3][3] = "W"; $path[4][0] = "W"; $path[4][1] = "W"; $path[4][2] = "W"; $path[4][3] = "W"; ?>
这看起来熟悉吗?很好!应该很熟悉!这是一个多维数组。我试图将它写出来,以便它看起来与我们上面计划好的地图相似,只是这是一个更小的版本。使用多维数组,你可以一次存储多个坐标。现在我们可以有左右方向以及上下方向。
在多维数组中,我们的角色从我们用 S 标记的位置开始,位于 (1,1)。这种符号 (1,1) 我们称之为坐标。它记录了角色的 x 和 y 位置 (x,y)。
如果这个角色向上移动,我们将从 x 坐标中减去 1。如果他们想向下移动,我们将向 x 坐标中添加 1。如果他们想向左或向右移动,我们将向 y 坐标中添加或减去 1。现在如果角色从 (1,1) 开始,他们向右移动会发生什么?他们会被赋予位置 (1,(1+1)) 或 (1,2)。向上滚动并查看数组。位置 (1,2) 有没有空地?如果有,那么我们希望允许这种移动。如果位置 (1,2) 有墙,那么我们将向角色显示一条错误消息。
现在轮到你来尝试了。写出你需要从角色的起始位置到达宝藏所需的坐标。实际上有几种方法可以做到;你能找到不止一种方法吗?
一旦我们拥有了更大的数组,我们必须在角色从一个地方移动到另一个地方时始终测试这两个坐标,否则我们将无法从迷宫中获取准确的信息。以下是测试数组在特定位置的值的方法。
<?php $x = 0; //first coordinate $y = 0; //second coordinate echo $path[$x][$y]; //now we show the value of the path for the given coordinates ?>
我相信你已经看到了这一点。你可以像测试任何其他变量一样测试数组的值。
<?php $x = 0; $y = 0; if ($path[$x][$y] == "E") { echo "You're on an empty space!"; } else if ($path[$x][$y] == "W") { echo "How did you get stuck in a wall?!?"; } ?>
就是这样!看起来很简单,不是吗?
在本节课中,我们讲解了一维数组和多维数组。为了完成本节课,你需要了解如何为多维数组赋值,如何访问数组中的值,如何显示数组中的值,然后编写 if-else 语句,根据数组中给定位置的值以不同的方式做出响应。
为了使本节课更容易,我包含了一个自定义函数,该函数将地图绘制到屏幕上,并显示角色在移动时的位置。角色以红色绘制,直到你找到宝藏,然后它会变成绿色!
工作版本: character.php -- 我们已经有了足够的功能游戏,你可以自己开始玩了!
源代码: character.txt
自己尝试: character2.txt
本节课帮助我们完成角色移动,该移动基于来自另一个数据源的值。现在我们使用的是我们自己输入的数据,但很快我们将从我们的数据库中获取这些信息。这只是从数据库读取的下一级,它将帮助你了解角色移动的基本原理,然后才能添加 SQL 的复杂性。
现在的问题是:我们可以在玩游戏时更改地图吗?假设,我们希望角色找到宝藏后不是结束游戏,而是进入新地图。这听起来很容易,但地图越多,难度就越大!
你有没有注意到制作自定义地图需要多长时间?我们不想为游戏中所有关卡都这样做。我们需要更快、更强大的东西,这让我们想到了下一节课。
在下一节课中,你将学习如何从文件中动态加载不同的地图文件到地图数组中,而无需将其键入角色页面。这样一来,我们就可以让角色在找到宝藏后转移到另一个地图。此外,我们将创建一个地图编辑器,以便我们可以快速轻松地制作地图文件。
完成这两项工作后,我们就可以继续将所有角色移动添加到数据库表中,直接在数据库中创建地图并保存它们,以及让我们的角色使用梯子在地图等级之间上下移动。