游戏结束判断
游戏逻辑开发进度:■■■■■■■■□□□□
本章结束开发进度:■■■■■■■■■■■■
上一章的答案
在我们的$mapData数组中,0就是墙,1就是路,canMoveToDirection()方法主要就是获取方向,计算得出目标坐标,检测一下目标坐标能不能走,所以当数组中是0的时候就返回false,否则返回true。
Game类:
<?php...class Game{...private function canMoveToDirection($player, $direction){$x = $player->getX();$y = $player->getY();$moveCoor = $this->getMoveCoor($x, $y, $direction);$mapData = $this->gameMap->getMapData();if (!$mapData[$moveCoor[0]][$moveCoor[1]]) {return false;}return true;}private function getMoveCoor($x, $y, $direction){switch ($direction) {case Player::UP:return [--$x, $y];case Player::DOWN:return [++$x, $y];case Player::LEFT:return [$x, --$y];case Player::RIGHT:return [$x, ++$y];}return [$x, $y];}}
增加canMoveToDirection()方法后再次运行test.php文件输出地图数据:

可以看到,即使经过了三次的up操作,寻找者都没有再跑到墙上面去。
游戏结束判断
我们的游戏逻辑开发已经接近尾声了,目前剩下的就是游戏结束时的判断,我们需要在Game类中增加isGameOver()方法,用来判断游戏是否结束。
做题时间
Game类中的$players数组保存了玩家的数据。- 两个玩家坐标叠一块就结束啦~
Game类:
<?php...class Game{...public function isGameOver(){$result = false;$x = -1;$y = -1;$players = array_values($this->players);/* @var Player $player */foreach ($players as $key => $player) {if ($key == 0) {$x = $player->getX();$y = $player->getY();} elseif ($x == $player->getX() && $y == $player->getY()) {$result = true;}}return $result;}}
到这里为止,我们的游戏主体逻辑已经开发完毕了,但不能我说开发完就开发完的嘛,我们必须要实践一下,测试一下整体逻辑有没有问题。这时候又到test.php文件登场了,请童鞋们在test.php文件中,新增代码逻辑让两个电脑对战一次。
做题时间
- 让双方玩家随机行走。
- 实时打印游戏地图数据。
- 当游戏结束时停止游戏。
提示:每次打印完毕使用`usleep()`方法停止一下,否则运算过快可能看不到游戏过程哦。
Player类:
<?php...class Player{...const DIRECTION = [self::UP, self::DOWN, self::LEFT, self::RIGHT];}
为了方便随机选择位置,我们需要在Player类中新增一个常量DIRECTION。
test.php:
<?php...for ($i = 0; $i <= 300; $i++) {$direct = mt_rand(0, 3);$game->playerMove($redId, Player::DIRECTION[$direct]);if ($game->isGameOver()) {$game->printGameMap();echo "game_over" . PHP_EOL;return;}$direct = mt_rand(0, 3);$game->playerMove($blueId, Player::DIRECTION[$direct]);if ($game->isGameOver()) {$game->printGameMap();echo "game_over" . PHP_EOL;return;}//打印移动后战局echo PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL;$game->printGameMap();usleep(200000);}
运行test.php文件就会出现以下输出啦:

游戏效果看上去挺不错的吧?
我们的游戏逻辑开发就到这里了,后面的章节将会简单介绍Swoole、Vue和WebSocket。然后就开始接入Swoole和Vue,开始编写网络对战部分。
本章对应Github Commit:第四章结束
当前目录结构:
HideAndSeek├── app│ ├── Manager│ │ └── Game.php│ └── Model│ ├── Map.php│ └── Player.php├── composer.json├── test.php└── vendor├── autoload.php└── composer
