TicTacToe Nobody wins 和推翻玩家的选择
TicTacToe Nobody wins AND overriding player's choices
我是一名新程序员,我开始学习 python 并想学习编写井字游戏代码。
游戏继续,但获胜条件和计算机字段选择无法正常工作:它不知道何时停止播放,有时计算机会选择一个已经选择的字段,从而覆盖我的选择(如果我尝试做同样的事情,我得到一个 ValueError)。
对于 win 算法,我不想手动检查所有选项,所以我使用了集合。我创建了一个包含所有获胜条件的集合。在迭代每个子集(行、列和对角线)时,我检查这是否是 player/computer 个位置的子集。
问题是:它不起作用。如果我尝试做任何事情,我会得到一个 ValueError: list.remove(x) x not in list。我有时会在 playerChoice 被删除的那一行或来自计算机的那一行收到此错误。
如上所述的另一个问题是计算机可以覆盖我的选择。
我认为问题在于从一组中删除元素并将它们添加到另一组中,但我找不到解决这个问题的方法
代码如下:
import random
board = [" ", " ", " ", " ", " ", " ", " ", " ", " "]
playerSymbol = ""
playerPosition = []
aiSymbol = ""
aiPosition = []
possiblePositions = [0, 1, 2, 3, 4, 5, 6, 7, 8]
turn = 0
def drawBoard():
print(board[0] + " | " + board[1] + " | " + board[2])
print("___" + "___" + "___")
print(board[3] + " | " + board[4] + " | " + board[5])
print("___" + "___" + "___")
print(board[6] + " | " + board[7] + " | " + board[8])
def choice():
global playerSymbol
global aiSymbol
answer = input("What do you want to play as? (type x or o) ")
if answer.upper() == "X":
playerSymbol = "X"
aiSymbol = "O"
else:
playerSymbol = "O"
aiSymbol = "X"
def won():
winningPositions = [{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 4, 8}, {2, 4, 6}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}]
for position in winningPositions:
if position.issubset(playerPosition):
print("Player Wins :)")
return True
elif position.issubset(aiPosition):
print("AI wins :(")
return True
else:
return False
def play():
global turn
choice()
while not won():
if turn % 2 == 0:
pos = int(input("Where would you like to play? (0-8) "))
possiblePositions.remove(pos)
playerPosition.append(pos)
board[pos] = playerSymbol
turn += 1
drawBoard()
else:
aiTurn = random.randint(0, len(possiblePositions) - 1)
possiblePositions.remove(possiblePositions[aiTurn])
aiPosition.append(aiTurn)
board[aiTurn] = aiSymbol
turn += 1
print("\n")
print("\n")
drawBoard()
else:
print("Thanks for playing :)")
play()
我乐于接受各种建议和方法来改进我的代码。
在此先感谢并保持健康,
克里斯蒂
一开始最好打印整个临时字段和输入数字的字段,因为从0-8中选择框很不舒服。做成这样,真的很容易理解(举例):
[ ][ ][X] [1][2][3]
[ ][ ][0] [4][5][6]
[X][0][X] [7][8][9]
Choose you box.
第二,你必须检查这一行
aiTurn = random.randint(0, len(possiblePositions) - 1)
您不检查随机值,但可以稍后移动。因为这个ai可以选择不为空的字段。像这样:
#for example
if aiTurn in PosiblePositions:
make_move()
else:
generate_new_move()
第三,当您尝试删除不在列表中的值时,会导致 ValueEror:
a = [1, 2, 3]
a.remove(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
一些尝试:
在play()
中,aiTurn
是possiblePositions
中棋盘位置的索引,所以你应该做类似pos = possiblePositions[aiTurn]
的事情,然后possiblePositions.remove(pos)
、aiPosition.append(pos)
和 board[pos] = aiSymbol
。现在你正在混合板位置和索引。
虽然这可能是一种令人困惑的编码方式,恕我直言,最好只维护董事会(没有 player/ai 个位置的列表)和基础 [=17= 】 关掉这个。例如,初始化 board = [0,0,0,0,0,0,0,0,0]
,然后为 X 设置 board[pos] = 1
,为 O 设置 board[pos] = -1
。然后您的 win()
可以检查 rows/cols/diags 是否有任何总和为 3 或 -3 的值。
如果你这样做,让计算机移动需要更多的工作,比如pos = random.choice([i for i,p in enumerate(board) if p==0])
..但它会节省你在其他地方的工作
你需要一些逻辑来解释draws/cats游戏
我认为在这里使用global
是不必要的,那些变量已经具有全局范围并且应该在每个函数中都可以访问。
希望对您有所帮助!
两件事:
- 轮到 AI,您正在生成 "upto the length of available positions"。您需要生成 "One of available positions".
更改这些行:
aiTurn = random.randint(0, len(possiblePositions) - 1)
possiblePositions.remove(possiblePositions[aiTurn])
到
aiTurn = random.choice(possiblePositions)
possiblePositions.remove(aiTurn)
- 在
won()
中,您需要遍历每个可能的组合,直到比较结果为 True
。但是,您 return 在第一次比较后要么是真要么是假。将 return False
移到循环外:
改变
for position in winningPositions:
if position.issubset(playerPosition):
print("Player Wins :)")
return True
elif position.issubset(aiPosition):
print("AI wins :(")
return True
else:
return False
至
for position in winningPositions:
if position.issubset(playerPosition):
print("Player Wins :)")
return True
elif position.issubset(aiPosition):
print("AI wins :(")
return True
return False
我是一名新程序员,我开始学习 python 并想学习编写井字游戏代码。
游戏继续,但获胜条件和计算机字段选择无法正常工作:它不知道何时停止播放,有时计算机会选择一个已经选择的字段,从而覆盖我的选择(如果我尝试做同样的事情,我得到一个 ValueError)。
对于 win 算法,我不想手动检查所有选项,所以我使用了集合。我创建了一个包含所有获胜条件的集合。在迭代每个子集(行、列和对角线)时,我检查这是否是 player/computer 个位置的子集。
问题是:它不起作用。如果我尝试做任何事情,我会得到一个 ValueError: list.remove(x) x not in list。我有时会在 playerChoice 被删除的那一行或来自计算机的那一行收到此错误。 如上所述的另一个问题是计算机可以覆盖我的选择。
我认为问题在于从一组中删除元素并将它们添加到另一组中,但我找不到解决这个问题的方法
代码如下:
import random
board = [" ", " ", " ", " ", " ", " ", " ", " ", " "]
playerSymbol = ""
playerPosition = []
aiSymbol = ""
aiPosition = []
possiblePositions = [0, 1, 2, 3, 4, 5, 6, 7, 8]
turn = 0
def drawBoard():
print(board[0] + " | " + board[1] + " | " + board[2])
print("___" + "___" + "___")
print(board[3] + " | " + board[4] + " | " + board[5])
print("___" + "___" + "___")
print(board[6] + " | " + board[7] + " | " + board[8])
def choice():
global playerSymbol
global aiSymbol
answer = input("What do you want to play as? (type x or o) ")
if answer.upper() == "X":
playerSymbol = "X"
aiSymbol = "O"
else:
playerSymbol = "O"
aiSymbol = "X"
def won():
winningPositions = [{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 4, 8}, {2, 4, 6}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}]
for position in winningPositions:
if position.issubset(playerPosition):
print("Player Wins :)")
return True
elif position.issubset(aiPosition):
print("AI wins :(")
return True
else:
return False
def play():
global turn
choice()
while not won():
if turn % 2 == 0:
pos = int(input("Where would you like to play? (0-8) "))
possiblePositions.remove(pos)
playerPosition.append(pos)
board[pos] = playerSymbol
turn += 1
drawBoard()
else:
aiTurn = random.randint(0, len(possiblePositions) - 1)
possiblePositions.remove(possiblePositions[aiTurn])
aiPosition.append(aiTurn)
board[aiTurn] = aiSymbol
turn += 1
print("\n")
print("\n")
drawBoard()
else:
print("Thanks for playing :)")
play()
我乐于接受各种建议和方法来改进我的代码。 在此先感谢并保持健康, 克里斯蒂
一开始最好打印整个临时字段和输入数字的字段,因为从0-8中选择框很不舒服。做成这样,真的很容易理解(举例):
[ ][ ][X] [1][2][3]
[ ][ ][0] [4][5][6]
[X][0][X] [7][8][9]
Choose you box.
第二,你必须检查这一行
aiTurn = random.randint(0, len(possiblePositions) - 1)
您不检查随机值,但可以稍后移动。因为这个ai可以选择不为空的字段。像这样:
#for example
if aiTurn in PosiblePositions:
make_move()
else:
generate_new_move()
第三,当您尝试删除不在列表中的值时,会导致 ValueEror:
a = [1, 2, 3]
a.remove(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
一些尝试:
在
play()
中,aiTurn
是possiblePositions
中棋盘位置的索引,所以你应该做类似pos = possiblePositions[aiTurn]
的事情,然后possiblePositions.remove(pos)
、aiPosition.append(pos)
和board[pos] = aiSymbol
。现在你正在混合板位置和索引。虽然这可能是一种令人困惑的编码方式,恕我直言,最好只维护董事会(没有 player/ai 个位置的列表)和基础 [=17= 】 关掉这个。例如,初始化
board = [0,0,0,0,0,0,0,0,0]
,然后为 X 设置board[pos] = 1
,为 O 设置board[pos] = -1
。然后您的win()
可以检查 rows/cols/diags 是否有任何总和为 3 或 -3 的值。如果你这样做,让计算机移动需要更多的工作,比如
pos = random.choice([i for i,p in enumerate(board) if p==0])
..但它会节省你在其他地方的工作你需要一些逻辑来解释draws/cats游戏
我认为在这里使用
global
是不必要的,那些变量已经具有全局范围并且应该在每个函数中都可以访问。
希望对您有所帮助!
两件事:
- 轮到 AI,您正在生成 "upto the length of available positions"。您需要生成 "One of available positions".
更改这些行:
aiTurn = random.randint(0, len(possiblePositions) - 1)
possiblePositions.remove(possiblePositions[aiTurn])
到
aiTurn = random.choice(possiblePositions)
possiblePositions.remove(aiTurn)
- 在
won()
中,您需要遍历每个可能的组合,直到比较结果为True
。但是,您 return 在第一次比较后要么是真要么是假。将return False
移到循环外:
改变
for position in winningPositions:
if position.issubset(playerPosition):
print("Player Wins :)")
return True
elif position.issubset(aiPosition):
print("AI wins :(")
return True
else:
return False
至
for position in winningPositions:
if position.issubset(playerPosition):
print("Player Wins :)")
return True
elif position.issubset(aiPosition):
print("AI wins :(")
return True
return False