用Swoole來寫個聯機對戰遊戲呀!(四)遊戲結束判斷

寫程式的趙童鞋發表於2019-04-27

遊戲邏輯開發進度:■■■■■■■■□□□□

本章結束開發進度:■■■■■■■■■■■■

上一章的答案:

在我們的$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來寫個聯機對戰遊戲呀!(四)遊戲結束判斷

相關文章