Ваша проблема - застревание в бесконечном состоянии, что означает, что вы продолжаете рекурсивно вызывать функцию, пока не достигнете предела рекурсии. Ваша проблема заключается в функции игрока и в том, как вы решаете, чей ход следующий. После того, как О играет в позиции 0,0, а Х играет в позиции 0,1, вы пытаетесь решить, кто будет играть дальше
Итак, вы считаете, и О и Х поставили по 1 жетону каждый. Однако ваша логика c, чтобы решить, кто следующий, не учитывает это состояние платы.
if x_counter == 0 and o_counter == 0:
return 'O'
elif x_counter > o_counter:
return 'O'
elif o_counter > x_counter:
return 'X'
, поэтому, когда x_counter и y_counter равны, но не равны 0, вы ничего не возвращаете. Это приводит к тому, что функция None не возвращает значение. Таким образом, вы застряли и никогда не поместите токен в положение 0,2. Если O всегда идет первым, то в любое время x_counter == o_counter вы должны вернуть '0', поэтому измените его на
if x_counter == o_counter:
return 'O'
elif x_counter > o_counter:
return 'O'
elif o_counter > x_counter:
return 'X'