完成一个井字棋Tic-Tac-Toe游戏,这是一个两人玩的游戏,也称为○×棋,两人轮流在印有3*3九格方盘上划“×”或“○”字, 谁先把三个同一记号排成横线、直线、斜线, 即是胜者。
时间: 2024-10-29 17:16:58 浏览: 12
函数:Tic-Tac-Toe游戏-人机对战井字棋.rar_happygrl_python程序_tic tac toe_井字棋py
5星 · 资源好评率100%
要完成一个井字棋(Tic- **游戏目标**:两名玩家轮流在一个3x3的棋盘上放置自己的符号(通常是"X"和"O")。第一个成功将自己的三个符号连成一条线(横向、纵向或对角线)的玩家获胜。
- **初始设置**:棋盘初始化为空,玩家"X"先手。
### 类和属性
1. **`self.Board`**:存储当前游戏状态的1x9列表,初始为空格。
2. **`self.EmptyCells`**:包含棋盘上空单元格索引的列表,初始为[0, 1, 2, 3, 4, 5, 6, 7, 8]。
3. **`self.Turn`**:表示当前轮到哪个玩家,初始为"X"。
4. **`self.Winner`**:表示获胜者,初始为`None`。
5. **`self.StatesX` 和 `self.StatesO`**:分别保存"X"和"O"的棋盘状态列表,每个状态为一个长度为9的字符串。
### 主要函数
1. **`RandomTurn(self)`**:
- 查看棋盘上的空方格,随机选择一个位置填充当前玩家的符号。
- 更新`self.Board`和相关属性。
2. **`HumanTurn(self)`**:
- 提示用户输入一个数字(0-8),验证输入有效性。
- 如果输入有效且方格为空,更新`self.Board`。
- 如果方格已被占用,提示用户重新输入。
3. **`Update(self)`**:
- 更新`self.EmptyCells`以反映当前棋盘状态。
- 根据当前玩家,保存当前棋盘状态到`self.StatesX`或`self.StatesO`。
- 切换玩家。
- 检查游戏是否结束,并更新`self.Winner`。
4. **`HumanVsRandom(self)`**:
- 实现人机对弈的主要逻辑。
- 每轮打印棋盘和当前玩家。
- 调用`HumanTurn()`或`RandomTurn()`。
- 打印获胜者或平局结果。
5. **`IsGameOver(self)`**:
- 检查所有行、列和对角线,判断是否有玩家获胜。
- 检查棋盘是否已满,判断是否平局。
- 更新`self.Winner`。
### 示例代码结构
```python
class TicTacToe:
def __init__(self):
self.Board = [' '] * 9
self.EmptyCells = list(range(9))
self.Turn = 'X'
self.Winner = None
self.StatesX = []
self.StatesO = []
def __str__(self):
return f"{self.Board[0]} | {self.Board[1]} | {self.Board[2]}\n" \
f"{self.Board[3]} | {self.Board[4]} | {self.Board[5]}\n" \
f"{self.Board[6]} | {self.Board[7]} | {self.Board[8]}\n"
def RandomTurn(self):
import random
if not self.EmptyCells:
return
position = random.choice(self.EmptyCells)
self.Board[position] = self.Turn
self.Update()
def HumanTurn(self):
while True:
try:
position = int(input("请输入一个数字 (0-8): "))
if position in self.EmptyCells:
self.Board[position] = self.Turn
self.Update()
break
else:
print("该位置已被占用,请重新输入!")
except ValueError:
print("无效输入,请输入一个数字 (0-8)!")
def Update(self):
self.EmptyCells = [i for i, cell in enumerate(self.Board) if cell == ' ']
state_str = ''.join(self.Board)
if self.Turn == 'X':
self.StatesX.append(state_str)
else:
self.StatesO.append(state_str)
self.Turn = 'O' if self.Turn == 'X' else 'X'
self.IsGameOver()
def HumanVsRandom(self):
while not self.Winner and self.EmptyCells:
print(self)
print(f"当前轮到: {self.Turn}")
if self.Turn == 'X':
self.HumanTurn()
else:
self.RandomTurn()
print(self)
if self.Winner == 'Tie':
print("平局!")
else:
print(f"获胜者是: {self.Winner}")
def IsGameOver(self):
win_conditions = [(0, 1, 2), (3, 4, 5), (6, 7, 8),
(0, 3, 6), (1, 4, 7), (2, 5, 8),
(0, 4, 8), (2, 4, 6)]
for condition in win_conditions:
if all(self.Board[i] == self.Turn for i in condition):
self.Winner = self.Turn
return
if not self.EmptyCells:
self.Winner = 'Tie'
if __name__ == "__main__":
game = TicTacToe()
game.HumanVsRandom()
```
通过上述代码,您可以实现一个人机对弈的井字棋游戏。希望这对您有所帮助!
阅读全文