复杂python五子棋游戏
时间: 2023-08-29 11:05:28 浏览: 88
好的,下面是一个复杂的五子棋游戏的 Python 代码,它包括了人机对战和人人对战两种模式,以及一个简单的 AI 策略。
```python
import os
board = {} # 棋盘
player = 'X' # 当前玩家
game_mode = '' # 游戏模式
is_game_over = False # 游戏是否结束
def print_board():
"""打印棋盘"""
os.system('cls' if os.name == 'nt' else 'clear') # 清除终端屏幕
print(' A B C D E F G H')
print(' +---+---+---+---+---+---+---+---+')
for y in range(1, 9):
row = str(y) + '|'
for x in range(1, 9):
row += ' ' + (board.get((x, y)) or ' ') + ' |'
print(row)
print(' +---+---+---+---+---+---+---+---+')
def get_input():
"""获取用户输入"""
while True:
try:
if game_mode == 'PVP':
input_str = input(f"请 {player} 输入坐标(例如 A1):")
else:
input_str = input(f"请 {player} 输入坐标(例如 A1),或输入 h 获取帮助:")
if input_str == 'h':
print("坐标示例:A1 表示第一行第一列,D5 表示第五行第四列。")
continue
x = ord(input_str[0].upper()) - 64
y = int(input_str[1])
if x in range(1, 9) and y in range(1, 9):
if (x, y) not in board:
return x, y
else:
print("该位置已经有棋子了,请重新输入。")
else:
print("坐标不合法,请重新输入。")
except Exception as e:
print(e)
def check_win(x, y):
"""检查是否获胜"""
directions = [(0, 1), (1, 0), (1, 1), (-1, 1)]
for dx, dy in directions:
count = 1
for i in range(1, 5):
if (x + i * dx, y + i * dy) in board and board[(x + i * dx, y + i * dy)] == player:
count += 1
else:
break
for i in range(1, 5):
if (x - i * dx, y - i * dy) in board and board[(x - i * dx, y - i * dy)] == player:
count += 1
else:
break
if count >= 5:
return True
return False
def get_ai_move():
"""AI 的下棋策略"""
for y in range(1, 9):
for x in range(1, 9):
if (x, y) not in board:
board[(x, y)] = 'O'
if check_win(x, y):
del board[(x, y)]
return x, y
del board[(x, y)]
for y in range(1, 9):
for x in range(1, 9):
if (x, y) not in board:
board[(x, y)] = 'X'
if check_win(x, y):
board[(x, y)] = 'O'
return x, y
del board[(x, y)]
return 5, 5
def play():
"""开始游戏"""
global player, is_game_over
while not is_game_over:
print_board()
if game_mode == 'PVP':
x, y = get_input()
else:
if player == 'X':
x, y = get_input()
else:
x, y = get_ai_move()
board[(x, y)] = player
if check_win(x, y):
print_board()
print(f"恭喜 {player} 获胜!")
is_game_over = True
elif len(board) == 64:
print_board()
print("平局!")
is_game_over = True
else:
player = 'O' if player == 'X' else 'X'
if __name__ == '__main__':
while True:
game_mode = input("请选择游戏模式:(PVP 或 PVE)")
if game_mode in ['PVP', 'PVE']:
break
else:
print("选择不合法,请重新选择。")
play()
```
在这个代码中,我们使用一个字典 `board` 来表示棋盘,键是二元组 `(x, y)`,值是棋子类型,即 `'X'` 或 `'O'`。`player` 表示当前玩家,`game_mode` 表示游戏模式,`is_game_over` 表示游戏是否结束。
`print_board()` 函数用于打印棋盘,`get_input()` 函数用于获取用户输入,`check_win(x, y)` 函数用于检查是否获胜,`get_ai_move()` 函数是一个简单的 AI 下棋策略,它会先检查是否存在可以获胜的位置,如果没有则检查是否存在需要防守的位置,如果还是没有则随机选择一个空位下棋。
`play()` 函数是游戏主循环,它会不断交替执行下面的步骤:
1. 打印棋盘;
2. 如果当前是 PVP 模式,则调用 `get_input()` 函数获取用户输入;如果当前是 PVE 模式且当前玩家是 X,则调用 `get_input()` 函数获取用户输入;如果当前是 PVE 模式且当前玩家是 O,则调用 `get_ai_move()` 函数获取 AI 下棋的位置;
3. 在棋盘上放置当前玩家的棋子;
4. 判断是否获胜或平局,如果是则结束游戏;
5. 切换当前玩家。
最后,在 `__name__ == '__main__'` 的条件下,我们先让用户选择游戏模式,然后调用 `play()` 函数开始游戏。
这个代码还有很多可以优化的地方,比如可以增加更复杂的 AI 下棋策略、增加悔棋功能等等。
阅读全文