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

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

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

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

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

上一章的答案:

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

查看所有标签

猜你喜欢:

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

Google模式

Google模式

Eric Schmidt、Jonathan Rosenberg / 李芳齡 / 天下雜誌出版社 / 2014-11-7 / TWD 420.00

上市即登紐約時報暢銷書、Amazon科技經營排行榜TOP1 未上市即售出美、英、德、日、荷等12國版權 Google創辦人Larry Page專文推薦 第一本由Google領導團隊人首度公開的企業內部運作與思維 Google董事會執行主席艾力克.施密特獨家揭露 Google從崛起到稱霸超過10年的管理與工作秘笈, 以及如何吸引21世紀最搶手的人才-智慧創做者(S......一起来看看 《Google模式》 这本书的介绍吧!

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

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器