首页 > 编程语言 >井字棋 AI-Python

井字棋 AI-Python

时间:2024-07-08 13:29:02浏览次数:17  
标签:return AI move 井字棋 Python depth score board row

1. 介绍程序中的算法

MinMax算法,也称为极小化极大算法,是一种在博弈论中广泛应用的算法,用于在两个竞争者之间进行零和博弈时,找出最优策略。

该算法适用于井字棋、象棋等游戏,旨在为玩家提供最佳决策。其基本思想是假设对手不会犯错误,从而在最坏情况下保证自己的最大利益。

Minimax算法的核心在于构建一个博弈树,这个树展示了所有可能的游戏状态和双方的决策路径。每个节点代表一种游戏状态,边代表从一种状态到另一种状态的转换。在这个树中,一方努力最大化自己的收益(MAX节点),而另一方努力最小化对方的收益(MIN节点)。

具体来说,如果当前是MAX节点(即玩家希望最大化收益的节点),它会评估所有可能的走法,并选择能带来最大价值的走法。相反,如果当前是MIN节点(即对手试图最小化玩家收益的节点),则选择对玩家最不利的走法。通过这种递归方式,Minimax算法能够找到一条最优路径,使得在对方采取最佳反应的情况下,自己的损失最小。

然而,这种方法存在明显的效率问题,尤其是当博弈树非常庞大时。为了优化这一过程,引入了Alpha-Beta剪枝技术。这种技术通过维护两个值——Alpha(当前找到的最大下界)和Beta(当前找到的最小上界),在搜索过程中剪枝那些不可能优于已有选择的子树,从而显著减少搜索量。

总的来说,Minimax算法通过构建博弈树并递归评估每个可能的游戏状态,寻找在对手采取最优反应的情况下能够保证的最佳结果。结合Alpha-Beta剪枝,可以有效提高搜索效率,使得该算法在复杂的游戏中依然实用。

2.应用 Minimax 算法:

def minimax(board, depth, is_maximizing, alpha=float('-inf'), beta=float('inf'), depth_limit=None):
    winner = check_winner(board)
    if winner == 'X':
        return 1 / depth
    elif winner == 'O':
        return -1 / depth
    elif is_draw(board):
        return 0

3.源代码:

import time
def check_winner(board):
    # 检查行是否有获胜者
    for row in board:
        if row.count(row[0]) == len(row) and row[0] != ' ':
            return row[0]
    
    # 检查列是否有获胜者
    for col in range(len(board)):
        if all(row[col] == board[0][col] for row in board) and board[0][col] != ' ':
            return board[0][col]
    
    # 检查对角线是否有获胜者
    if all(board[i][i] == board[0][0] for i in range(len(board))) and board[0][0] != ' ':
        return board[0][0]
    if all(board[i][len(board)-1-i] == board[0][len(board)-1] for i in range(len(board))) and board[0][len(board)-1] != ' ':
        return board[0][len(board)-1]
    
    # 检查是否平局
    if all(all(cell != ' ' for cell in row) for row in board):
        return 'draw'
    
    # 没有获胜者且游戏未结束
    return None

def is_draw(board):
    return check_winner(board) == 'draw'
def make_move(board, move, player):
    row, col = move
    new_board = [row[:] for row in board]  # 创建棋盘的深拷贝以避免修改原始棋盘
    new_board[row][col] = player
    return new_board

def get_valid_moves(board):
    valid_moves = []
    for i in range(len(board)):
        for j in range(len(board[i])):
            if board[i][j] == ' ':
                valid_moves.append((i, j))
    return valid_moves

def minimax(board, depth, is_maximizing, alpha=float('-inf'), beta=float('inf'), depth_limit=None):
    winner = check_winner(board)
    if winner == 'X':
        return 1 / depth
    elif winner == 'O':
        return -1 / depth
    elif is_draw(board):
        return 0

    if depth_limit is not None and depth >= depth_limit:
        return 10000  # 返回一个默认评估值,例如 0,表示在这个深度上不进行进一步搜索

    if is_maximizing:
        best_score = float('-inf')
        for move in get_valid_moves(board):
            new_board = make_move(board, move, 'X')
            score = minimax(new_board, depth + 1, False, alpha, beta, depth_limit)
            best_score = max(best_score, score)
            alpha = max(alpha, best_score)
            if beta <= alpha:
                break
        return best_score
    else:
        best_score = float('inf')
        for move in get_valid_moves(board):
            new_board = make_move(board, move, 'O')
            score = minimax(new_board, depth + 1, True, alpha, beta, depth_limit)
            best_score = min(best_score, score)
            beta = min(beta, best_score)
            if beta <= alpha:
                break
        return best_score

def ai_move(board, depth_limit=None):
    best_score = float('-inf')
    best_move = None
    for move in get_valid_moves(board):
        new_board = make_move(board, move, 'X')
        score = minimax(new_board, 1, False, depth_limit=depth_limit)
        if score > best_score:
            best_score = score
            best_move = move
    return best_move

 

def print_board(board):
    for row in board:
        print(" | ".join(row))
        print("-" * (4 * len(board) - 3))

def main():
    board = [[' ' for _ in range(3)] for _ in range(3)]
    current_player = 'X'
    
    while True:
        print_board(board)
        if current_player == 'X':
            # 玩家输入
            row, col = map(int, input("请输入行和列(用空格分隔):").split())
            if board[row][col] != ' ':
                print("无效的移动,请重新输入。")
                continue
            board = make_move(board, (row, col), current_player)
        else:
            # AI输入
            print("AI正在思考...")
            time.sleep(1)
            move = ai_move(board, depth_limit=1000)
            board = make_move(board, move, current_player)
        
        winner = check_winner(board)
        if winner is not None:
            print_board(board)
            if winner == 'draw':
                print("平局!")
            else:
                print(f"{winner} 赢了!")
            break
        
        current_player = 'O' if current_player == 'X' else 'X'

if __name__ == "__main__":
    main()

标签:return,AI,move,井字棋,Python,depth,score,board,row
From: https://blog.csdn.net/2401_86075647/article/details/140253062

相关文章

  • 处理报错deepspeed使用trainer object.__init__() takes exactly one argument (the i
    项目场景:在kaggle上结合deepspeed使用trainer问题描述报错TypeError:object.init()takesexactlyoneargument(theinstancetoinitialize)具体如下:File/opt/conda/lib/python3.10/site-packages/transformers/training_args.py:1934,inTrainingArguments.__......
  • 使用Python之前的准备
    鉴于配置Ottertune项目花了整整两天还没配好,其中一个很重要的原因是使用古老的Python包及其错综复杂的依赖关系,而我平时使用C++开发较多,较少使用Python。为了避免下次配置环境时重蹈覆辙,我决定将本次配置环境的经验教训记录下来。启用虚拟环境目的:便于实验不同的Python版本虚......
  • 在Windows环境下安装Python 3.11的步骤
    在Windows环境下安装Python3.11的步骤相对直接。下面是详细的安装教程:第一步:下载Python3.11安装程序访问Python官方网站的下载页面:https://www.python.org/downloads/在页面中找到适用于Windows的Python3.11版本,点击下载对应你操作系统的安装包。通常,你会看到一个明显......
  • 使用AI人工智能写歌词来创作歌词有什么好处?
    1、创造性灵感:人工智能可以提供创意灵感,帮助音乐人和词曲作者克服创作瓶颈,激发新的创作思路。2、提高效率:人工智能可以快速生成大量歌词候选,节省创作者的时间和精力,让他们专注于选择和修改更具创造性的部分。3、吸引不同受众:通过人工智能生成的歌词,可以满足不同听众对多样化音......
  • AI人工智能写歌词的工作原理是什么?
    人工智能写歌词的原理主要基于自然语言处理和生成模型的技术,首先,收集大量的歌词文本数据,接下来,采用神经网络等机器学习技术,利用收集到的大量歌词数据对模型进行训练,在训练过程中,模型将学习歌词的语言特征,包括韵律、押韵、情感表达等,一旦训练完成,模型就可以根据输入的提示生成新的......
  • Python中的面向对象编程:从入门到实践
    Python中的面向对象编程:从入门到实践一、引言面向对象编程(Object-OrientedProgramming,OOP)是Python语言中一个核心概念,它提供了一种处理程序复杂性的方法。通过OOP,我们可以使用对象和类的概念来模拟现实世界的实体和行为。本文将深入探讨Python中的面向对象编程,包括类与对......
  • Python酷库之旅-第三方库Pandas(010)
    目录一、用法精讲22、pandas.read_hdf函数22-1、语法22-2、参数22-3、功能22-4、返回值22-5、说明22-6、用法22-6-1、数据准备22-6-2、代码示例22-6-3、结果输出23、pandas.HDFStore.put方法23-1、语法23-2、参数23-3、功能23-4、返回值23-5、说明23-6、用法......
  • 五月份我靠AI做宠物赛道✅半个月赚麻了
    前言五月份,聪明的人开始ai宠物赛道了!......
  • 高一的同学适合用善利AI高考备考系统吗?
    近年来,人工智能在教育领域的应用逐渐成熟,善利AI高考备考系统便是其中一款受到广泛关注的产然而,高一学生是否适合使用此类系统进行备考呢?让我们详细探讨一番。首先,让我们认识一下善利AI高考备考系统,该系统是一款集智能诊断、个性化学习计划制定、知识点辅导、练习题库、模拟......
  • doc转docx(java-python)
    本文功能借助python实现的doc转docx,调研了一下开源的工具或者类库转换效果不理想,所以选择python 1./resources/convert.py(py文件放到resources下)importargparsefromdoc2docximportconvertdefconvert_doc_to_docx(docFilePath,docxFilePath):convert(docFi......