- 上一章地址:juejin.im/post/5cc06f…
遊戲邏輯開發進度:■■■■■■■■□□□□
本章結束開發進度:■■■■■■■■■■■■
上一章的答案:
在我們的$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
複製程式碼