[英]How to check specific elements of a list for a string value?
所以即时编码Tic Tac Toe
我已经将环境创建为9个元素的列表,如下所示 -
board=[' ']*9
然后我将X或O放在板上
board[move-1] = 'X'
哪个工作正常
我遇到的问题是在放置X或O之后,我无法检查获胜条件。 输出始终返回false, 检查输出
if (board[0] and board[1] and board[2] == 'X') or (board[0] and board[1] and board[2] == 'O') :
return winner==1
在上面的代码中,即使索引0,1和2是X,它也会将获胜者返回为false。
我认为这是一个简单的字符串处理问题,但我不太确定。 任何帮助,将不胜感激。
尝试使用的if语句如下: all
将是True
,如果所有的3个元素board
或者是X
。 这同样适用于O
if all(board[i]=='X' for i in range(3)) or all(board[i]=='O' for i in range(3)):
return winner==1
要覆盖垂直,水平和对角线,您可以为每个方向建立轴位置列表,并检查它们中的任何一个是否映射到XXX或OOO:
axes = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]
win = any(board[a]+board[b]+board[c] in ["XXX","OOO"] for a,b,c in axes)
如果您想让计算机玩游戏,您可以创建一个移动评级功能,分析每个可玩位置并返回与位置有多好的数字。
这是一个例子:
from random import sample
axes = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]
def isWin(board):
return any(board[a]+board[b]+board[c] in ["XXX","OOO"] for a,b,c in axes)
def rating(position,play,board,level=3**6): # 3**6=Invincible, 3**4=hard, 3**1=Easy
if board[position] != " " or level < 3: return 0
newBoard = board[:position]+[play]+board[position+1:]
if isWin(newBoard): return level*2
nextRatings = [rating(p,"XO"[play=="X"],newBoard,level/3) for p in range(9)]
return level-max(nextRatings,key=abs)
while True:
board = [" "]*9
player,computer = sample("XOXO",2)
while True:
for r in range(0,9,3):
print("("+") (".join(board[r:r+3])+")",list(range(r+1,r+4)))
available = [str(p+1) for p in range(9) if board[p] == " "]
if isWin(board) or not available : break
player = "XO"[player=="X"]
if player == computer:
position = max(sample(range(9),9),key=lambda p:rating(p,computer,board))
print(f"Computer plays {player} at {position+1}")
else:
while True:
position = input(f"Position to play for {player}: ")
if position not in available: print("Invalid position")
else : position = int(position)-1; break
board[position] = player
print( f"{player}'s WIN !!!\n" if isWin(board) else "DRAW.\n")
rating()
函数通过可能的移动递归地返回一个值,该值基于到达游戏结束所需的移动次数而变得越来越小。 每个级别的值都会根据哪个玩家的回合加或减
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.