用Python给我设计一个井字棋,对手是AI

用Python给我设计一个井字棋,对手是AI

简介

用Python制作一个简单的井字棋小程序,然后玩家是自己和AI。

设计思路

这是一个用Python实现的基础井字棋游戏程序,其中玩家与对手AI轮流下棋,每次落子后判断是否有胜者或者平局,并输出结果。

以下是这个程序的设计思路:

  1. 首先定义一个“新棋盘”函数,它创建一个3x3的二维列表表示一个全新、未进行过任何操作的空白棋盘,其中空位置用’.'来表示。

  2. 定义一个“绘制棋盘”函数,它将当前棋盘状态以三行的形式输出到控制台界面,X和O分别表示直线棋和圆形棋。

  3. 定义一个“判断胜者”函数,用以检查当前棋盘状态是否存在胜利结局(有一行、一列或一条对角线全部填充了相同类型棋子);如果存在胜利情况,则返回排列一致的棋子类型(X或O)。如果不存在胜利情况,则返回None。

  4. 定义一个“检查棋盘是否已满”的函数,该函数扫描所有格子,遍历棋盘,如果已经下满了所有格子,则表示棋局结束并且为平局。

  5. 定义一个“获取可落子位置”的函数,该函数扫描所有还没有被占据的格子,然后记录每个空格的行和列索引,随后返回所有未占据的格子——即可落子位置列表。

  6. 定义一个“放置棋子”的函数,该函数将当前玩家的棋子放置在选定的位置上,并更新棋盘状态。

  7. 定义一个方便切换玩家角色的函数,将下一次操作的角色设为与之前相反的角色。

  8. 紧接着我们定义一个简单的AI对手,其会从可落子位置中随机选择一个格子,作为它每次下棋时的选择点(注意此处AI并没有使用更加复杂的搜索算法进行选择)。

  9. 最后、定义主函数来实现整个游戏的控制流程,通过循环地交替玩家和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()

运行效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_51447496/article/details/130734500
今日推荐