当前位置: 面试刷题>> 飞行棋 (经典算法题500道)
### 题目描述
**飞行棋游戏模拟**
在飞行棋游戏中,四名玩家轮流掷骰子(通常是一个六面骰子,每面数字为1到6),并根据掷出的点数在棋盘上移动他们的棋子。棋盘通常是一个环形的,包括多个格子,每个格子可能包含特殊的奖励或惩罚效果(如:直接前进到某一点、后退几步、停留在原地等)。游戏的目标是第一个将所有棋子都移动到终点的玩家获胜。
为了简化问题,我们假设棋盘是一个线性的,包含40个格子(包括起点和终点),终点位于第40格。棋子在掷出6时可以额外掷一次骰子(即“连掷”),并且不考虑特殊格子效果。
请编写一个程序,该程序能够模拟四名玩家(玩家A、B、C、D)的飞行棋游戏过程,并输出第一个完成所有棋子到达终点的玩家名称。
### 示例代码
#### PHP 示例
```php
dice = new Dice();
}
public function play() {
$positions = array_fill(0, 4, [0, 0, 0, 0]); // 假设每个玩家有4个棋子
$finished = [false, false, false, false];
while (true) {
foreach ($this->players as $index => $player) {
if (!$finished[$index]) {
for ($i = 0; $i < 4; $i++) {
$roll = $this->dice->roll();
$positions[$index][$i] = ($positions[$index][$i] + $roll) % $this->boardSize;
if ($positions[$index][$i] == $this->boardSize - 1) {
// 棋子到达终点
if ($this->allReached($positions[$index])) {
echo "玩家 {$player} 获胜!\n";
return;
}
$positions[$index][$i] = 0; // 重置到起点准备下一轮
}
if ($roll == 6) {
// 连掷
$additionalRoll = $this->dice->roll();
$positions[$index][$i] = ($positions[$index][$i] + $additionalRoll) % $this->boardSize;
if ($positions[$index][$i] == $this->boardSize - 1) {
if ($this->allReached($positions[$index])) {
echo "玩家 {$player} 获胜!\n";
return;
}
$positions[$index][$i] = 0;
}
}
}
}
}
}
}
private function allReached($playerPositions) {
foreach ($playerPositions as $pos) {
if ($pos != 0) {
return false;
}
}
return true;
}
}
$game = new Game();
$game->play();
?>
```
#### Python 示例
```python
import random
class Game:
def __init__(self):
self.players = ['A', 'B', 'C', 'D']
self.board_size = 40
def roll_dice(self):
return random.randint(1, 6)
def play(self):
positions = [[0] * 4 for _ in range(4)] # 4 players, each with 4 pieces
finished = [False] * 4
while True:
for index, player in enumerate(self.players):
if not finished[index]:
for i in range(4):
roll = self.roll_dice()
positions[index][i] = (positions[index][i] + roll) % self.board_size
if positions[index][i] == self.board_size - 1:
if all(pos == 0 for pos in positions[index]):
print(f"玩家 {player} 获胜!")
return
positions[index][i] = 0 # Reset to start for next round
if roll == 6:
additional_roll = self.roll_dice()
positions[index][i] = (positions[index][i] + additional_roll) % self.board_size
if positions[index][i] == self.board_size - 1:
if all(pos == 0 for pos in positions[index]):
print(f"玩家 {player} 获胜!")
return
positions[index][i] = 0
# Start the game
game = Game()
game.play()
```
#### JavaScript 示例
```javascript
class Dice {
roll() {
return Math.floor(Math.random() * 6) + 1;
}
}
class Game {
constructor() {
this.players = ['A', 'B', 'C', 'D'];
this.dice = new Dice();
this.boardSize = 40;
}
play() {
const positions = Array.from({ length: 4 }, () => Array(4).fill(0));
const finished = Array(4).fill(false);
while (true) {
for (let [index, player] of this.players.entries()) {
if (!finished[index]) {
for (let i = 0; i < 4; i++) {
let roll = this.dice.roll();
positions[index][i] = (positions[index][i] + roll) % this.boardSize;
if (positions[index][i] === this.boardSize - 1) {
if (positions[index].every(pos => pos === 0)) {
console.log(`玩家 ${player} 获胜!`);
return;
}
positions[index][i] = 0;
}
if (roll === 6) {
let additionalRoll = this.dice.roll();
positions[index][i] = (positions[index][i] + additionalRoll) % this.boardSize;
if (positions[index][i] === this.boardSize - 1) {
if (positions[index].every(pos => pos === 0)) {
console.log(`玩家 ${player} 获胜!`);
return;
}
positions[index][i] = 0;
}
}
}
}
}
}
}
}
const game = new Game();
game.play();
```
以上代码均实现了飞行棋游戏的基本逻辑,但请注意,为了简化,这些示例没有考虑棋盘上的特殊格子效果,并且棋盘被简化为线性。在实际应用中,可以根据需求增加这些功能。