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

查看所有标签

猜你喜欢:

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

游戏编程中的人工智能技术

游戏编程中的人工智能技术

布克兰德 / 吴祖增 / 清华大学出版社 / 2006-5 / 39.0

《游戏编程中的人工智能技术》是人工智能游戏编程的一本指南性读物,介绍在游戏开发中怎样应用遗传算法和人工神经网络来创建电脑游戏中所需要的人工智能。书中包含了许多实用例子,所有例子的完整源码和可执行程序都能在随书附带的光盘上找到。光盘中还有不少其他方面的游戏开发资料和一个赛车游戏演示软件。 《游戏编程中的人工智能技术》适合遗传算法和人工神经网络等人工智能技术的各行业人员,特别是要实际动手做应用开......一起来看看 《游戏编程中的人工智能技术》 这本书的介绍吧!

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

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具