python五子棋人机对战
时间: 2023-09-02 08:15:47 浏览: 39
好的,以下是一个简单的 Python 五子棋人机对战的示例代码:
```python
import numpy as np
def create_board():
board = np.zeros((15,15))
return board
def is_valid_move(board, row, col):
return board[row][col] == 0
def get_next_move(board):
possible_moves = []
for row in range(len(board)):
for col in range(len(board)):
if is_valid_move(board, row, col):
possible_moves.append((row, col))
return possible_moves[np.random.choice(len(possible_moves))]
def get_winner(board):
for player in [1, 2]:
for row in range(len(board)):
for col in range(len(board)):
if check_win(board, row, col, player):
return player
return None
def check_win(board, row, col, player):
# 横向
if col <= 10:
if np.all(board[row, col:col+5] == player):
return True
# 竖向
if row <= 10:
if np.all(board[row:row+5, col] == player):
return True
# 右上斜向
if row <= 10 and col <= 10:
if np.all(board[row:row+5, col:col+5].diagonal() == player):
return True
# 左上斜向
if row <= 10 and col >= 4:
if np.all(np.fliplr(board[row:row+5, col-4:col+1]).diagonal() == player):
return True
return False
def print_board(board):
print(" ", end="")
for i in range(len(board)):
print(chr(i+ord('A')), end=" ")
print()
for i in range(len(board)):
print("{:2d}".format(i+1), end=" ")
for j in range(len(board)):
if board[i][j] == 0:
print(".", end=" ")
elif board[i][j] == 1:
print("X", end=" ")
else:
print("O", end=" ")
print()
def play_game():
board = create_board()
player = 1
while True:
print_board(board)
if player == 1:
print("玩家 1 的回合")
row = int(input("请输入行号: ")) - 1
col = ord(input("请输入列号: ")) - ord('A')
else:
print("玩家 2 的回合")
row, col = get_next_move(board)
print("电脑选择了 {}{}".format(row+1, chr(col+ord('A'))))
if is_valid_move(board, row, col):
board[row][col] = player
winner = get_winner(board)
if winner:
print_board(board)
print("玩家 {} 获胜!".format(winner))
break
player = 3 - player
else:
print("无效的落子,请重新输入!")
if __name__ == '__main__':
play_game()
```
这个示例代码使用了 NumPy 数组来表示棋盘,在 `create_board` 函数中创建了一个 15x15 的数组,并在 `print_board` 函数中将其输出为可读性更高的格式。
`is_valid_move` 函数检查给定的位置是否为空,而 `get_next_move` 函数则随机选择一个空位置作为电脑的下一步落子。
`get_winner` 函数检查当前棋盘是否存在五子连珠的情况,如果有,返回获胜者的编号,否则返回 `None`。
`check_win` 函数检查从给定位置开始,沿着横向、竖向、右上斜向和左上斜向是否存在五子连珠的情况。
`play_game` 函数则是主函数,不断循环直到出现获胜者,每次循环交替进行玩家和电脑的落子,并检查是否有获胜者出现。
你可以在命令行中运行这个程序,并按照提示进行输入和操作,体验五子棋人机对战的乐趣。