Напишите такую функцию computer_move(), которая сделала бы стратегию компьютера безупречной. Проверьте, можно ли создать непобедимого противника.
Да, можно.
Поискав примеры в интернете, может кто-то уже пытался это сделать и мы возьмем его алгоритм. Их много, выделю основные.
Вот пример на С#, его мы и возьмем за основу.
Ну а по самой теории, можно почитать здесь.
Прочитав все, мы имеем два варианта.
Либо пишем максимально разветвленную структуру в зависимости от хода человека (не сложно, но много писать).
Либо улучшаем параметр BEST_MOVES на основе вычитанной стратегии, присваивая ему значения (5, 0, 8, 6, 2, 1, 3, 7, 5) вместо (4, 0, 2, 6, 8, 1, 3, 5, 7).
После этого, я много раз пытался его победить, но не получилось. Так что может это и есть безпроигрышная стратегия.
Да, можно.
Поискав примеры в интернете, может кто-то уже пытался это сделать и мы возьмем его алгоритм. Их много, выделю основные.
Вот пример на С#, его мы и возьмем за основу.
Ну а по самой теории, можно почитать здесь.
Прочитав все, мы имеем два варианта.
Либо пишем максимально разветвленную структуру в зависимости от хода человека (не сложно, но много писать).
Либо улучшаем параметр BEST_MOVES на основе вычитанной стратегии, присваивая ему значения (5, 0, 8, 6, 2, 1, 3, 7, 5) вместо (4, 0, 2, 6, 8, 1, 3, 5, 7).
После этого, я много раз пытался его победить, но не получилось. Так что может это и есть безпроигрышная стратегия.
я методом научного тыка нашел другой споособ
ОтветитьУдалитьв функции winner(board) надо закоментировать последнюю строку return None? после э\того мне удалось только выходить в ничью
Немного отредактировал текст, пробелы поплыли.
ОтветитьУдалитья столкнулся с другой проблемой, по ходу игры комп не видит моих правильных ответов,
O | | O
---------
| X | X
---------
| |
Твой ход. Выбери от 0 до до 8:
это второй ход, на третьем я вроде бы должен выиграть, но нет
Твой ход. Выбери от 0 до до 8:
3
Ладно...
O | | O
---------
X | X | X
---------
| |
Я выберу поле номер 1
O | O | O
---------
X | X | X
---------
| |
Три O в ряд!
Я победил!
Не пойму в чем дело, несколько раз перепечатывал код, одна и та же хрень.
Это только у меня?
млять, один хрен
Удалитьпостараюсь исправить:
1)
O |__| O
---------
__| X | X
---------
__|__|__
2)
O |__| O
---------
X | X | X
---------
__|__|__
3)
O | O | O
---------
X | X | X
---------
__|__|__
немного криво, но без нижних подчеркиваний, все съезжает к херам, но думаю суть понятна
Да нет, здесь в блогспоте постоянно код съезжает, я тоже замучался раньше, сейчас просто выкидываю в html редакторе, а не в визуале.
УдалитьЕсли хотите код для сравнения скинуть, выложите на стороннем ресурсе (их полно) и ссылку на код сюда.
суть в том, что IDE не видит моих правильных ответов, я выкладываю три "Х" подряд, а он продолжает игру. Перепроверял код, все как в учебнике, однако мои ответы все равно не видит, только ответы компьютера.
УдалитьВот в чем вся шляпа
Пошли файлик с кодом мне на почту abrashitov@gmail.com если есть желание разобраться)
Удалитьотправил
УдалитьЕсли BEST_MOVES = (5,0,8,6,2,1,3,7,5), а хожу первым я, то стратегия на победу такая (мои ходы): 6 0 4 8.
ОтветитьУдалитьПроверь! Может я код не так с книги списал.) Но если все правильно я написал, то смена кортежа - не решение задачи!))
Решал, разветвляя def computer_move.
ОтветитьУдалитьПсевдокод.
# если комп пошел первым
# пока "4" свободно
# начинаем с угла (например с "0") и т.д. по кортежу (0, 2, 6, 8, 4, 1, 3, 5, 7)
# проверяем, может ли комп выиграть след. ходом
# блокируем юзера, если он может выиграть след. ходом
# если никто следующим ходом не выиграет, перебираем кортеж
# если "4" занято
# следующим ходом после "0" делаем противоположный угол ("8"), далее по кортежу (0, 8, 2, 6, 1, 3, 5, 7)
# проверяем, может ли комп выиграть след. ходом
# блокируем юзера, если он может выиграть след. ходом
# если никто следующим ходом не выиграет, перебираем кортеж
# если юзер пошел первым
# если юзер не занял середину
# занимаем середину, далее по кортежу (4, 0, 2, 6, 8, 1, 3, 5, 7)
# проверяем, может ли комп выиграть след. ходом
# блокируем юзера, если он может выиграть след. ходом
# если никто следующим ходом не выиграет, перебираем кортеж
# если юзер сразу занял середину
# кортеж (0, 2, 6, 8, 1, 3, 5, 7)
По крайней мере, комп вроде не проигрывает.
Сорри, не разобрался, как сохранить отступы при копировании.
https://pastebin.com/w88vc0uQ
ОтветитьУдалитьУсловия по выше написанному псевдокоду. Вроде так, вроде не проигрывает
Нет, проигрывает, хреновое условие, ну по факту действительно дополнительные условия по изменению кортежа нужны
ОтветитьУдалить# Либо улучшаем параметр BEST_MOVES на основе вычитанной стратегии, присваивая ему значения (5, 0, 8, 6, 2, 1, 3, 7, 5) вместо (4, 0, 2, 6, 8, 1, 3, 5, 7).
ОтветитьУдалитьСделала комп с первого раза по твоей стратегии, ходила первая ходы такие были: 0, 6, 4, 8.
Я вывела такую стратегию BEST_MOVES = (8, 4, 6, 7, 0, 1, 7, 4, 0, 5, 2), пока что ни разу не победила.