我正在尝试制作一个极小极大算法的井字游戏,因为我是Python的新手,我想弄清楚一个简单的AI极小极大游戏是如何工作的。不知为何,AI仍然按照棋盘列表中位置的顺序进行选择。
例如:如果右上角的位置在“b”列表中是第一个,它就会首先选择它。看起来它是在计算分数,但我认为它并没有利用这些分数。我希望它不要按照棋盘上的空间顺序进行选择。我找不到一种方法来替换放置“O”的代码。
import randomimport maththree = [0, 0, 0]game = Trueturnai = Falseresult = ""b = [" ", " ", " ", " ", " ", " ", " ", " ", " "]x = "X"o = "O"#棋盘上的位置 例如:ur = 右上角, mm = 中间, lm = 左下角ur = b[2]um = b[1]ul = b[0]ml = b[3]mm = b[4]mr = b[5]ll = b[6]lm = b[7]lr = b[8]cw = " "AI = ""player = ""#设置棋盘def board(ul, um, ur, ml, mm, mr, ll, lm, lr): print("|" + " " + ul + " " + "|" + " " + um + " " + "|" + " " + ur + " " + "|") print("|" + " " + ml + " " + "|" + " " + mm + " " + "|" + " " + mr + " " + "|") print("|" + " " + ll + " " + "|" + " " + lm + " " + "|" + " " + lr + " " + "|")board(ul, um, ur, ml, mm, mr, ll, lm, lr)print("这是一个井字游戏")print("你将与AI对战")print("输入你想放置字母的位置 例如:ur = 右上角, mm = 中间, ll = 左下角")first = "P"player = "X"AI = "O"#检查是否有人获胜def checkwinner(): ur = b[2] um = b[1] ul = b[0] ml = b[3] mm = b[4] mr = b[5] ll = b[6] lm = b[7] lr = b[8] row1 = [ul, ml, ll] row2 = [um, mm, lm] row3 = [ur, mr, lr] column1 = [ul, um, ur] column2 = [ml, mm, mr] column3 = [ll, lm, lr] diagonal1 = [ul, mm, lr] diagonal2 = [ur, mm, ll] if row1 == ["X", "X", "X"] or row2 == ["X", "X", "X"] or row3 == ["X", "X", "X"] or column1 == ["X", "X", "X"] or column2 == [ "X", "X", "X"] or column3 == ["X", "X", "X"] or diagonal1 == ["X", "X", "X"] or diagonal2 == ["X", "X", "X"]: if player == x: print("你赢了!(X)") return "X" if player != x: print("你输了!") return "O" if row1 == ["O", "O", "O"] or row2 == ["O", "O", "O"] or row3 == ["O", "O", "O"] or column1 == ["O", "O", "O"] or column2 == [ "O", "O", "O"] or column3 == ["O", "O", "O"] or diagonal1 == ["O", "O", "O"] or diagonal2 == ["O", "O", "O"]: if player == o: print("你赢了!(O)") return "X" if player != o: print("你输了") return "O" if b[0] != " " and b[1] != " " and b[2] != " " and b[3] != " " and b[4] != " " and b[5] != " " and b[ 6] != " " and b[7] != " " and b[8] != " ": print("平局!") winner = True return "0" return "null"#极小极大算法def minimax(b, depth, isMaximizing): result = checkwinner() if result != "null": score = scores[result] + score return score if (isMaximizing): bestScore = -math.inf j = 0 for str in b: if str == " ": b[j] = AI score = minimax(b, depth + 1, False) + score b[j] = " " bestScore = max(score, bestScore) j += 1 return bestScore else: bestScore = math.inf k = 0 for str in b: if str == " ": b[k] = player score = minimax(b, depth + 1, True) + score b[k] = " " bestScore = min(score, bestScore) k += 1 return bestScore#游戏开始循环if (first == "P"): while (game == True): i = 0 scores = { 'O': 1, 'X': -1, '0': 0 }#AI回合 bestScore = -math.inf turnai = False i = 0 for str in b: if str == " ": b[i] = AI score = minimax(b, 0, True) b[i] = " " print(score) if score > bestScore and turnai == False: bestScore = score b[i] = AI turnai = True i += 1 turnai = False print("") # b = [ul, um, ur, ml, mm, mr, ll, lm, lr] ur = b[2] um = b[1] ul = b[0] ml = b[3] mm = b[4] mr = b[5] ll = b[6] lm = b[7] lr = b[8]#打印棋盘 board(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]) cw = checkwinner()#检查游戏是否结束 if cw == "X" or cw == "O" or cw == "0": game = False break#玩家回合 print("你想在哪里放置你的字母?") turn = input(": ") if turn == "ur" and ur == " ": b[2] = player uru = True if turn == "um" and um == " ": b[1] = player umu = True if turn == "ul" and ul == " ": b[0] = player ulu = True if turn == "mr" and mr == " ": b[5] = player mru = True if turn == "mm" and mm == " ": b[4] = player mmu = True if turn == "ml" and ml == " ": b[3] = player mlu = True if turn == "lr" and lr == " ": b[8] = player lru = True if turn == "lm" and lm == " ": b[7] = player lmu = True if turn == "ll" and ll == " ": b[6] = player llu = True#打印棋盘 board(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]) sw = checkwinner()#检查游戏是否需要结束 if cw == "X" or cw == "O" or cw == "0": game = False break
回答: