游戏结束判断
游戏逻辑开发进度:■■■■■■■■□□□□
本章结束开发进度:■■■■■■■■■■■■
上一章的答案
在我们的$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