📜  AI与Python中的¢Â€A“的游戏- Tutorialspoint(1)

📅  最后修改于: 2023-12-03 15:29:18.704000             🧑  作者: Mango

介绍:AI与Python中的Minimax游戏

在本教程中,我们将介绍最基本的人工智能算法之一 - 极小化极大算法(Minimax Algorithm)。我们将使用Python来实现这个算法,并将其应用于一个简单的代表性博弈 - Tic Tac Toe(井字棋)。

Minimax算法

Minimax算法是解决适用于两个对手的零和游戏的算法。它的基本思想是:每个玩家都试图选择下一个最优的动作,而对手则试图使这个动作最劣。算法使玩家进行最小化自己最大化对手的收益的决策。

在我们使用这个算法之前,我们需要定义一些游戏规则,假设我们在过程中将使用井字棋作为案例。

井字棋规则

井字棋是一款简单的两人游戏,其中玩家交替在一个3x3的棋盘上画X或O。一个玩家在棋盘上形成3个连续的X或O(水平,垂直或对角线),即为胜者。如果棋盘已满而没有获胜者,则游戏平局。

Python实现

我们将Python用于实现Minimax算法。

以下是我们需要实现的步骤:

1.构建井字棋游戏面板

2.创建计算机自动玩家、玩家、闲置角(如果所有其他地方均被占据的角)、空闲位置列表等必要的元素

3.使用Minimax算法来为计算机制定最优策略

构建井字棋游戏面板

在此步骤中,我们将定义一个有效的棋盘,其中每个格都被记录成“O”或“X”或为空(“ ”),并通过一个3 × 3的嵌套列表实现。以下是我们的代码实现:

board = [[' ', ' ', ' '],
        [' ', ' ', ' '],
        [' ', ' ', ' ']]
创建玩家、计算机自动玩家、空闲角及空闲位置列表等必要元素

在此步骤中,我们将定义玩家,并创建计算机自动玩家。我们还将定义闲置角并创建一个空闲位置列表,以在计算机自动玩家移动时使用。

player, computer = 'X', 'O'

# 定义闲置角位置
idle_corners = [1, 3, 7, 9]

# 获取空闲位置列表
def get_free_positions(board):
    free_positions = []
    for i in range(3):
        for j in range(3):
            if board[i][j] == ' ':
                free_positions.append((i, j))
    return free_positions
Minimax算法

在此步骤中,我们将使用递归极小化极大算法来确定计算机自动玩家在每一步中的最佳选择。

def minimax(board, depth, isMaximizing):
    score = check_win(board)
    
    if score == 10:
        return score - depth
    elif score == -10:
        return score + depth
    elif len(get_free_positions(board)) == 0:
        return 0
    
    if isMaximizing:
        best_score = -float('inf')
        for move in get_free_positions(board):
            board[move[0]][move[1]] = computer
            score = minimax(board, depth + 1, False)
            board[move[0]][move[1]] = ' '
            best_score = max(score, best_score)
        return best_score
    else:
        best_score = float('inf')
        for move in get_free_positions(board):
            board[move[0]][move[1]] = player
            score = minimax(board, depth + 1, True)
            board[move[0]][move[1]] = ' '
            best_score = min(score, best_score)
        return best_score

在递归开始时,我们将玩家和计算机自动玩家进行区分。当计算机自动玩家进行下一步时,它将使用极小化极大算法来选择最优动作。算法通过迭代计算可以得到最佳动作的得分。最佳动作是具有最高得分的动作。

完整代码
board = [[' ', ' ', ' '],
        [' ', ' ', ' '],
        [' ', ' ', ' ']]
player, computer = 'X', 'O'

# 定义闲置角位置
idle_corners = [1, 3, 7, 9]

# 获取空闲位置列表
def get_free_positions(board):
    free_positions = []
    for i in range(3):
        for j in range(3):
            if board[i][j] == ' ':
                free_positions.append((i, j))
    return free_positions

# 检查是否有胜者
def check_win(board):
    for i in range(3):
        if (board[i][0] == board[i][1] == board[i][2] != ' '):
            return 10 if board[i][0] == computer else -10
        if (board[0][i] == board[1][i] == board[2][i] != ' '):
            return 10 if board[0][i] == computer else -10
    if (board[0][0] == board[1][1] == board[2][2] != ' '):
        return 10 if board[1][1] == computer else -10
    if (board[0][2] == board[1][1] == board[2][0] != ' '):
        return 10 if board[1][1] == computer else -10
    return 0

# Minimax算法
def minimax(board, depth, isMaximizing):
    score = check_win(board)
    
    if score == 10:
        return score - depth
    elif score == -10:
        return score + depth
    elif len(get_free_positions(board)) == 0:
        return 0
    
    if isMaximizing:
        best_score = -float('inf')
        for move in get_free_positions(board):
            board[move[0]][move[1]] = computer
            score = minimax(board, depth + 1, False)
            board[move[0]][move[1]] = ' '
            best_score = max(score, best_score)
        return best_score
    else:
        best_score = float('inf')
        for move in get_free_positions(board):
            board[move[0]][move[1]] = player
            score = minimax(board, depth + 1, True)
            board[move[0]][move[1]] = ' '
            best_score = min(score, best_score)
        return best_score

# 计算机自动玩家决策
def get_computer_move(board):
    if board[1][1] == ' ':
        return (1, 1)
    for move in idle_corners:
        if move in get_free_positions(board):
            return ((move - 1) // 3, (move - 1) % 3)
    return get_best_move(board)

# 获取最佳移动位置
def get_best_move(board):
    best_score = -float('inf')
    best_move = None
    for move in get_free_positions(board):
        board[move[0]][move[1]] = computer
        score = minimax(board, 0, False)
        board[move[0]][move[1]] = ' '
        if score > best_score:
            best_score = score
            best_move = move
    return best_move

# 游戏主循环
def play_game():
    while True:
        for i in range(3):
            print(board[i][0] + '|' + board[i][1] + '|' + board[i][2])
        if check_win(board) != 0:
            winner = "计算机" if check_win(board) == 10 else "玩家"
            print(winner + "获胜!")
            break
        elif len(get_free_positions(board)) == 0:
            print("游戏平局!")
            break
        p_move = input("玩家输入位置 (1-9): ")
        (x, y) = ((int(p_move) - 1) // 3, (int(p_move) - 1) % 3)
        if board[x][y] != ' ':
            print("已占用位置,请重试")
            continue
        board[x][y] = player
        (x, y) = get_computer_move(board)
        print("计算机决策为:", 3 * x + y + 1)
        board[x][y] = computer

if __name__ == '__main__':
    play_game()

这是我们Minimax AI与Python中的游戏 - Tic Tac Toe(井字棋)的完整实现。我们希望这篇教程能为您提供足够的信息,以便您开始使用极小化极大算法为自己的任何游戏构建AI。