我正在尝试制作一个minimax井字游戏,因为我是Python的新手,所以我试图弄清楚一个简单的AI-mini-max游戏是如何工作的。出于某种原因,AI仍会按顺序排列,以使该位置出现在板子列表上。
例如:如果右上角的位置在“ b”列表中排在首位,则它首先将其选中。看起来它正在计算分数,但我不认为出于某些原因它正在利用分数。我希望它不会按董事会中的空格顺序排列。我想不出一种方法来替换放置“ O”的代码。
import random
import math
three = [0, 0, 0]
game = True
turnai = False
result = ""
b = [" ", " ", " ", " ", " ", " ", " ", " ", " "]
x = "X"
o = "O"
#Spots on the board Ex: ur = upper right, mm = middle middle, lm = lower middle
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 = ""
#Board setup
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("This is the game of tic-tac-toe")
print("You will be playing against an AI")
print("Type where you want to place your letter Ex: ur = upper right, mm = middle middle, and ll = lower right")
first = "P"
player = "X"
AI = "O"
#Checks if someone has won
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("You win! (X)")
return "X"
if player != x:
print("You lose!")
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("You win! (O)")
return "X"
if player != o:
print("You lose")
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("TIE!")
winner = True
return "0"
return "null"
#Minimax Algorithm
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
#Game Start loop
if (first == "P"):
while (game == True):
i = 0
scores = {
'O': 1,
'X': -1,
'0': 0
}
#AI turn
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]
#Prints Board
board(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
cw = checkwinner()
#Checks if game ended
if cw == "X" or cw == "O" or cw == "0":
game = False
break
#Player turn
print("Where do you want to place your letter?")
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
#Prints Board
board(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
sw = checkwinner()
#Checks if game needs to be ended
if cw == "X" or cw == "O" or cw == "0":
game = False
break
str
作为变量名称,因为它是内置变量。enumerate
从列表中获取索引和值。scores
应该在minimax
中定义,因为这是唯一使用它的地方。[由于此部分代码,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: # Allways true first loop
bestScore = score
b[i] = AI
turnai = True # ^ Never true in later loops
具有讽刺意味的是,仅当turnai == false
时出现
turnai
布尔值,因为您已明确编写了AI和用户回合代码。boolean == True
是否只说while game:
break
。>sw = checkwinner()
,然后检查cw
的值我可以为您解决这个问题,但我想我已经给您足够的知识,可以在这里使用,我会告诉您您的概念是正确的,因此,如果您再坚持一点,您应该会得到满意的结果...
这里的主要逻辑缺陷是,您实际上从不计算给定选择留下多少胜利...您的minimax函数每次仅返回1。