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