Ты импортируешь 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., если тебе нужен полный код функции, ответь на этот комм.