Я беру поле номером 1
O | X | X
----------
| X | O
----------
O | | X
Твой ход. выбери одно из полей (0 - 8): 3
ладно...
O | X | X
----------
O | X | O
----------
O | | X
Я беру поле номером 7
O | X | X
----------
O | X | O
----------
O | X | X
ничья
ничья
тут победитель человек, и компьютер не должен был делать последний ход.
Мне кажется return None в winner() нужно сдвинуть влево, чтобы он был не в цикле а в конце функции.
И юниттесты тоже помоглы бы, с их помощью можно потестировать расчет победителя задавая конфигурацию доски.