内容简介:游戏逻辑开发进度:■■■■■■■■□□□□本章结束开发进度:■■■■■■■■■■■■在我们的
游戏逻辑开发进度:■■■■■■■■□□□□
本章结束开发进度:■■■■■■■■■■■■
上一章的答案:
在我们的 $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来写个联机对战游戏呀!(二)单机游戏架构
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python 3面向对象编程
[加]Dusty Phillips(达斯帝•菲利普斯) / 肖鹏、常贺、石琳 / 电子工业出版社 / 2015-6 / 79.00元
Python 是一种面向对象的解释型语言,面向对象是其非常重要的特性。《Python 3面向对象编程》通过Python 的数据结构、语法、设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念和原则。 《Python 3面向对象编程》不是Python 的入门书籍,适合具有Python 基础经验的开发人员阅读。如果你拥有其他面向对象语言的经验,你会更容易理解......一起来看看 《Python 3面向对象编程》 这本书的介绍吧!