Элементы первой строки соответствуют возможным ходам. У нас есть четыре возможных варианта ходов (1 красный, 2 красных, 1 синий, 2 синих), при этом ни один из вариантов хода не приводит к победе. Поэтому элементы 1, 2, 4, 5 первой строки имеют значение 0 (ход возможен, но не приводит к победе). Все остальные элементы первой строки имеют значение "-127" (ход не возможен). Вторая строка содержит результаты анализа возможного хода игрока. Как видно, элементы 2 и 5 содержат единицы. Это означает, что если мы сделаем ход, соответствующий ячейкам 2 или 5 первой строки (положим 2 синих или 2 красных шарика), то компьютер сможет сделать победный ход (положить 2 красных или 2 синих шарика соответственно).
Третья строка содержит четыре единицы (элементы 1, 2, 4 и 5). Тут нужны некоторые пояснения. С элементами 1 и 4 понятно – они означают, что какой бы ход ни сделал игрок (вторая строка массива), наш следующий ход будет победный. Но почему элементы 2 и 5 содержат единицы? Дело в том, что во время анализа просчитываем ВСЕ возможные ходы, в том числе и "глупые". Рассмотрим подробно второй столбец массива. Он соответствует ходу двумя красными шариками. Этот ход не приводит к победе (ноль во второй ячейке первой строки). После этого у игрока есть два варианта: положить один зеленый шарик ("глупый" ход), или положить два зеленых шарика (победа). Т. к. во время анализа в таблицу мы заносим информацию только о лучшем ходе, то вторая ячейка второй строки содержит "1". Единица в третьей строке появилась потому, что мы можем победить, если игрок положит один зеленый шарик. После этого нам нужно проанализировать данные в таблице.
Очевидно, что нужно сделать ход либо одним красным (ячейка 1 первой строки), либо одним синим (ячейка 4 первой строки), т. к. они однозначно приводят к победе. Я выполнил этот анализ следующим образом. В первую очередь создаем новый одномерный массив, каждая ячейка которого соответствует возможному ходу. Затем заполняем его по следующим правилам. Если элемент массива 1 содержит "-127", то мы копируем его в соответствующий элемент нового массива. Каждой строке массива 1 присваиваем определенные вес в порядке убывания (нижней строке соответствует – 1, предпоследней – 2 и т. д.). Далее суммируем элементы столбца, учитывая их вес, т. е. при суммировании мы умножаем число на его вес, кроме этого элементы четных строк нужно умножить на "-1" (например, для второго столбца в нашем примере нужно вычислить выражение 0*3 + (-1)*2 + 1*1). В результате получится, что максимальное значение будут иметь те элементы, соответствующие столбцы которых, содержат "1" в нечетных строках (наш ход). При этом число будет тем больше, чем ближе единица к первой строке.
1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 |
1 | -1 | -127 | 1 | -1 | -127 | -127 | -127 | -127 |
Массив 2 Далее нам остаётся только найти максимальный элемент в массиве 2 (если их несколько – выбираем любой случайным образом). Этот элемент соответствует оптимальному ходу. Программа состоит из следующих частей: – модуля главной формы; – модуля окна "О программе"; – модуля окна "Настройки"; – модуля окна "Результаты"; – класса Player (файлы "Player. cpp", "Player. h"); – класса Basket (файлы "Basket. cpp", "Basket. h"). Как вы понимаете, наибольший интерес представляют последние два. Класс Basket предоставляет функции необходимые для работы с корзиной (в файле "Basket. h" перед объявлением каждой функции описано ее назначение). Экземпляр класса Player можно использовать только с уже созданным экземпляром класса Basket. Класс Player выполняет функции компьютерного игрока (анализ хода и сам ход). Использовать классы очень просто. Сначала нужно создать класс Basket. При его создании можно указать начальное количество шариков. Далее создаем класс Player, ему нужно передать указатель на экземпляр класса Basket, и указать глубину анализа (подробнее в файле "Player. h"). После этого для выполнения компьютером очередного хода нужно вызывать функцию NextStep класса Player. Пример: