Проверьте, была ли позиция уже занята крестики-нолики

#python #python-3.x #tic-tac-toe

#python #python-3.x #крестики-нолики

Вопрос:

 Board = [1,2,3,4,5,6,7,8,9]
print(Board[0], '|', Board[1], '|', Board[2])
print(Board[3], '|', Board[4], '|', Board[5])
print(Board[6], '|', Board[7], '|', Board[8])
Player_Input = int(input("Choose a number between 1-9: "))
while Board[Player_Input - 1] == Player_Input:
    Board[Player_Input - 1] = 'X'
 

Итак, это краткий пример кода, который работает в моей программе.

 while Board[Player_Input - 1] != Player_Input:
    Player_Input = int(input("Already taken. Choose another position: "))
 

Я пытался использовать эти 2 строки, чтобы проверить, занята ли уже позиция, но это почему-то не работает. Я также пытался использовать это:

 while Board[Player_Input - 1] == 'X' or Board[Player_Input - 1] == 'O':
    Player_Input = int(input("Already taken. Choose another position: "))
 

Комментарии:

1. Как это «не работает»? Есть ли ошибка, или она ничего не делает, или что-то еще?

2. Нет, ошибки нет. Если я ввожу 1, а позиция 1 уже занята, она даже не просит меня ввести новый номер. Он остается там, как будто это бесконечный цикл

3. Показанные фрагменты кода 2 и 3 не будут автоматически переходить в бесконечный цикл. Проблема (по крайней мере частично) за пределами этого.

4. Проблема здесь в том, что вы вообще не должны использовать цикл — см. Мой Ответ ниже для более подробной информации.

5. Я думаю, я понимаю, к чему вы стремились.. вы хотели «повторять, пока они не сделают правильный выбор». Но это не то, что вы написали. Я немного отредактирую свой ответ, чтобы прояснить это.

Ответ №1:

Я думаю, что основная проблема заключается в том, что вы пытаетесь использовать while цикл для назначения 'X' выбранной ими позиции. Цель while цикла не в том, чтобы что-то делать с одной конкретной известной позицией в списке; это повторное выполнение чего-либо до тех пор, пока выполняется определенное условие. В вашем случае вы знаете, какое пространство выбрал игрок (на основе значения Player_Input ), поэтому использование while цикла — неправильный подход. Вместо этого просто проверьте, не было ли занято выбранное пространство ( Board[Player_Input - 1] ) , а затем присвоите значение.

Что-то вроде:

 if Board[Player_Input - 1] != 'X' and Board[Player_Input - 1] != 'O':
   Board[Player_Input - 1] = 'X'  # assuming 'X' is the human player
else:
    # Handle the case where the space is full here.
 

Редактировать:

Я думаю, теперь я могу понять, к чему вы стремились с циклом — вы хотите что-то вроде «повторять, пока они не сделают правильный выбор». Одним из вариантов было бы окружить код, который я написал выше, этим:

 while True: # Loop forever until we break out of it
    # Above code here
    if Board[Player_Input - 1] == 'X':
        break
 

Редактировать 2:

Это также должно сработать и, возможно, ближе к тому, что вы намеревались:

 # Player chooses a space
Player_Input = int(input("Choose a number between 1-9: "))

# Available spaces should contain the space number, not 'X' or 'O'
# while choice not available: have player choose again
# (Should also add a check for if the input is not 1-9)
while Board[Player_Input - 1] != Player_Input:
    Player_Input = int(input("Already taken. Choose another position: "))

# Now that we know they made a valid choice, we fill in the players letter
Board[Player_Input - 1] = 'X'
 

Комментарии:

1. Большое спасибо: D Это помогло мне решить проблему

Ответ №2:

 Board = [1,2,3,4,5,6,7,8,9]
count = 0
Player_Input = int(input("Choose a number between 1-9: "))
if Player_Input < 10 and Player_Input >= 1:
    for player in range(9):
        if Board[Player_Input - 1] == 'X' or Board[Player_Input - 1] == 'O':
            print('you cant use this number')
        if count % 2 == 0:
            Board[Player_Input - 1] = 'X'
        else:
            Board[Player_Input - 1] = 'O'
        def show():
            print(Board[0], '|', Board[1], '|', Board[2])
            print(Board[3], '|', Board[4], '|', Board[5])
            print(Board[6], '|', Board[7], '|', Board[8])
        print(show())
        Player_Input = int(input("Already taken. Choose another position: "))
        count = count   1
 

Комментарии:

1. Добро пожаловать в StackOverflow. Хотя этот код может решить вопрос, включение объяснения того, как и почему это решает проблему, действительно помогло бы улучшить качество вашего сообщения и, вероятно, привело бы к большему количеству голосов. Помните, что вы отвечаете на вопрос для читателей в будущем, а не только для человека, задающего сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются.