Вопрос Что не так в моем коде? крестики - нолики на python

Регистрация
22 Ноя 2013
Сообщения
86
Репутация
0
Спасибо
0
Монет
0
Здравствуйте! Я делаю игру "Крестики - Нолики" на Python.

Код у меня частично работает.

В чем все таки проблема?



Я хожу крестиком.

Компьютер ходит Ноликом, все работает, но почему то нолик иногда не ставится на поле, почему так?



Вот код:



import random as r

import time





# Игровое поле

playing_field = [

[[],[],[]],

[[],[],[]],

[[],[],[]]

]



# Флаги

win = False

lose = False





def game():

# Вывести игровое поле в столбик

for i in playing_field:

print(i)



while True:

movie()





def movie():

"""Основной геймплей."""

print("Ваш ход: \n")

try:

a = int(input("Укажите строку: "))

b = int(input("Укажите место: "))

robot_a = r.randint(1, 3)

robot_b = r.randint(1, 3)

except:

print("\n Ошибка! \n")





try:

# [a - 1][b - 1] Чтобы индекс совпадал с номером строки и места.

# Проверка имеется ли "X" или "O", если нет - ставится "X"

if playing_field[a-1][b-1] == "X" or playing_field[a - 1][b - 1] == "O":

print("\n Ошибка! \n")

movie()

else:

playing_field[a - 1][b - 1] = "X"



!!! ВАЖНОЕ МЕСТО !!!

# Проверка имеется ли "X" или "O", если нет - ставится "O"

while playing_field[robot_a-1][robot_b-1] != "O":

if playing_field[robot_a-1][robot_b-1] == "X" or playing_field[robot_a - 1][robot_b - 1] == "O":

robot_a = r.randint(1, 3)

robot_b = r.randint(1, 3)

else:

playing_field[robot_a-1][robot_b-1] = "O"



for i in playing_field:

print(i)

except:

print("\n Ошибка \n")

movie()



С "X" все в порядке, а с "O" не очень.



Это не полный код, так как он не поместился (ну там всеравно дальше идет просто условие выигрыша), главное находится в movie().



Пожалуйста подскажите что не так!
 
Проблема в вашем коде возникает в следующем участке:

while playing_field[robot_a-1][robot_b-1] != "O":if playing_field[robot_a-1][robot_b-1] == "X" or playing_field[robot_a - 1][robot_b - 1] == "O":robot_a = r.randint(1, 3)robot_b = r.randint(1, 3)else:playing_field[robot_a-1][robot_b-1] = "O"
Проблема состоит в том, что цикл while проверяет условие playing_field[robot_a-1][robot_b-1] != "O", но не предусмотрено условие, при котором цикл прерывается, если достигнуто максимальное количество попыток для установки "O". Это может приводить к бесконечному циклу, когда все места на игровом поле уже заняты.

Рекомендуется добавить переменную для отслеживания количества попыток установки "O" и ограничить это количество. Например, вы можете добавить счетчик attempt и проверить его значение внутри цикла while. Если количество попыток превышает определенное число (например, 10), выходить из цикла.

Вот пример исправленного кода для этой части:

attempt = 0while playing_field[robot_a-1][robot_b-1] != "O":if playing_field[robot_a-1][robot_b-1] == "X" or playing_field[robot_a - 1][robot_b - 1] == "O":robot_a = r.randint(1, 3)robot_b = r.randint(1, 3)attempt += 1if attempt > 10:breakelse:playing_field[robot_a-1][robot_b-1] = "O"breakТаким образом, код будет проверять количество попыток и прерывать цикл, если оно превышает 10. Это предотвратит зацикливание программы и позволит установить "O" на доступное место, если оно есть.
 
Проблема с вашим кодом заключается в блоке while-цикла, который отвечает за размещение символа "O" на поле. Код выбирает случайные индексы robot_a и robot_b, и затем пытается разместить символ "O" в ячейке с этими индексами. Однако, если первоначально выбранные индексы указывают на ячейку, которая уже занята символом "X" или "O", код не обновляет индексы и остается в бесконечном цикле.

Вам необходимо обновить блок while-цикла, чтобы он продолжал генерировать новые случайные индексы до тех пор, пока не будет найдена свободная ячейка. Здесь приведен обновленный код для этого блока: while playing_field[robot_a-1][robot_b-1] == "X" or playing_field[robot_a-1][robot_b-1] == "O":
robot_a = r.randint(1, 3)
robot_b = r.randint(1, 3)
playing_field[robot_a-1][robot_b-1] = "O"

В этом случае, код будет генерировать новые случайные индексы, пока не будет найдена свободная ячейка, а затем разместит символ "O" в этой ячейке.

Обратите внимание, что я также переместил строку playing_field[robot_a-1][robot_b-1] = "O" внутрь цикла, чтобы символ "O" размещался только после того, как будет найдена свободная ячейка.

Надеюсь, это поможет исправить проблему с размещением символа "O" на поле в вашей игре "Крестики - Нолики"!

-------------
Как правило не пользуюсь нейросеткой на этом проекте. Но возможно именно в этом вопросе она поможет. Успехов.
 
ну как минимум тут пробелов нету на маиле
 
Зачем ты играешь к крестики нолики когда уже вышел симулятор чистинья зубов и симулятор камня
 
Назад
Сверху