Изменение списка вне цикла «Пока» после его запуска через цикл «Пока» - PullRequest
0 голосов
/ 27 ноября 2018

В настоящее время я пытаюсь создать свою собственную игру TicTacToe с нуля, и в настоящее время у меня возникают трудности с циклом while, соответствующим списку, который я создал.Я использую следующий список:

board = [1,2,3,4,5,6,7,8,9]

, чтобы отметить все 9 слотов в игре TicTacToe 3x3.Однако, когда игрок 1 делает ход (например, в слоте '1'), список должен быть изменен так, чтобы он показывал

board = [X,2,3,4,5,6,7,8,9]

Это должно продолжаться до тех пор, пока все 9 индексов (я считаю, что это подходящий термин) в пределахсписок должен быть занят либо 'X', либо 'O', что равняется ничьей в игре!

Пока я просто экспериментирую, пока иду вперед, извините за остальную часть кода, но полныйкод, который я использую:

board = [1,2,3,4,5,6,7,8,9]
def CreateBoard(board):
    print('   |   |')
    print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])
    print('   |   |')
    print('-----------')
    print('   |   |')
    print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])
    print('   |   |')
    print('-----------')
    print('   |   |')
    print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])
    print('   |   |')

PlayerOne = 'X'
Turn = 'player one'
GameRunning = True



while [0] == 1 or 2 or 3 or 4 or 5 or 6 or 7 or 8 or 9 in board == True:
    if Turn == 'player one':
       letter = 'X'
       Move = input("Please pick where to go next: ")
       Move = int(Move)
       if Move in board:
          board.insert(Move, letter)
          board.remove(Move)
          print(board)
          Turn = 'player two'




       else:
          print("This move is invalid")

  if Turn == 'player two':
     letter = 'O'
     Move = input("Pick where to go next: ")
     Move = int(Move)
     if Move in board:
        board.insert(Move, letter)
        board.remove(Move)
        print(board)
        Turn = 'player one'


     else:
         print("This move is invalid")

Вывод, который я получаю по ходу: enter image description here

Я предполагаю, что цикл while работаетсписок, который находится за пределами цикла, но я пытаюсь найти способ изменить это!Я также еще не выяснил, почему его печать «Этот ход недействителен»!

1 Ответ

0 голосов
/ 27 ноября 2018

Проблема с вашим циклом while в том, что ненулевые целые числа всегда считаются «истинными».Поэтому

while [0] == 1 or 2 or 3 or 4 or 5 or 6 or 7 or 8 or 9 in board == True:

фактически означает «в то время как список, содержащий 0, равен целому числу 1 (всегда ложь), или 2 (истина), или 3 (истина) ... или 9 в (правление) (true, если 9 все еще находится на доске), затем введите блок. "

Я полагаю, что вы имели в виду больше:

while any((cell in range(1,10) for cell in board)):

, что означает, что любая ячейка на доске находится вдиапазон от 1 (включительно) до 10 (исключая), затем введите блок.

Посмотрите на этот код:

player = [
    {"name": "Player One", "letter": "X"},
    {"name": "Player Two", "letter": "O"},
]


def print_board(board):
    def print_vbars():
        print("   |   |")
    def print_hbars():
        print("-----------")

    print_vbars()
    for row in range(3):
        print(" {} | {} | {}".format(*(board[row*3 : row*3+3])))
        print_vbars()
        print_hbars()
        print_vbars()
    print_vbars()


def final_state(board):
    winning_combinations = (
        (0,1,2), # Horizontal top row
        (3,4,5), # Horizontal middle row
        (6,7,8), # Horizontal bottom row
        (0,3,6), # Vertical left row
        (1,4,2), # Vertical middle row
        (2,5,7), # Vertical right row
        (0,4,8), # Downward diagonal
        (2,4,6), # Upward diagonal
    )
    for letter in ("X", "O"):
        for combination in winning_combinations:
            row_state = (board[index] for index in combination)
            if all(map(lambda cell: letter == cell, row_state)):
                return "{} wins".format(letter)

    if all(map(lambda cell: cell in ("X", "O"), board)):
        return "Game is a draw."

    return False


def play_game():
    board = list(range(9))
    starting_player = 0
    turn = 0
    active_player = starting_player
    while final_state(board) is False:
        turn += 1
        print("Turn {}:".format(turn))
        print_board(board)
        name, letter = player[active_player]["name"], player[active_player]["letter"]
        move = None
        while move is None:
            try:
                move = input("{} please make your move: ".format(name))
                move = int(move)
                if move in board:
                    board[move] = letter
                    print("{} played {} on {}.".format(name, letter, move))
                    active_player = 1 - active_player
                else:
                    print("Move {} is invalid.".format(move))
                    move = None
            except Exception as e:
                    print("Move {} is invalid.".format(move))
                    move = None
    print_board(board)
    print(final_state(board))


if __name__ == "__main__":
    play_game()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...