Здравствуйте! Я делаю игру "Крестики - Нолики" на 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().
Пожалуйста подскажите что не так!
	
	
	Python
	
		
		
								
				
																				
							
								
				
																				
							
								
				
								
				
																				
							
			
	
		
			Что не так в моем коде? Крестики - Нолики на python
Проблема с вашим кодом заключается в блоке while-цикла, который отвечает за размещение символа "O" на поле. Код выбирает случайные индексы robot_a и robot_b, и затем пытается разместить символ "O" в ячейке с этими индексами. Однако, если первоначально выбранные индексы указывают на ячейку, которая уже занята символом "X" или "O", код не обновляет индексы и остается в бесконечном цикле. 
 
Вам необходимо обновить блок while-цикла, чтобы он продолжал генерировать новые случайные индексы до тех пор, пока не будет найдена свободная ячейка. Здесь приведен обновленный код для этого блока:
В этом случае, код будет генерировать новые случайные индексы, пока не будет найдена свободная ячейка, а затем разместит символ "O" в этой ячейке.
 
Обратите внимание, что я также переместил строку playing_field[robot_a-1][robot_b-1] = "O" внутрь цикла, чтобы символ "O" размещался только после того, как будет найдена свободная ячейка.
 
Надеюсь, это поможет исправить проблему с размещением символа "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" на поле в вашей игре "Крестики - Нолики"!
-------------
Как правило не пользуюсь нейросеткой на этом проекте. Но возможно именно в этом вопросе она поможет. Успехов.
								
									Anzor Tabidze								
								Спасибо вам, это именно тот код и та задумка которую я хотел							
											Проблема в вашем коде возникает в следующем участке:
Проблема состоит в том, что цикл while проверяет условие playing_field[robot_a-1][robot_b-1] != "O", но не предусмотрено условие, при котором цикл прерывается, если достигнуто максимальное количество попыток для установки "O". Это может приводить к бесконечному циклу, когда все места на игровом поле уже заняты.
 
Рекомендуется добавить переменную для отслеживания количества попыток установки "O" и ограничить это количество. Например, вы можете добавить счетчик attempt и проверить его значение внутри цикла while. Если количество попыток превышает определенное число (например, 10), выходить из цикла.
 
Вот пример исправленного кода для этой части:
				
									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" на доступное место, если оно есть.
								
									Максим Матюшин								
								chatgpt moment							
																				
								
									Anzor Tabidze								
								Спасибо за ответ							
											ну как минимум тут пробелов нету на маиле
				
							Зачем ты играешь к крестики нолики когда уже вышел симулятор чистинья зубов и симулятор камня
				
									
								
									Anzor Tabidze								
								Это итоговый проект на занятии							
											Похожие вопросы
- Переписать код из С++ в Python
- Крестики Нолики с ИИ в питоне помогите сделать, версии из интернета работают некорректно
- Подскажите что не так с кодом? Метод хорд на Python.
- Можете помочь! Нужен код для Python, что бы он заменял определенный текст в файле
- Где ошибка в коде? (Python)
- Python удаление кода через некоторое промежуток времени
- Помощь с Python Завершение после выполнения части кода
- Можно ли создать свой редактор кода на PYTHON?
- Помогите написать программу на Python, моя версия кода на скрине, вроде всё работает, но автопроверка не проходит.
- Проблема с кодом в Python
 
						 
						