用Swoole来写个联机对战游戏呀!(四)游戏结束判断

栏目: PHP · 发布时间: 4年前

内容简介:游戏逻辑开发进度:■■■■■■■■□□□□本章结束开发进度:■■■■■■■■■■■■在我们的

游戏逻辑开发进度:■■■■■■■■□□□□

本章结束开发进度:■■■■■■■■■■■■

上一章的答案:

在我们的 $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() 方法,用来判断游戏是否结束。

  1. Game 类中的 $players 数组保存了玩家的数据。
  2. 两个玩家坐标叠一块就结束啦~

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 文件中,新增代码逻辑让两个电脑对战一次。

  1. 让双方玩家随机行走。
  2. 实时打印游戏地图数据。
  3. 当游戏结束时停止游戏。

提示:每次打印完毕使用 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来写个联机对战游戏呀!(四)游戏结束判断

写了这么久代码,终于有一点点游戏效果了呢。

我们的游戏逻辑开发就到这里了,后面的章节开始就会接入 SwooleVue ,开始编写网络对战部分。

当前目录结构:

HideAndSeek
├── app
│   ├── Manager
│   │   └── Game.php
│   └── Model
│       ├── Map.php
│       └── Player.php
├── composer.json
├── test.php
└── vendor
    ├── autoload.php
    └── composer

用Swoole来写个联机对战游戏呀!(四)游戏结束判断


以上所述就是小编给大家介绍的《用Swoole来写个联机对战游戏呀!(四)游戏结束判断》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

我知道他想看什么

我知道他想看什么

沙建军 / 中信出版社 / 2018-1 / 48.00

社交媒体迅速发展、信息快速迭代、时间碎片化;大数据、智能终端、物联网横空出世;移动支付、网红经济和传统营销失效,这些都让这个时代的媒体、内容、渠道、产品之间的边界越来越模糊,也从根本上改变了营销的逻辑,内容营销从热词变成趋势,变成营销的底层思维。未来一切都是媒体,形式也是内容。 本书作者通过对国内外36个内容营销的新近案例的故事化描述和透彻分析,提出“组织媒介化”“营销内容化”“内容情趣化”......一起来看看 《我知道他想看什么》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具