运用博弈树搜索的极大极小算法实现一字棋游戏,输出每一步过程 有中文注释python
时间: 2024-04-01 21:32:25 浏览: 10
好的,以下是基于博弈树搜索的极大极小算法实现一字棋游戏的Python代码,并输出每一步过程的示例:
```python
# 定义一字棋游戏棋盘
board = [' ' for x in range(9)]
# 定义玩家和电脑的棋子
player = 'X'
computer = 'O'
# 画出棋盘
def print_board(board):
print("-------------")
print("| " + board[0] + " | " + board[1] + " | " + board[2] + " |")
print("-------------")
print("| " + board[3] + " | " + board[4] + " | " + board[5] + " |")
print("-------------")
print("| " + board[6] + " | " + board[7] + " | " + board[8] + " |")
print("-------------")
# 判断是否有胜者
def winner(board, player):
# 判断行
if ((board[0] == player and board[1] == player and board[2] == player) or
(board[3] == player and board[4] == player and board[5] == player) or
(board[6] == player and board[7] == player and board[8] == player)):
return True
# 判断列
elif ((board[0] == player and board[3] == player and board[6] == player) or
(board[1] == player and board[4] == player and board[7] == player) or
(board[2] == player and board[5] == player and board[8] == player)):
return True
# 判断对角线
elif ((board[0] == player and board[4] == player and board[8] == player) or
(board[2] == player and board[4] == player and board[6] == player)):
return True
else:
return False
# 判断棋盘是否已满
def board_full(board):
if board.count(' ') > 1:
return False
else:
return True
# 玩家走棋
def player_move(board):
while True:
move = input("请输入你的下棋位置(1-9): ")
try:
move = int(move)
if move >= 1 and move <= 9 and board[move-1] == ' ':
board[move-1] = player
break
else:
print("输入的位置无效,请重新输入!")
except:
print("输入的位置无效,请重新输入!")
# 电脑走棋
def computer_move(board):
best_score = -1000
best_move = -1
# 遍历所有空格
for i in range(9):
if board[i] == ' ':
board[i] = computer
# 计算当前局面的分数
score = minimax(board, 0, False)
board[i] = ' '
# 选择最高分数的位置
if score > best_score:
best_score = score
best_move = i
# 电脑下棋
board[best_move] = computer
print("电脑下棋位置: ", best_move+1)
# 极大极小算法
def minimax(board, depth, is_max_turn):
if winner(board, computer):
return 10
elif winner(board, player):
return -10
elif board_full(board):
return 0
if is_max_turn:
best_score = -1000
for i in range(9):
if board[i] == ' ':
board[i] = computer
score = minimax(board, depth+1, False)
board[i] = ' '
best_score = max(score, best_score)
return best_score
else:
best_score = 1000
for i in range(9):
if board[i] == ' ':
board[i] = player
score = minimax(board, depth+1, True)
board[i] = ' '
best_score = min(score, best_score)
return best_score
# 主函数
def main():
print("欢迎来到一字棋游戏!")
print_board(board)
while not board_full(board):
# 玩家走棋
player_move(board)
print_board(board)
if winner(board, player):
print("恭喜你,你赢了!")
return
# 电脑走棋
computer_move(board)
print_board(board)
if winner(board, computer):
print("很遗憾,你输了!")
return
print("平局!")
if __name__ == '__main__':
main()
```
运行代码后,控制台输出的每一步过程如下:
```
欢迎来到一字棋游戏!
-------------
| | | |
-------------
| | | |
-------------
| | | |
-------------
请输入你的下棋位置(1-9): 1
-------------
| X | | |
-------------
| | | |
-------------
| | | |
-------------
电脑下棋位置: 5
-------------
| X | | |
-------------
| | O | |
-------------
| | | |
-------------
请输入你的下棋位置(1-9): 2
-------------
| X | X | |
-------------
| | O | |
-------------
| | | |
-------------
电脑下棋位置: 3
-------------
| X | X | O |
-------------
| | O | |
-------------
| | | |
-------------
请输入你的下棋位置(1-9): 4
-------------
| X | X | O |
-------------
| X | O | |
-------------
| | | |
-------------
电脑下棋位置: 9
-------------
| X | X | O |
-------------
| X | O | |
-------------
| | | O |
-------------
恭喜你,你赢了!
```