Меню Рубрики

Установка игровая крестики нолики

Обучение с подкреплением на примере игры «крестики-нолики»

Поготовка

  • Агент ходит первым и играет «крестиками».
  • Агент будет принимать только решения имеющие максимальную ценность.
  • С 5% вероятностью агент будет принимать зондирующие решения.
  • Только в случае выигрыша агента, он получает вознаграждение.

Следующим этапом необходимо подготовить функцию ценности для агента. В нашем случае, функцией ценности будет являться таблица состояний игры, в которой значение от 0 до 1 будет указывать что то или иное состояние «лучше» другого. Изначально зададим в нашей таблице что все выигрышные комбинации (три крестика в ряд, столбец или по диагонали) дают вероятность равную 1. Аналогично, всех состояний с тремя нулями — 0. Для всех прочих состояний вероятность — 0,5.

состояний. Конечно же, половина этих комбинаций невозможна, но и оптимизации кода в целях не стояло.

Ход игры

Оппонетном будет являться человек, который соответственно будет играть за нолики и периодически поддаваться. В ходе игры будет происходить изменение ценности ее состояний. Для того, чтобы правильно оценить действия агента, необходимо записывать последовательность тех состояний, которые он выбрал и по окончании игры перерасчитать их. Формула расчета ценности V(s) будет иметь следующий вид:

,

где А — размер шага, влияющего на скорость обучения. V(s’) — ценность действия по окончанию игры (1 — если выиграл, 0 — иначе).

Размер шага влияет на то, будет ли меняться стратегия оппонента или нет. Если необходимо учитывать изменчивость стратегии, то необходимо оставить размер шага константой. Иначе при уменьшении шага до нуля агент остановит свое обучение.

Использование зондирующих ходов (не имеющих высокую ценность) позволяет проверить состояния, которые ввиду высокой ценности других ходов никогда бы не исполнились, что дает небольшой шанс на изменение стратегии в выигрышную сторону.

В выше расположенном коде происходит отбор возможных ходов (состояния в которых элементы идентичны текущему состоянию поля, а также присутствует еще один крестик). Затем из полученных состояний выбирается либо произвольный ход (с вероятностью 5%), либо «жадный» ход (с максимальной ценностью). По окончании выбора, данный ход записывается в отдельный массив сделанных ходов.

По окончании игры происходит как уже сказано перерасчет ценности сделанных ходов.

В данном примере был кратко рассмотрен один из аспектов обучения с подкреплением. Если обычно агент контактирует со средой, то в данном примере обучение осуществлялось с игроком-противником. Хотя этот пример довольно прост, может показаться что данный метод на других примерах будет очень ограничен чем это есть на самом деле.

источник

Разработка программы-игры «Крестики-нолики»

Разработка программы логической игры в «крестики-нолики» пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.

2. Алгоритмическое конструирование

3. Программное проектирование

Список использованной литературы

На данный момент существует великое множество компьютерных игр, так же разнообразны подходы в их создании.

Например, популярные в последнее время небольшие игры (чаще всего многопользовательские, через сеть Интернет) создаются по технологии Flash с использованием языка ActionScript. Такие игры крайне популярны на разнообразных развлекательных интернет-ресурсах и а социальных сетях.

Большие, сложные игры с реалистичной 3D графикой пишутся на C++, отдельные модули к ним могут быть написаны на других языках (например AI — «искусственный интеллект» — на Lisp). Вообще, язык для создания игры выбирается как компромисс между требованиями к игре, к компьютерному железу и к стоимости разработки.

На подавляющем большинстве мобильных телефонов установлены ARM процессоры. Поэтому игры для мобильных телефонов на платформе Java пишутся на специальном языке для мобильных телефонов MobileBasic, а также на диалекте языка Pascal — MIDletPascal.

Также существуют специальные программы для написания игр. Яркий пример — программа GameMaker, автором которой является Марк Овермас. Эта программа позволяет написать захватывающую игру даже без знания языков программирования!

В рамках курсовой работы необходимо разработать небольшую программу игры в «крестики-нолики» пять в ряд на поле размера 15х15 клеток с применением графики на языке высокого уровня с использованием объектно-ориентированного программирования.

«Крестики-нолики» — популярная игра людей всех возрастов. Она отличается простотой, способствует развитию внимания и элементарной логики. В данной работе эта игра реализована на языке Pascal.

Для реализации этой задачи использовался язык программирования Pascal и среда разработки PascalABC.Net — оболочка, основанная на Delphi (Object Pascal) и сочетающая простоту языка Паскаль и огромные возможности платформы .NET (платформа от корпорации MicroSoft).

Читайте также:  Установка перегородки из газобетона

Крестики-нолики — логическая игра между двумя противниками на квадратном поле 3 на 3 клетки или боольшего размера (вплоть до «бесконечного поля»). Один из игроков играет «крестиками», второй — «ноликами».

Классические «крестики-нолики» на поле 3×3 не представляют никакого практического интереса — общеизвестен алгоритм, который при правильной игре гарантирует ничью любой стороне, а при ошибке противника позволяет выиграть. Таким образом, игра находится в состоянии «ничейной смерти».

Передо мной стояла задача разработать небольшую программу игры в крестики-нолики пять в ряд на поле размера 15х15 клеток с применением графики, c ожиданием хода от очередного игрока не более 1-ой минуты.

Игра ведется на поле 15х15, разлинованном в клетку, рассчитана на 2-х игроков. Первый ход совершает пользователь, играющий крестиками. Перед игрой противники решают, кто будет играть крестиками, а кто ноликами. В ходе игры противники ставят по очереди крестик или нолик (в зависимости от договоренности перед началом игры) в свободную клетку на поле.

Цель игры — построить линию из 5 стоящих рядом по вертикали, горизонтали или диагонали крестиков или ноликов. Первый игрок, построивший такую комбинацию из знаков своего типа (крестиков или ноликов) выигрывает.

Если свободные клетки поля закончились, но никто из игроков не одержал победы, то считают, что игра закончилась «ничьей».

Компоненты, которые должны входить в приложение можно стандартно разделить на две составляющие: интерфейс и программная часть.

В интерфейсе должно присутствовать игровое поле, возможность выбирать нужную ячейку клавишами навигации, при нажатии на соответствующую клавишу заносить знак “Х” или ”О”, выводиться информация о ходе игры и пр.

Программно игра должна быть реализована с использованием двумерного массива, представляющий игровое поле. Каждый элемент массива представляет клетку поля. Индексы массива соответствуют положению клеток на поле.

Элемент массива может принимать следующие значения:

Алгоритм работы: производится перерисовка клеток игрового поля. В зависимости от значений массива выводится в клетку:

1 — крестик зеленым цветом;

Для каждой клетки на игровом поле просматриваются соседние клетки по горизонтали, вертикали, вниз и вправо, по диагонали. Если в одном из направлений символы во всех клетках на расстоянии до 4 совпадают с символом в текущей клетке, то игра считается выигранной.

1) Код нажатых клавиш клавиатуры.

1) Игровое поле, заполненное крестиками и ноликами, отображаемое на экране.

2) В случае выигрыша одного из игроков, вывод соответствующего сообщения и дополнительной информации.

Для всех операций были использованы стандартные возможности Паскаля, так что не понадобилось даже использования сторонних библиотек. Возможно, к списку сторонних модулей можно отнести модуль Timers (встроенный модуль в PascalABC.NET) для вывода оставшегося времени на совершение хода игрока.

Для написания интерфейса в работе использовался модуль GraphABC.

2. Алгоритмическое конструирование

В данном пункте приводится описание работы программы, об основных и вспомогательных функциях, о назначении массивов и методов, структуре алгоритма программы.

Структура программы состоит из двух классов: первый отвечает за интерфейс программы, второй — содержит основной алгоритм решения поставленной задачи. Оба класса имеют важное значение в программе.

Клетки, образующие игровое поле, задаются матрицей элементов размерностью 15х15.

Алгоритм выполнения очередного хода. Игрок выполняет очередной ход при нажатии клавиши “Enter” на игровом поле. При этом в массив, если данная ячейка не занята, заносится 1 или 2 в зависимости от того, кто выполняет ход на данный момент. Для прорисовки крестиков и ноликов используется процедура Symbol. Затем вызывается процедура Pobeditel, которая проверяет каждую ячейку массива на возможность выигрышной ситуации. На рис. 1 приведена блок-схема алгоритма основной программы.

программа алгоритм игра pascal

Рисунок 1 — Блок-схема алгоритма основной программы

Игрокам разрешается делать ход только через раз, тем самым соблюдая очередность выполнения хода. Каждый раз после выполнения очередного удачного хода переменная «i» увеличивается на единицу. Переменная «i» перед каждым ходом проверяется на четность: нечетна — ходят «крестики», четна — ходят «нули». Блок-схема реализации данного алгоритма представлена на рисунке 2.

Рисунок 2 — Блок-схема алгоритма, определяющего игрока текущего хода

Игра управляется с клавиатуры, если нажата ненужная клавиша, то она игнорируется, в игре не происходит никаких изменений, игра продолжается; если нажаты указанные ниже клавиши, то происходят события:

Клавиши-стрелки — номер ячейки игрового поля увеличивается или уменьшается на единицу, исходя из того, какая клавиша была нажата, если достигнут край поля, то номеру присваивается начальное или конечное значение в зависимости от края поля. Эти значения очень важны в программе, так как используются для занесения в двумерный массив значений 1 или 2 при нажатии «Enter» на свободной ячейке поля, а также значения передаются в процедуру Kursor, которая графически отображает движение курсора по ячейкам.

Читайте также:  Установка кастомного рекавери на нексус 5

Клавиша «Enter» — элемент матрицы становится равным 1 или 2, в зависимости от того, кому принадлежит возможность совершить ход. Затем вызывается процедура, которая выводит символ «Х» или «О» в нужную ячейку.

Клавиша «Space» — игра перезагружается заново.

Клавиша «Escape» — нажатие прекращает работу программы.

Рисунок 3 — Блок-схема алгоритма, обрабатывающего код нажатой клавиши

Блок-схема алгоритма представлена на рис. 3.

После очередного хода каждая ячейка поля проверяется на присутствие выигрышной комбинации — выстроены ли в ряд 4 крестика или нолика. Алгоритм содержит 2 цикла. При выполнении одного из условий выводится соответствующее сообщение: «Крестики выстроили ряд!» или «Нолики выстроили ряд!» или «Ничья!». На рисунке 4 представлена блок-схема алгоритма.

Рисунок 4 — Блок-схема алгоритма проверки победной ситуации или ничьи

3. Программное проектирование

В ходе написания программного продукта было разработано два модуля: модуль Grafika и модуль Base.

Модуль Grafika отвечает за графический интерфейс программы. В нем реализуются такие функции, как:

o Начальное окно-заставка игры

o Рисование игрового поля 15 на 15 клеток

o Движение курсора по клеткам поля

o Вывод сообщений и прочей информации

o Procedure StartMenu. Данная подпрограмма выводит начальное окно игры. В нем содержится информация о название игры, а также необходимая инструкция к игре. В этой подпрограмме используются стандартные процедуры:

· SetFontStyle; — устанавливает стиль выводимого текста (библиотека GraphABC);

· TextOut(x, y, S); — печатает строку S, начиная с позиции (x, y); (библиотека GraphABC);

· SetFontColor(цвет); — выбирает цвет; (библиотека GraphABC);

· Sleep(k) — выполняется задержка на указанное количество миллисекунд.

o Procedure Pole. Подпрограмма рисует игровое поле: игровая решетка + заголовок, разного цвета. Подпрограмма использует стандартные функции и процедуры:

· Line(x1, y1, x2, y2); — проводит линию из точки (x1, y1) в точку (x2, y2); (библиотека GraphABC);

· TextOut(x, y, S); — печатает строку S, начиная с позиции (x, y);

· SetFontColor(c:color); — выбирает цвет; (библиотека GraphABC);

· SetPenStyle(s:style) — устанавливает стиль текущего пера;

· SetPenColor(c:color) — устанавливает цвет текущего пера;

o Procedure HowPlay. Данная процедура выводит на экран инструкцию по игре. Набот стандартных процедур идентичен такому набору как в процедуре StartMenu.

o Procedure Kursor (var x, y: integer; var ud, lr: shortint; c: color). Данная процедура служит для вывода на экран квадратного курсора, с помощью которого можно перемещаться между ячейками игрового поля и фиксировать символ в нужной ячейке.

· x, y:integer; — начальные координаты верхнего левого угла игрового поля;

· ud, lr: shortint; — номер строки и столба, т.е. координаты ячейки игрового поля;

Подпрограмма Kursor вызывается подпрограммой KeyDown.

o procedure Symbol(x, y: integer; zn: char). Данная процедура вызывается из KeyDown после нажатия клавиши ENTER. Если во время вызова курсор находится в нужной ячейке, то устанавливает необходимый символ с заданным цветом в выбранной ячейке.

· x,y:integer; — текущие координаты курсора.

· zn:char; — символ для установки в ячейку, «Х» или «О».

Используемые стандартные функции и процедуры:

· SetFontColor(color); — выбирает цвет; (библиотека GraphAbc);

· SetFontStyle- устанавливает стиль выводимого текста; (библиотека GraphAbc);

· TextOut(x, y, S); — печатает строку S, начиная с позиции (x, y); (библиотека GraphAbc);

После получения координат курсора процедура выводит символ в соответствующую ячейку на игровом поле.

o ExitMenu. Эта процедура вызывается из тела главной программы после окончания игрового кона. Она выводит информационное окно с предложением выйти из игры, либо начать заново.

Используемые стандартные функции и процедуры:

Модуль Base содержит основной код игры. В нем реализуются:

o Обработчик нажатия на клавишу

o Проверка случая победы или ничьи

o procedure TBase.TimerProc. Производит отсчет таймера в течение каждой последующей минуты. В том случае, когда время отведенное игроку на совершение хода иссякнет, ход переходит к сопернику .

o procedure KtoHodit. По четности переменной «i» определяется игрок, который вправе ставить символ «Х» или «О» в клетку игрового поля.

o procedure KeyDown(Key: integer); Подпрограмма является обработчиком события OnKeyDown.

· Key : integer; — содержит виртуальный код нажатой клавиши.

Эта процедура вызывается при нажатии на клавиши и, в зависимости от нажатых клавиш, выполняет соотвествующие им по программе действия . Если нажаты клавиши перемещения по игровому полю, то происходит запоминание нового положения на поле, если, к примеру, курсор находится в самой верхней ячейке и нажата клавиша «вверх», то курсор перемещается в самую нижнюю ячейку этого же столбца. Затем вызывается процедура Kursor, которая отображает перемещение курсора в игровом поле по вертикали и горизонтали (вверх, вниз, влево, вправо).

Читайте также:  Установка гбо range rover sport

При нажатии на Space происходит перезапуск игры, при нажатии на Escape — выход из игры.

o Procedure Pobeditel. Осуществляет проверку, выстроены ли в ряд 4 крестика или нолика и выводит соответствующие сообщения при выполнении этих условий. Процедура содержит 2 цикла в которых реализована case-конструкция. При выполнении одного из условий выводится соответствующее сообщение: «Победил игрок Х!» или «Победил игрок О!».

В теле основной программы начинается цикл с постусловием, который по сути является основным циклом игры. В нем задаются начальные координаты курсора, обнуляются элементы массива происходит вызов стартового окна игры — StartMenu и начинается второй цикл с постусловием, который представляет из себя игровой кон.

Затем в цикле с постусловием вызываются процедура Pole и KtoHodit, цикл выполняется пока не нажата клавиша “Escape” или “Space”, или пока не будет известен победитель в игре.В процедуре KtoHodit определяется текущий символ («Х» или «О») по четности переменной i. После этого считывается нажатая клавиша и вызывается процедура KeyDown, если это одна из клавиш-стрелок, то происходит соответствующие им действия, т.е. вызов процедуры Kursor, Если нажата клавиша «Enter» — вызывается процедура Symbol, и соответствующему элементу массива присваивается значение 1 или 2, в зависимости от текущего символа («Х» или «О»). После этого происходит проверка победы или «ничьи». Цикл текущего игрового кона заканчиваетсяв случае победы, ничьи, либо по нажатии клавиши “Escape” или “Space”.

В «основном цикле игры» после завершения игрового кона вызывается процедура ExitMenu; если нажат «Escape», то происходит выход из «основного» цикла с последующим завершением программы, если нажата любая другая клавиша, «основной » цикл начнется заново.

При запуске программы выводится окно с названием игры и небольшой инструкцией (см. рисунок 5).

Рисунок 5 — Стартовое окно игры

Игра начинается после небольшой паузы. В окне выводится игровое поле с предложением начать игру (см. рисунок 6).

Игроку разрешается делать ход только через раз. После того, как игрок сделал ход, право следующего хода переходит к его сопернику. На рис. 7 и 8 представлена типичная ситуация игры.

Рисунок 7 — Игрок «Х» совершил ход

Рисунок 8 — Игрок «О» совершил ход

Ход полагается делать за отведенный промежуток времени. На рисунке 9 изображен случай, когда игрок не успел сделать ход за отведенное ему время, ход перешел к сопернику.

Рисунок 9 -Переход хода к сопернику.

Для каждой клетки на игровом поле просматриваются соседние клетки по горизонтали, вертикали и по диагонали. Если в одном из направлений символы во всех клетках на расстоянии до 4 совпадают с символом в текущей клетке, то игра считается выигранной. На рис. 10 и 11 изображены варианты победы.

Рисунок 10 — Победа «крестиков»

Рисунок 11 — Победа «ноликов»

Были протестированы различные ситуации в игре. При возникновении ошибок, программа подвергалась доработке. Тем самым можно полагаться на то, что программа работает достаточно правильно, хотя говорить о полной ликвидации всех ошибок еще нельзя. Вполне возможно, что сейчас мы имеем исправную и весьма интересную игру.

В данной работе написана хорошо всем известная игра «Крестики-Нолики».

Стремительное развитие компьютерной техники в последние годы, появление мощнейших графических ускорителей и центральных процессоров способствовало не менее бурному развитию индустрии компьютерных игр. Выдающиеся разработки этой отрасли — это сложнейшие программы, как правило, с очень высокими требованиями к аппаратной части компьютера. Однако для возможности отдохнуть в перерыве от выполнения какой-либо работы оператору компьютера не всегда требуется новейшая компьютерная игра, а зачастую использовать её не позволяет маломощное оборудование офисного компьютера. Именно этой цели — отдыху от монотонной работы служит разработанная в рамках данного курсового проекта программа.

Несмотря на внешнюю простоту, программа представляет собой сложную систему взаимодействующих друг с другом функций. Игра требовала немало сил и времени на написание. И все же может быть усовершенствован код программы, а также добавлены новые функции.

источник