簡體   English   中英

如何檢查列表中特定元素的字符串值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM