python实现AI井字棋极大极小算法和Alpha-beta算法

python实现AI井字棋极大极小算法和Alpha-beta算法

程序设计思路

大致思路:
井字棋最后的结果无非就是玩家赢、电脑赢和平局三种结果,而最后的结果正对应这整棵棋盘生成树的叶子节点,那么可以把玩家赢、电脑赢和平局三种结果赋值,然后根据当前深度是Max层还是Min层来,往上推出该子节点的父子节点的值,一直往上走到根节点,这也正是极大极小搜索的一个过程,而alpha-beta算法只要在极大极小上加以修改即可。

主要步骤和代码

1、 棋盘:用一个长度为9的数组存储每一位的字符,其中空位为‘-’,玩家棋子默认为‘O’,电脑玩家默认为‘#’,该数组为全局变量;定义print_board()函数来输出当前棋盘状况;定义reset_board()函数来重置棋盘;
2、 先手问题:定义一个变量first,根据输入来定义先手,输入1为玩家先手,输入-1为电脑先手;

first=0#先手变量,玩家先手为1,电脑先手为-1
board_list=['-' for i in range(9)]#棋盘位置以数组存储

#重置棋盘
def reset_board():
    global board_list#将其定义成全局变量
    board_list=['-' for i in range(9)]

#输出棋盘
def print_board():
    print("棋盘:")
    for i in range(1,10):
        if i%3==0:
            print(board_list[i-1])
        else:
            print(board_list[i-1],end="")
    return board_list

3、 胜者判断:定义check_win( )函数来判断当前是否有练成一线的情况,胜利的情况有8种,水平线3种,竖直线3种,斜线2种,根据位置的下标加以判断;定义winner( )函数判断赢家,如果是玩家先手,则玩家赢赋值为1,电脑赢为-1,平局为0;如果是电脑赢,则电脑赢赋值为1,玩家赢为-1,平局为0,这样可以方便Max和Min的区别;

#判断胜负
def check_win(tag):
    return ((board_list[0] == tag and board_list[1] == tag and board_list[2] == tag) or # 顶水平连线
    (board_list[3] == tag and board_list[4] == tag and board_list[5] == tag) or # 中间水平连线
    (board_list[6] == tag and board_list[7] == tag and board_list[8] == tag) or # 底部水平连线
    (board_list[0] == tag and board_list[3] == tag and board_list[6] == tag) or # 左侧垂直连线
    (board_list[1] == tag and board_list[4] == tag 
  • 14
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是实现AI井字棋alpha-beta剪枝算法Python代码: ```python import math MAX = math.inf MIN = -math.inf def minimax(board, depth, alpha, beta, is_maximizing): result = check_winner(board) if result != None: return result if is_maximizing: best_score = MIN for i in range(3): for j in range(3): if board[i][j] == ' ': board[i][j] = 'X' score = minimax(board, depth+1, alpha, beta, False) board[i][j] = ' ' best_score = max(score, best_score) alpha = max(alpha, best_score) if beta <= alpha: break return best_score else: best_score = MAX for i in range(3): for j in range(3): if board[i][j] == ' ': board[i][j] = 'O' score = minimax(board, depth+1, alpha, beta, True) board[i][j] = ' ' best_score = min(score, best_score) beta = min(beta, best_score) if beta <= alpha: break return best_score def find_best_move(board): best_score = MIN best_move = None for i in range(3): for j in range(3): if board[i][j] == ' ': board[i][j] = 'X' score = minimax(board, 0, MIN, MAX, False) board[i][j] = ' ' if score > best_score: best_score = score best_move = (i, j) return best_move def check_winner(board): for i in range(3): if board[i][0] == board[i][1] == board[i][2] != ' ': return 1 if board[i][0] == 'X' else -1 if board[0][i] == board[1][i] == board[2][i] != ' ': return 1 if board[0][i] == 'X' else -1 if board[0][0] == board[1][1] == board[2][2] != ' ': return 1 if board[0][0] == 'X' else -1 if board[0][2] == board[1][1] == board[2][0] != ' ': return 1 if board[0][2] == 'X' else -1 for i in range(3): for j in range(3): if board[i][j] == ' ': return None return 0 board = [[' ', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']] while True: print(board[0]) print(board[1]) print(board[2]) winner = check_winner(board) if winner != None: if winner == 0: print("Tie!") else: print("You win!" if winner == 1 else "AI wins!") break row = int(input("Enter row (0, 1, or 2): ")) col = int(input("Enter column (0, 1, or 2): ")) if board[row][col] != ' ': print("Invalid move!") continue board[row][col] = 'O' winner = check_winner(board) if winner != None: if winner == 0: print("Tie!") else: print("You win!" if winner == 1 else "AI wins!") break row, col = find_best_move(board) board[row][col] = 'X' ``` 这个代码实现了一个简单的人机对战井字棋游戏,其中AI使用了alpha-beta剪枝算法来下棋。当玩家输入坐标时,程序会将玩家的棋子放在对应的位置,并检查是否有获胜者。如果没有获胜者,AI会使用minimax算法alpha-beta剪枝来找到最好的下棋位置,并将棋子放在那里。程序会不断循环,直到游戏结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值