用Python给我设计一个井字棋,对手是AI
简介
用Python制作一个简单的井字棋小程序,然后玩家是自己和AI。
设计思路
这是一个用Python实现的基础井字棋游戏程序,其中玩家与对手AI轮流下棋,每次落子后判断是否有胜者或者平局,并输出结果。
以下是这个程序的设计思路:
- 首先定义一个“新棋盘”函数,它创建一个3x3的二维列表表示一个全新、未进行过任何操作的空白棋盘,其中空位置用’.'来表示。
- 定义一个“绘制棋盘”函数,它将当前棋盘状态以三行的形式输出到控制台界面,X和O分别表示直线棋和圆形棋。
- 定义一个“判断胜者”函数,用以检查当前棋盘状态是否存在胜利结局(有一行、一列或一条对角线全部填充了相同类型棋子);如果存在胜利情况,则返回排列一致的棋子类型(X或O)。如果不存在胜利情况,则返回None。
- 定义一个“检查棋盘是否已满”的函数,该函数扫描所有格子,遍历棋盘,如果已经下满了所有格子,则表示棋局结束并且为平局。
- 定义一个“获取可落子位置”的函数,该函数扫描所有还没有被占据的格子,然后记录每个空格的行和列索引,随后返回所有未占据的格子——即可落子位置列表。
- 定义一个“放置棋子”的函数,该函数将当前玩家的棋子放置在选定的位置上,并更新棋盘状态。
- 定义一个方便切换玩家角色的函数,将下一次操作的角色设为与之前相反的角色。
- 紧接着我们定义一个简单的AI对手,其会从可落子位置中随机选择一个格子,作为它每次下棋时的选择点(注意此处AI并没有使用更加复杂的搜索算法进行选择)。
- 最后、定义主函数来实现整个游戏的控制流程,通过循环地交替玩家和AI进出下棋场景来维持游戏评分,当满足特定条件(胜利、平局、放弃)时返回对应结果并退出程序。
以上就是这个井字棋游戏程序的设计思路的概述。
完整代码
以下是一个简单的井字棋的Python程序,其中对手使用了基本的随机决策AI,代码注释中有详细的说明。
import random def new_board(): """ 创建一个新的井字棋盘面,用'.'表示空位置 """ return [['.' for i in range(3)] for j in range(3)] def draw_board(board): """ 绘制井字棋盘面 """ for i in range(3): print(' '.join(board[i])) def get_winner(board): """ 判断当前盘面的胜者,默认返回None,表示还没有胜者 """ # 检查行 for row in board: if row[0] != '.' and all(elem == row[0] for elem in row): return row[0] # 检查列 for col in range(3): if board[0][col] != '.' and all(board[row][col] == board[0][col] for row in range(3)): return board[0][col] # 检查对角线 if board[1][1] != '.' and ((board[0][0] == board[1][1] == board[2][2]) or (board[0][2] == board[1][1] == board[2][0])): return board[1][1] # 如果都没有胜者,则返回None return None def is_full(board): """ 判断盘面是否已满 """ return all('.' not in row for row in board) def get_possible_moves(board): """ 找到当前状态下可以下的所有位置 """ moves = [] for row in range(3): for col in range(3): if board[row][col] == '.': moves.append((row, col)) return moves def make_move(board, player, move): """ 在盘面上放置棋子 """ row, col = move board[row][col] = player def get_opponent(player): """ 获取对手玩家标志 """ return 'O' if player == 'X' else 'X' def get_random_move(board): """ 返回一个随机下棋位置 """ moves = get_possible_moves(board) return random.choice(moves) def play(): """ 玩井字棋游戏 """ board = new_board() player_turn = True while True: draw_board(board) # 判断胜负 winner = get_winner(board) if winner is not None: print(winner, 'win!') break elif is_full(board): print('Tie!') break # 选择下棋位置 if player_turn: # 玩家下棋 row = int(input('Enter row: ')) col = int(input('Enter column: ')) move = (row, col) else: # 对手下棋 print("AI's turn...") move = get_random_move(board) # 下棋 make_move(board, 'X' if player_turn else 'O', move) # 切换玩家 player_turn = not player_turn if __name__ == '__main__': play()
运行效果