Python

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

Здравствуйте! Я делаю игру "Крестики - Нолики" на 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().

Пожалуйста подскажите что не так!
AT
Anzor Tabidze
167
Проблема с вашим кодом заключается в блоке 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" на поле в вашей игре "Крестики - Нолики"!

-------------
Как правило не пользуюсь нейросеткой на этом проекте. Но возможно именно в этом вопросе она поможет. Успехов.
Евгений Константинов
Евгений Константинов
15 278
Лучший ответ
Anzor Tabidze Спасибо вам, это именно тот код и та задумка которую я хотел
Проблема в вашем коде возникает в следующем участке:

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 = 0
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)
attempt += 1
if attempt > 10:
break
else:
playing_field[robot_a-1][robot_b-1] = "O"
break
Таким образом, код будет проверять количество попыток и прерывать цикл, если оно превышает 10. Это предотвратит зацикливание программы и позволит установить "O" на доступное место, если оно есть.
Anzor Tabidze Спасибо за ответ
ну как минимум тут пробелов нету на маиле
Ermek Sharshenaliev
Ermek Sharshenaliev
575
Зачем ты играешь к крестики нолики когда уже вышел симулятор чистинья зубов и симулятор камня
Anzor Tabidze Это итоговый проект на занятии