• Python создать функцию крестики-нолики с ИИ?

    D1os
    @D1os
    Начинающий программист
    Ты импортируешь randint из модуля random.
    from random import randint

    При этом у тебя присутствует строка:
    rchoice = random.choice(board)

    Либо добавляй from random import choice, либо импортируй всю библиотеку.
    Но это так, не по теме.
    По поводу функции. Я бы сделал validate функцией, которая без всяких raise'ов проверяет значение на True или False и возвращает их вместе с ошибкой. Тогда эту функция можно будет использовать для проверки.
    def validate(value=""):
        if value.isdigit():
            if int(value) in available_turns and board[int(value)] not in ["X", "O"]:
                return True
        print("Invalid input!")
        return False

    Теперь эта функция проверяет ввод и возвращает истину только в верном случае. Соответственно, мы можем использовать её как логическое выражение.
    if validate(choise):
        input_error = False

    Далее computer. Тут допущена одна критическая ошибка: ты вызываешь validate() без аргумента.
    validate()

    Следовательно, функция всегда будет вызывать ошибку, т.е. нельзя преобразовать value = " " в число командой int(value) :)
    if validate(rchoice):
        flag = False

    Также, можно ускорить сам алгоритм нахождения случайного числа, использую массив доступных клеток, как сказал iddqda. У тебя есть список available_turns. В него можно запихнуть не иксы, а цифры от 0 до 8 - координаты полей, и каждым ходом удалять из него числа ходов (choice, rchoice). Проверке в validate это не навредит. Далее мы его используем в "вычислениях" хода компьютера.
    rchoice = choice(available_turns)    # Если from random import choice

    И он сразу найдёт случайное правильное число, а не будет по 300 раз находить одно и то же)
    Есть ещё маленькая поправка, не влияющая на функционал: если переменная имеет значения не 0, True или строка как минимум с 1 символом, она будет считаться как True в логическом типе. Соответственно её можно вставлять в условие, как
    v = "Hi!"
    if v:
        print("Variable is true!")    # Вывод: Variable is true!

    У тебя в коде можно заменить
    if is_winner == True:

    на
    if is_winner:
    Тоже в конце. А также, current_player у тебя либо 1, либо 0. Значит, это тоже true, false.
    if current_player:
        flag = True
        # И так далее

    И ещё кое-что :) желательно функции написать вне главного цикла while. Это не влияет на функционал, но код станет чуток приличнее.
    P.s., если тебе нужен полный код функции, ответь на этот комм.
    Ответ написан
    4 комментария