程序设计思路
大致思路:
井字棋最后的结果无非就是玩家赢、电脑赢和平局三种结果,而最后的结果正对应这整棵棋盘生成树的叶子节点,那么可以把玩家赢、电脑赢和平局三种结果赋值,然后根据当前深度是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