用Swoole來寫個聯機對戰遊戲呀!(四)遊戲結束判斷
遊戲邏輯開發進度:■■■■■■■■□□□□
本章結束開發進度:■■■■■■■■■■■■
上一章的答案:
在我們的 $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()
方法,用來判斷遊戲是否結束。
-
Game
類中的$players
陣列儲存了玩家的資料。 - 兩個玩家座標疊一塊就結束啦~
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
檔案中,新增程式碼邏輯讓兩個電腦對戰一次。
- 讓雙方玩家隨機行走。
- 實時列印遊戲地圖資料。
- 當遊戲結束時停止遊戲。
提示:每次列印完畢使用 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
和 Vue
,開始編寫網路對戰部分。
當前目錄結構:
HideAndSeek ├── app │├── Manager ││└── Game.php │└── Model │├── Map.php │└── Player.php ├── composer.json ├── test.php └── vendor ├── autoload.php └── composer