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

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

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

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

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

上一章的答案:

在我们的 $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来写个联机对战游戏呀!(四)游戏结束判断》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Cracking the Coding Interview

Cracking the Coding Interview

Gayle Laakmann McDowell / CareerCup / 2015-7-1 / USD 39.95

Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hund......一起来看看 《Cracking the Coding Interview》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

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

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具