Как проверить определенные элементы списка на строковое значение? - PullRequest
0 голосов
/ 28 мая 2019

Итак, я кодирую Tic Tac Toe

Я создал среду в виде списка из 9 элементов, как показано ниже -

board=[' ']*9

Затем я помещаю X или O в доску

board[move-1] = 'X'

, который работает нормально

Проблема, с которой я столкнулся, заключается в том, что после размещения X или O я не могу проверить условие выигрыша.Выходные данные всегда возвращаются как ложные проверьте выходные данные здесь

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, он возвращает победителя как ложное.

Я думаю, что это простая проблема обработки строк, но я не совсем уверен.Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Чтобы покрыть вертикаль, горизонталь и диагональ, вы можете составить список позиций осей для каждого направления и проверить, соответствуют ли какие-либо из них XXX или ООО:

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() рекурсивно просматривает возможные ходы, возвращая все меньшее и меньшее значение в зависимости от количества ходов, необходимых для достижения конца игры.Значение каждого уровня прибавляется или вычитается в зависимости от того, какой ход игрока равен

0 голосов
/ 28 мая 2019

Попробуйте использовать следующее для операторов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...