内容简介:游戏逻辑开发进度:■■■■■■■■□□□□本章结束开发进度:■■■■■■■■■■■■在我们的
游戏逻辑开发进度:■■■■■■■■□□□□
本章结束开发进度:■■■■■■■■■■■■
上一章的答案:
在我们的 $mapData
数组中, 0
就是墙, 1
就是路, canMoveToDirection()
方法主要就是获取方向,计算得出目标坐标,检测一下目标坐标能不能走,所以当数组中是 0
的时候就返回 false
,否则返回 true
。
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
类:
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
类中新增一个常量 DIRECTION
。
Player
类:
const DIRECTION = [self::UP, self::DOWN, self::LEFT, self::RIGHT];
test.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
,开始编写网络对战部分。
当前目录结构:
HideAndSeek ├── app │ ├── Manager │ │ └── Game.php │ └── Model │ ├── Map.php │ └── Player.php ├── composer.json ├── test.php └── vendor ├── autoload.php └── composer
以上所述就是小编给大家介绍的《用Swoole来写个联机对战游戏呀!(四)游戏结束判断》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 用Swoole来写个联机对战游戏呀!(五)联机初始化
- 用Swoole来写个联机对战游戏呀!(三)完善游戏功能
- 用Swoole来写个联机对战游戏呀!(六)游戏匹配机制
- 用Swoole来写个联机对战游戏呀!(八)创建游戏房间
- 从动物森友会聊主机游戏联机原理
- 用Swoole来写个联机对战游戏呀!(二)单机游戏架构
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learning PHP, MySQL, and JavaScript
Robin Nixon / O'Reilly Media / 2009-7-21 / USD 39.99
Learn how to create responsive, data-driven websites with PHP, MySQL, and JavaScript - whether or not you know how to program. This simple, streamlined guide explains how the powerful combination of P......一起来看看 《Learning PHP, MySQL, and JavaScript》 这本书的介绍吧!