понедельник, 3 сентября 2018 г.

Майкл Доусон - Программируем на Python, ответ на 4-е задание 6-ой главы...

Напишите такую функцию computer_move(), которая сделала бы стратегию компьютера безупречной. Проверьте, можно ли создать непобедимого противника. 

Да, можно.
Поискав примеры в интернете, может кто-то уже пытался это сделать и мы возьмем его алгоритм. Их много, выделю основные.
Вот пример на С#, его мы и возьмем за основу. 
Ну а по самой теории, можно почитать здесь.

Прочитав все, мы имеем два варианта.
Либо пишем максимально разветвленную структуру в зависимости от хода человека (не сложно, но много писать).
Либо улучшаем параметр BEST_MOVES на основе вычитанной стратегии, присваивая ему значения (5, 0, 8, 6, 2, 1, 3, 7, 5) вместо (4, 0, 2, 6, 8, 1, 3, 5, 7).
После этого, я много раз пытался его победить, но не получилось. Так что может это и есть безпроигрышная стратегия.

12 комментариев:

  1. я методом научного тыка нашел другой споособ
    в функции winner(board) надо закоментировать последнюю строку return None? после э\того мне удалось только выходить в ничью

    ОтветитьУдалить
  2. Немного отредактировал текст, пробелы поплыли.

    я столкнулся с другой проблемой, по ходу игры комп не видит моих правильных ответов,
    O | | O
    ---------
    | X | X
    ---------
    | |

    Твой ход. Выбери от 0 до до 8:
    это второй ход, на третьем я вроде бы должен выиграть, но нет
    Твой ход. Выбери от 0 до до 8:
    3
    Ладно...

    O | | O
    ---------
    X | X | X
    ---------
    | |

    Я выберу поле номер 1

    O | O | O
    ---------
    X | X | X
    ---------
    | |

    Три O в ряд!

    Я победил!

    Не пойму в чем дело, несколько раз перепечатывал код, одна и та же хрень.
    Это только у меня?

    ОтветитьУдалить
    Ответы
    1. млять, один хрен
      постараюсь исправить:
      1)
      O |__| O
      ---------
      __| X | X
      ---------
      __|__|__

      2)
      O |__| O
      ---------
      X | X | X
      ---------
      __|__|__

      3)
      O | O | O
      ---------
      X | X | X
      ---------
      __|__|__

      немного криво, но без нижних подчеркиваний, все съезжает к херам, но думаю суть понятна

      Удалить
    2. Да нет, здесь в блогспоте постоянно код съезжает, я тоже замучался раньше, сейчас просто выкидываю в html редакторе, а не в визуале.
      Если хотите код для сравнения скинуть, выложите на стороннем ресурсе (их полно) и ссылку на код сюда.

      Удалить
    3. суть в том, что IDE не видит моих правильных ответов, я выкладываю три "Х" подряд, а он продолжает игру. Перепроверял код, все как в учебнике, однако мои ответы все равно не видит, только ответы компьютера.
      Вот в чем вся шляпа

      Удалить
    4. Пошли файлик с кодом мне на почту abrashitov@gmail.com если есть желание разобраться)

      Удалить
  3. Если BEST_MOVES = (5,0,8,6,2,1,3,7,5), а хожу первым я, то стратегия на победу такая (мои ходы): 6 0 4 8.
    Проверь! Может я код не так с книги списал.) Но если все правильно я написал, то смена кортежа - не решение задачи!))

    ОтветитьУдалить
  4. Решал, разветвляя 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)


    По крайней мере, комп вроде не проигрывает.

    Сорри, не разобрался, как сохранить отступы при копировании.

    ОтветитьУдалить
  5. https://pastebin.com/w88vc0uQ
    Условия по выше написанному псевдокоду. Вроде так, вроде не проигрывает

    ОтветитьУдалить
  6. Нет, проигрывает, хреновое условие, ну по факту действительно дополнительные условия по изменению кортежа нужны

    ОтветитьУдалить
  7. # Либо улучшаем параметр 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), пока что ни разу не победила.

    ОтветитьУдалить