Игровая программа "Крестики-нолики"
Анализ требований к программному средству, разработка функциональных требований и алгоритма. Описание компонентов Delphi, используемых в игровой программе "Крестики-нолики". Обоснование технических приемов программирования, тестирование программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 03.12.2017 |
Размер файла | 2,9 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Министерство образования Республики Беларусь
Учреждение образования «Белорусский государственный университет информатики и радиоэлектроники»
Факультет компьютерных систем и сетей
Кафедра программного обеспечения информационных технологий
Дисциплина: Основы алгоритмизации и программирования (ОАиП)
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе на тему:
Игровая программа "Крестики-нолики"
Студент: гр. 651001 Макаревич Я.С.
Руководитель: асс. Болтак С.В.
Минск 2017
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. АНАЛИЗ СОВРЕМЕННОГО СОСТОЯНИЯ СЕТЕВЫХ ТЕХНОЛОГИЙ
1.1 История игры «Крестики-нолики»
1.2 Описание и правила игры «Крестики-нолики»
1.3 Достоинства и недостатки игры «Крестики-нолики»
1.4 Примеры реализаций
1.5 Формирование требований к разрабатываемому ПС
2. РАЗРАБОТКА АЛГОРИТМА
2.1 Анализ требований к программному средству и разработка функциональных требований
2.2 Разработка алгоритма программного средства
2.3 Разработка алгоритма действий при запуске ПС
2.4 Разработка алгоритма выбора размерности игрового поля
2.5 Разработка алгоритма процесса игры на поле 3х3
2.6 Разработка алгоритма процесса игры на поле 5х5
3. РАЗРАБОТКА ПРОГРАММНОГО СРЕДСТВА
3.1 Компоненты Delphi, используемые в игровой программе «Крестики-нолики»
3.2 Разработка используемых данных
3.3 Процедуры и функции, используемые в программе
4. ОБОСНОВАНИЕ ТЕХНИЧЕСКИХ ПРИЕМОВ ПРОГРАММИРОВАНИЯ
5. ТЕСТИРОВАНИЕ
6. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ. ИСХОДНЫЙ КОД ПРОГРАММЫ
ВВЕДЕНИЕ
На данный момент существует великое множество компьютерных игр, так же разнообразны подходы в их создании.
Стремительное развитие компьютерной техники способствовало не менее бурному развитию индустрии компьютерных игр. Выдающиеся разработки этой отрасли - это сложнейшие программы, как правило, с очень высокими требованиями к аппаратной части компьютера. Однако для возможности отдохнуть в перерыве от выполнения какой-либо работы оператору компьютера не всегда требуется новейшая компьютерная игра, а зачастую использовать её не позволяет маломощное оборудование офисного компьютера. Именно этой цели - отдыху от монотонной работы служит разработанная в рамках данного курсового проекта программа.
Целью курсовой работы является создание несложной игровой программы «Крестики-нолики», которая и будет являться объектом исследования. Потребуется создать полноценную правильно-функционирующую программу и самостоятельно изучить некоторые процедуры и функции.
Недавнее открытие потрясло человечество и заставило пересмотреть всю историю игры «Крестики-нолики». На скалах одной из французских пещер среди рисунков была обнаружена партия игры, после чего учёные задались вопросом: что же решали древние люди таким образом? После долгих поисков ответа на выше предложенный вопрос было сделано заключение о том, что римляне нарисовали эту наскальную живопись в момент крайней усталости с целью лёгкого и расслабленного времяпровождения.[5]
Несмотря на то, что официально именно Римская империя является местом создания игры «Крестики-нолики» , однако впервые она появилась в Индии около 2000 лет назад.[6]
Первый, он же классический, вариант игры представлял собой довольно простое логическое состязание между двумя игроками на поле размера 3х3.Один человек играл крестиками, другой-ноликами , ходили они поочередно, причём тот, кто играл крестиками делал первый ход.
Правила игры очень легки для понимания: игроки по очереди ставят знаки на свободные клетки поля. Первый, выстроивший в ряд свои фигуры по вертикали, диагонали или горизонтали выигрывает. Обычно по завершении партии выигравшая сторона зачёркивает чертой свои три знака (нолика или крестика), составляющих сплошной ряд. Считается, что при любом раскладе игры игрок всегда соблюдает два правила, имеющие приоритет над всеми остальными:
если игрок может немедленно выиграть, он это делает;
если игрок не может немедленно выиграть, но его противник мог бы немедленно выиграть, сделав ход в какую-то клетку, игрок сам делает ход в эту клетку, предотвращая немедленный проигрыш.
Данная записка содержит следующие разделы курсовой работы по разработке игровой программы «Крестики-нолики» :
анализ современных программ для ведения бюджета, их преимущества и недостатки;
разработка алгоритма на основе сформированных в результате анализа требований для программы;
разработка программного средства, выбор структур данных для использования;
обоснование технических приемов программирования, их преимущества и выгодность использования;
тестирование, анализ работы программы, описание действий, необходимых для полного тестирования программы;
руководство пользователю, которое включает в себя описание действий, которые позволят успешно использовать приложение;
1 АНАЛИЗ ПРОТОТИПОВ, ЛИТЕРАТУРНЫХ ИСТОЧНИКОВ И ФОРМИРОВАНИЕ ТРЕБОВАНИЙ К ПРОЕКТИРУЕМОМУ ПС
1.1 История игры «Крестики-нолики»
Впервые крестики-нолики могли появиться в Индии более 2000 лет назад, но потом тот, кто их чуть было не изобрел, понял, что за доску 8х8 он может стрясти намного больше зерна, чем за 3х3, и поэтому он изобрел шахматы. Второй раз эту игру изобретали в Римской империи, но когда их изобретателю оставался последний штрих, какие-то варвары коварно захватили Рим и предотвратили распространение игры. Когда игра была окончательно изобретена, доподлинно неизвестно. Предположительно, ее случайно изобрел, решая трехуровневую систему уравнений, французский математик. В средние века игра была очень популярна. В связи с тем, что люди, заигравшиеся в крестики-нолики, стали пропускать пытки, допросы и сожжения на костре, церковь игру запретила. Но в нее все равно играли все, хоть и тайно. Так, например, один из итальянских художников зафиксировал тот момент, когда Папа Римский играл темной ночью под одеялом в крестики-нолики сам с собой. В эпоху Возрождения игра была признана законной, и с тех пор является одним из самых популярных способов побездельничать в школе, на работе и где угодно.
программный delphi алгоритм игровой
1.2 Описание и правила игры «Крестики-нолики»
Крестики-нолики - логическая игра между двумя противниками на квадратном поле 3х3 или большего размера. Один играет крестиками, второй-ноликами . Игроки поочередно ставят на свободные клетки поля знаки (один всегда крестики, другой всегда нолики). Первый, выстроивший в ряд 3 свои фигуры по вертикали, горизонтали или диагонали, выигрывает. Первый ход делает игрок, ставящий крестики. Обычно по завершении партии выигравшая сторона зачёркивает чертой свои три знака (нолика или крестика), составляющих сплошной ряд.
Если игрок может немедленно выиграть, он это делает. Если игрок не может немедленно выиграть, но его противник мог бы немедленно выиграть, сделав ход в какую-то клетку, игрок сам делает ход в эту клетку, предотвращая немедленный проигрыш.
1.3Достоинства и недостатки игры «Крестики-нолики»
Достоинства:
- простота в понимании и использовании;
- широкое разнообразие тем для поля;
- вариация уровней сложности;
- вариация способов игры (с мобильным устройством или ПК, с другим игроком на одном мобильном устройстве или ПК, с случайным игроком при использовании интернет подключения).
- автоматическое сохранение результатов при прерывании игры , как принудительном, так и спонтанном;
Недостатки:
- отсутствие правил игры (для непосвященных) в связи с широкой распространённостью;
1.4 Примеры реализаций
В настоящее время существует довольно много программных реализации игры «Крестики-нолики» ,как для ПК, так и для мобильных устройств. Человеку предоставляется возможность играть ,как по сети, так и в отсутствии интернет подключения. Также в данном приложении варьируется количество игроков (человек может играть самостоятельно, либо же с другим игроком).
Ниже представлены примеры некоторых приложений:
Онлайн игра «Крестики-нолики» на сайте http://flashdozor.ru[1]
Рисунок 1.1- Визуальная реализация игры «Крестики-нолики» на сайте http://flashdozor.ru
В данной реализации человеку предоставляется возможность играть одному. Из удобств можно отметить наличие автоматического предоставления вариантов хода игроку.
Приложение «Крестики-нолики» («Tic Tac Toe») для IOS[2]
Рисунок 1.3- Визуальная реализация игры «Крестики-нолики» для IOS
В данном приложении имеют место быть следующие возможности:
- игрок может играть самостоятельно против мобильного устройства либо же играть с другим игроком на этом же устройстве;
- варьируются уровни сложности: легкий, средний, сложный и эксперт;
- варьируются темы, на фоне которых осуществляется игра;
- при выходе из приложения или принудительном прерывании все данные игры автоматически сохраняются.
Приложение «Крестики-нолики (онлайн)» для IOS[3]
Данная реализация игры обладает следующими возможностями:
3 поля: 3х3, 6х6, 15х15;
3 уровня сложности;
режим на 1 игрока: игра против своего мобильного устройства;
режим на 2-х игроков: игра с другим игроком на одном мобильном устройстве;
режим онлайн: игра с случайным соперником через Game Center.
Рисунок 1.4- Визуальная реализация игры «Крестики-нолики» (онлайн) для IOS
Приложение «Мега Крестики-нолики» для IOS[4]
Рисунок 1.5- Визуальная реализация игры «Мега Крестики-нолики» для IOS
Данное приложение является более усовершенствованным, чем предыдущие три, в нем имеют место быть следующие функции:
ядро с искусственным интеллектом, поддерживающим 5 уровня сложности;
возможность играть онлайн несколько игр одновременно;
доска достижений - для определения лучшего игрока;
красивый интерфейс, включающий отмену последнего хода, увеличение или уменьшение масштаба поля.
1.5 Формирование требований к разрабатываемому ПС
Игровая программа должна быть разработана в среде Delphi и происходить между пользователем и компьютером.
Фай с выходным данными должен содержать результаты игры (счёт).
Перед началом игры программа должна запрашивать у пользователя следующие параметры:
размер игрового поля;
игрока, делающего первый ход (пользователь или компьютер).
Программа должна просчитывать возможные варианты развития игры и в соответствии с этим делать ход, который с большей вероятностью принесет победу компьютеру. Необходимо разработать стратегию выбора следующего хода. Для реализации поставленной задачи использовать динамические переменные. Программа должна отображать игровое поле, ходы пользователя и компьютера, номера столбцов и строк. По окончанию игры необходимо выдавать сообщение о ее результатах (победа пользователя, ничья и поражение).
2 РАЗРАБОТКА АЛГОРИТМА
2.1 Анализ требований к программному средству и разработка функциональных требований
В результате анализа требований к программному средству были составлены следующие функциональные требования:
возможность ознакомления с правилами игры «Крестики-нолики»;
возможность выбора размерности поля;
возможность выбора того, кто делает первый ход для поля 3х3;
визуализация результатов игры (ведение счёта);
возможность возвращения в главное меню и в приветственное окно без перезапуска приложения;
возможность очистки игрового поля без возврата в главное меню;
возможность сыграть несколько игр на поле оной размерности;
возможность завершения приложения на любом этапе его воспроизведения;
наличие эстетически корректно представленных вариантов действий;
возможность сохранения в файл результатов игры;
2.2 Разработка алгоритма программного средства (рисунок 2.1)
На стадии проектирования приложения основной концепцией работы было выбрано выполнение выбранных пользователем действий. Изначально пользователю необходимо ознакомиться с правилами игры, после чего запустить её.
Далее нужно выбрать размер игрового поля . Если выбрано поле 3х3 выбрать того, кто ходит первым. Провести игру. Далее при желании можно сыграть еще партии на поле этой же размерности или вернуться в главное меню и начать игру на поле 5х5. Укрупненная схема [7] программы представлена на рисунке 2.1
2.3 Разработка алгоритма действий при запуске ПС (рисунок 2.2)
При выборе Help- Правила игры вызывается форма с несколькими компонентами для прочтения, далее нажатием кнопки «ЗАКРЫТЬ» следует вернуться и при желании продолжить игру нажатием кнопки «ИГРАТЬ». Схема действий при запуске ПС представлена на рисунке 2.2
2.4 Разработка алгоритма выбора размера игрового поля (рисунок 2.3)
При попадании на форму выбора размерности игрового поля следует нажать на одну из кнопок «3х3» или «5х5» после чего откроется форма с полем размерностью 3х3 или 5х5 соответственно. Схема выбора размерности игрового поля представлена на рисунке 2.3
2.5 Разработка алгоритма процесса игры на поле 3х3 (рисунок 2.4)
На форме 3х3 содержится компонент для выбора того, кто делает первый ход. Далее запускается процесс игры, после её завершения высветится сообщение о результате и при желании сыграть ещё одну партию следует нажать кнопку «Новая игра». При желании завершить работу приложения или вернуться в главное меню необходимо нажать соответствующие кнопки. Схема процесса игры на поле 3х3 представлена на рисунке 2.4
2.6 Разработка алгоритма процесса игры на поле 5х5 (рисунок 2.5)
Рисунок 2.1- Укрупнённая схема программы
По окончанию процесса игры будет высвечиваться сообщение о её результатах, а так же будет предлагаться возможность сыграть новую партию. При желании завершить работу приложения или вернуться в главное меню необходимо нажать соответствующие кнопки. Схема процесса игры на поле 5х5 представлена на рисунке 2.5
Рисунок 2.2- Схема действий при запуске ПС
Рисунок 2.3- Схема выбора размерности игрового поля
Рисунок 2.4- Схема процесса игры на поле 3х3
Рисунок 2.5- Схема процесса игры на поле 5х5
3 РАЗРАБОТКА ПРОГРАММНОГО СРЕДСТВА
3.1 Компоненты Delphi, используемые в игровой программе «Крестики-нолики»
Компонент TButton. Этот компонент является простой командной кнопкой. Командная кнопка используется для реализации в программе команд с помощью обработчика события OnClick этого компонента.
Компонент TLabel. Он служит для отображения текста на экране. Можно изменить шрифт и цвет метки, используя свойство Font данного компонента.
Компонент TMainMenu. Он позволяет поместить главное меню в программу. Иконки данного типа невидимы во время выполнения программы.
Для создания меню необходимо поместить TMainMenu на форму, после чего вызвать Menu Designer и определить пункты меню в Menu Designer.
Компонент TRadioGroup. Он представляет собой контейнер с группой компонентов RadioButton . Такой компонент упрощает организацию работы компонентов RadioButton.
Компонент TGroupBox. Он предназначен для группировки схожих по смыслу компонентов.
Компонент TImage. Он предназначен для отображения на форме графических изображений.
Компонент TRadioButton- это "радиокнопка", и как следует из названия, служит для "переключения каналов", как и в настоящем радиоприёмнике. Это значит, если выбран один из компонентов RadioButton, то с остальных компонентов выбор автоматически снимается.
Компонент TProgressBar. Он предназначен для отображения хода процесса, занимающего заметное время.
Компонент TMemo- это простой текстовый редактор, позволяет вводить многострочный текст с клавиатуры, загружать его из файла, редактировать и сохранять в файл текстового формата.
Компонент TSaveDialog-это визуальный компонент, который используется для выбора пользователем имени файла предназначенного для сохранения.
3.2 Разработка используемых данных
Цель программы состоит в корректной реализации процесса игры «Крестики-нолики» между игроком и компьютером на полях двух размерностей.
Для создания игры на поле 3х3 были предприняты следующие действия:
использование динамических массивов;
явное описание переменных типа integer, используемых в дальнейшем для подсчёта результатов игры;
создание искусственного интеллекта для игры «Крестики-нолики» на поле данной размерности путём рассмотрения всех возможных вариаций ходов и ситуаций;
создание процедур для вывода действий на экран, определения победителя и возможности реализации ещё одной партии игры;
создание процедуры для завершения работы приложения;
создание процедуры сохранения результатов игры в файл;
Для создания игры на поле 5х5 были предприняты следующие действия:
использование перечисляемого типа;
использование динамических массивов;
явное описание переменных типа integer, используемых в дальнейшем для подсчёта результатов игры;
создание процедур, просчитывающих ход компьютера;
создание процедур для вывода результатов игры, возможности реализации еще одной партии;
создание процедуры для завершения работы приложения;
создание процедуры сохранения результатов игры в файл;
3.3 Процедуры и функции, используемые в программе
Таблица 3.1 - Тестирование программного средства
Название процедуры или функции |
Выполняемые действия |
|
Процедура VirtualMind |
Создание искусственного интеллекта для ходов компьютера |
|
Процедура OutPut |
Вывод на экран результатов ходов компьютера |
|
Процедура Winer |
Определения победителя |
|
Процедура TheEnd |
Вывод сообщения об окончании игры, изменение счёта в зависимости от результата |
|
Процедура PaintKN |
Вывод крестика/нолика на игровое поле |
|
Функция isYes |
Проверка вертикали/диагонали/горизонтали на заполнение |
|
Функция RandomNolik |
Ход компьютера ноликами |
|
Функция NewNolik |
Анализ сложившейся в игре ситуации и выбор компьютером решения дальнейших действий |
|
Процедура NewGame |
Очистка игрового поля, изменение счёта, запуск новой парт игры на том же поле |
4 ОБОСНОВАНИЕ ТЕХНИЧЕСКИХ ПРИЕМОВ ПРОГРАММИРОВАНИЯ
Код программы включает в себя 5 различных модулей:
Unit1
Эта форма предоставляет возможность ознакомления с правилами игры «Крестики-нолики» (TMainMenu) , перехода к выбору размерности поля (TButton) и завершения работы приложения (TButton).
Unit2
Эта форма отвечает за процесс игры на поле 3х3 (TLabel) с выбором первого ходящего (TRadioGroup). Так же предоставляет возможность реализации ещё одной партии на этом же поле (TButton), визуализации результатов игр (TGroupBox, TLabel), возврата к правилам игры (TButton), в главное меню (TButton) , завершения работы приложения (TButton) и сохранения результатов игры в файл (TButton).
Unit3
Эта форма отвечает за процесс игры на поле 5х5 (TImage) . Так же предоставляет возможность реализации ещё одной партии на этом же поле (TButton), визуализации результатов игр (TGroupBox, TLabel), возврата к правилам игры (TButton), в главное меню (TButton), завершения работы приложения (TButton) и сохранения результатов игры в файл (TButton).
Unit4
Эта форма предоставляет возможность выбора размерности игрового поля (TRadioButton) и перехода к началу игры на выбранном поле (TButton, TProgressBar), а так же завершения работы приложения (TButton).
Unit5
Эта форма предоставляет возможность ознакомления с правилами игры (TLabel) и возврата к приветственной форме (TButton).
5 ТЕСТИРОВАНИЕ
Результаты тестирования программного средства представлены в таблице 5.1
Таблица 5.1 - Тестирование программного средства
Тестируемая функция |
Шаги |
Ожидаемый результат |
Полученный результат |
|
Ознакомление с правилами игры |
Нажать «Help»-«Правила игры» |
Открытие формы с правилами игры |
Открытие формы с правилами игры |
|
Завершение приложения |
Нажать кнопку «ВЫХОД» |
Завершение работы ПС, закрытие всех форм |
Завершение работы ПС, закрытие всех форм |
|
Переход к выбору размерности поля |
Нажать кнопку «ИГРАТЬ» |
Открытие формы выбора размера игрового поля |
Открытие формы выбора размера игрового поля |
|
Переход к игре на поле 3х3 |
Нажать кнопку «3х3», кнопку «ДАЛЕЕ» |
Открытие формы поля размерности 3х3 |
Открытие формы поля размерности 3х3 |
|
Игра, первый ход-человек |
Поставить переключатель на «Человек» |
Корректный процесс игры ,сообщение о результате (человек делает первый ход) |
Корректный процесс игры, сообщение о результате (человек делает первый ход) |
|
Игра, первый ход-компьютер |
Поставить переключатель на «Компьютер» |
Корректный процесс игры (компьютер делает первый ход) |
Корректный процесс игры (компьютер делает первый ход) |
|
Новая игра на том же поле |
Нажать кнопку «Новая игра» |
Очистка игрового поля, занесение результатов предыдущей игры в «Счёт» |
Очистка игрового поля, занесение результатов предыдущей игры в «Счёт» |
|
Возвращение к правилам игры |
Нажать кнопку «В НАЧАЛО» |
Закрытие формы с полем и формы выбора размерности поля, открытие приветственной формы с правилами игры |
Закрытие формы с полем и формы выбора размерности поля, открытие приветственной формы с правилами игры |
|
Возвращение к выбору размерности игрового поля |
Нажать кнопку « ГЛАВНОЕ МЕНЮ» |
Закрытие формы с полем открытие формы выбора размерности игрового поля |
Закрытие формы с полем открытие формы выбора размерности игрового поля |
|
Переход к игре на поле 5х5 |
Нажать кнопку «5х5», кнопку «ДАЛЕЕ» |
Открытие формы поля размерности 5х5 |
Открытие формы поля размерности 5х5 |
|
Тестируемая функция |
Шаги |
Ожидаемый результат |
Полученный результат |
|
Запуск процесса игры |
Нажать кнопку «Начать игру» |
Визуализация игрового поля |
Визуализация игрового поля |
|
Процесс игры |
Нажатие на клетки игрового поля |
Корректный процесс игры, сообщение о результате по её итогу |
Корректный процесс игры, сообщение о результате по её итогу |
|
«Хотите сыграть ещё раз?» |
Нажать «Yes» |
Очистка игрового поля, занесение результатов игры в «Счёт» |
Очистка игрового поля, занесение результатов игры в «Счёт» |
|
«Хотите сыграть ещё раз?» |
Нажать «Cancel» |
Закрытие окна сообщения о результатах игры |
Закрытие окна сообщения о результатах игры |
|
Новая игра на том же поле |
Нажать кнопку «Новая игра» |
Очистка игрового поля, занесение результатов игры в «Счёт» |
Очистка игрового поля, занесение результатов игры в «Счёт» |
|
Сохранение результатов игры (счёт) |
Нажать кнопку «СОХРАНИТЬ РЕЗУЛЬТАТЫ» |
Сохранение результатов игры в выбранный пользователем файл с расширением *.txt |
Сохранение результатов игры в выбранный пользователем файл с расширением *.txt |
6 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Для того чтобы начать работу с приложением необходимо запустить krestiki-noliki.exe, а также обязательно наличие подкаталога «users» в нем. После запуска необходимо начать игру, нажав кнопку «ИГРАТЬ» на панели приветствия (рисунок 6.1) , либо же закрыть приложение нажатием кнопки «ВЫЙТИ».
Рисунок 6.1- Форма приветствия
На форме выбора размерности поля необходимо, соответственно, выбрать один из предложенных вариантов (рисунок 6.2). При отсутствии желания продолжать игру нажатием кнопки «ВЫХОД» можно завершить работу приложения.
Рисунок 6.2- Форма выбора размерности поля
Далее пользователь попадает либо на Форму 3х3 (рисунок 6.3) , либо на Форму 5х5 (рисунок 6.4).
При переходе на Форму 3х3 пользователю необходимо будет выбрать, кто делает первый ход, затем нажать кнопку «НОВАЯ ИГРА» и начать игру, нажимая на клетки поля.
Рисунок 6.3- Форма 3х3
После окончания игры высветится сообщение с результатом (рисунок 6.4) и по нажатию кнопки «ОК» на Форме 3х3 счёт изменится в соответствии с исходом игры (рисунок 6.5). Для сохранения результаты игры перед выходом необходимо нажать кнопку «СОХРАНИТЬ РЕЗУЛЬТАТЫ» (рисунок 6.5).
Рисунок 6.4- Сообщение о результате
Рисунок 6.5- Форма 3х3
При желании закрыть приложение следует нажать кнопку «ВЫХОД», при желании продолжить игру, но на поле другой размерности следует нажать кнопку «ГЛАВНОЕ МЕНЮ», затем выбрать поле другого размера и нажать кнопку «ДАЛЕЕ» на Форме выбора размерности поля.
На Форме 5х5 предоставлена информация о том, какими фигурами ходит пользователь и компьютер, а так же о том, каков счёт игры. Если возникают вопросы на счёт правил игры на поле данной размерности можно вернуться на Форму приветствия нажатием кнопки «В НАЧАЛО» (рисунок 6.6) и прочитать правила игры следующим образом: Help-Правила игры. Откроется Форма правил игры (рисунок 6.7).
Прочитав правила игры и вернувшись на Форму 5х5, можете начать игру, нажатием на клетку поля, по окончанию игры будет высвечиваться сообщение о результатах игры с вопросом о желании начать заново (рисунок 6.8). Для сохранения результаты игры перед выходом необходимо нажать кнопку «СОХРАНИТЬ РЕЗУЛЬТАТЫ» (рисунок 6.9). При желании выйти из приложения или вернуться на Форму выбора размерности поля нажмите одну из кнопок «ВЫХОД» или «ГЛАВНОЕ МЕНЮ» соответственно (рисунок 6.9).
Рисунок 6.6- Возвращение на Форму приветствия
Рисунок 6.7-Правила игры
Рисунок 6.8-Результаты игры
Рисунок 6.9- Форма 5х5
ЗАКЛЮЧЕНИЕ
В результате работы над курсовым проектом было создано справно работающее игровое приложение «Крестики-нолики» , которое может пригодиться в повседневной жизни любого человека для отдыха и приятного времяпровождения.
Разработка приложения включала в себя решение множества задач , как итог было изучено большое количество схожих игровых программ , проведен их анализ, и сформированы оптимальные требования для приложений подобного рода.
Далее было проведено исследование компонентов программной среды Borland Delphi 7.0, которые использовались при создании программы, так же были сформированы конкретные функциональные требования к программе на основе возможностей языка.
Затем были разработаны структуры данных, разработана примерная архитектура приложения. Далее были детализированы все функции.
Программа была отлажена и протестирована сначала разработчиком, а затем несколько раз обычными пользователями. После испытаний были внесены корректировки в интерфейсе, работе некоторых функций.
Пройдя все выше перечисленные этапы, на выходе получилась корректно работающая игровая программа «Крестики-нолики».
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
[1] Сайт онлайн игры «Крестики-нолики» [Электронный ресурс]. - Электронные данные. - Режим доступа: http://flashdozor.ru
[2] Сайт программы «Tic Tac Toe» [Электронный ресурс]. - Электронные данные. - Режим доступа: https://play.google.com
[3] Сайт игры «Крестики-нолики» (онлайн) [Электронный ресурс]. - Электронные данные. - Режим доступа: http://nn-attraction.ru
[4] Сайт приложения «Мега Крестики-нолики» для IOS [Электронный ресурс]. - Электронные данные. - Режим доступа: https://play.google.com
[5] Сайт программы «Крестики-нолики» [Электронный ресурс]. - Электронные данные. - Режим доступа: http://nn-attraction.ru
[6] Сайт создания игровой программы «Крестики-нолики» [Электронный ресурс]. - Электронные данные. - Режим доступа: http://www.bolshoyvopros.ru/
[7] ГОСТ 19.701-90 (ИСО 5807-85) [Текст]. - Единая система программной документации: Сб. ГОСТов. - М.: Стандартинформ, 2005 с.
ПРИЛОЖЕНИЕ
Исходный код программы
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit4 in 'Unit4.pas' {Form4},
Unit5 in 'Unit5.pas' {Form5},
Unit3 in 'Unit3.pas' {Form3};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm4, Form4);
Application.CreateForm(TForm5, Form5);
Application.CreateForm(TForm3, Form3);
Application.Run;
end.
unit Unit1; // приветствие
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, jpeg, Menus;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
MainMenu1: TMainMenu;
Help1: TMenuItem;
N1: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit4, Unit5;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form4.show;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.N1Click(Sender: TObject);
begin
Form5.show;
end;
end.
unit Unit2; // поле 3х3
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, Menus;
const
kol=9;
type
TForm2 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
RadioGroup1: TRadioGroup;
GroupBox1: TGroupBox;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Label1Click(Sender: TObject);
procedure Label2Click(Sender: TObject);
procedure Label3Click(Sender: TObject);
procedure Label4Click(Sender: TObject);
procedure Label5Click(Sender: TObject);
procedure Label6Click(Sender: TObject);
procedure Label7Click(Sender: TObject);
procedure Label8Click(Sender: TObject);
procedure Label9Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure VirtualMind;
procedure OutPut;
procedure Winer;
procedure TheEnd(q: integer);
var
Form2: TForm2;
M: array[1..9] of integer;
win_men, win_comp, win_nobody: integer;
implementation
uses Unit1, Unit4;
{$R *.dfm}
procedure VirtualMind;
var
i, m_z: integer;
Z: array[1..kol] of integer;
begin
//1
if (M[1]=2) and (M[2]=2) and (M[3]=0) then begin M[3]:=2; exit; end;
if (M[1]=2) and (M[4]=2) and (M[7]=0) then begin M[7]:=2; exit; end;
if (M[1]=2) and (M[5]=2) and (M[9]=0) then begin M[9]:=2; exit; end;
if (M[1]=2) and (M[7]=2) and (M[4]=0) then begin M[4]:=2; exit; end;
if (M[1]=2) and (M[9]=2) and (M[5]=0) then begin M[5]:=2; exit; end;
if (M[1]=2) and (M[3]=2) and (M[2]=0) then begin M[2]:=2; exit; end;
if (M[2]=2) and (M[5]=2) and (M[8]=0) then begin M[8]:=2; exit; end;
if (M[2]=2) and (M[3]=2) and (M[1]=0) then begin M[1]:=2; exit; end;
if (M[2]=2) and (M[8]=2) and (M[5]=0) then begin M[5]:=2; exit; end;
if (M[3]=2) and (M[5]=2) and (M[7]=0) then begin M[7]:=2; exit; end;
if (M[3]=2) and (M[6]=2) and (M[9]=0) then begin M[9]:=2; exit; end;
if (M[3]=2) and (M[7]=2) and (M[5]=0) then begin M[5]:=2; exit; end;
if (M[3]=2) and (M[9]=2) and (M[6]=0) then begin M[6]:=2; exit; end;
if (M[4]=2) and (M[5]=2) and (M[6]=0) then begin M[6]:=2; exit; end;
if (M[4]=2) and (M[7]=2) and (M[1]=0) then begin M[1]:=2; exit; end;
if (M[4]=2) and (M[6]=2) and (M[5]=0) then begin M[5]:=2; exit; end;
if (M[5]=2) and (M[7]=2) and (M[3]=0) then begin M[3]:=2; exit; end;
if (M[5]=2) and (M[8]=2) and (M[2]=0) then begin M[2]:=2; exit; end;
if (M[5]=2) and (M[6]=2) and (M[4]=0) then begin M[4]:=2; exit; end;
if (M[6]=2) and (M[9]=2) and (M[3]=0) then begin M[3]:=2; exit; end;
if (M[7]=2) and (M[8]=2) and (M[9]=0) then begin M[9]:=2; exit; end;
if (M[7]=2) and (M[9]=2) and (M[8]=0) then begin M[8]:=2; exit; end;
if (M[8]=2) and (M[9]=2) and (M[7]=0) then begin M[7]:=2; exit; end;
//2
if (M[1]=1) and (M[2]=1) and (M[3]=0) then begin M[3]:=2; exit; end;
if (M[1]=1) and (M[4]=1) and (M[7]=0) then begin M[7]:=2; exit; end;
if (M[1]=1) and (M[5]=1) and (M[9]=0) then begin M[9]:=2; exit; end;
if (M[1]=1) and (M[7]=1) and (M[4]=0) then begin M[4]:=2; exit; end;
if (M[1]=1) and (M[9]=1) and (M[5]=0) then begin M[5]:=2; exit; end;
if (M[1]=1) and (M[3]=1) and (M[2]=0) then begin M[2]:=2; exit; end;
if (M[2]=1) and (M[5]=1) and (M[8]=0) then begin M[8]:=2; exit; end;
if (M[2]=1) and (M[3]=1) and (M[1]=0) then begin M[1]:=2; exit; end;
if (M[2]=1) and (M[8]=1) and (M[5]=0) then begin M[5]:=2; exit; end;
if (M[3]=1) and (M[5]=1) and (M[7]=0) then begin M[7]:=2; exit; end;
if (M[3]=1) and (M[6]=1) and (M[9]=0) then begin M[9]:=2; exit; end;
if (M[3]=1) and (M[7]=1) and (M[5]=0) then begin M[5]:=2; exit; end;
if (M[3]=1) and (M[9]=1) and (M[6]=0) then begin M[6]:=2; exit; end;
if (M[4]=1) and (M[5]=1) and (M[6]=0) then begin M[6]:=2; exit; end;
if (M[4]=1) and (M[7]=1) and (M[1]=0) then begin M[1]:=2; exit; end;
if (M[4]=1) and (M[6]=1) and (M[5]=0) then begin M[5]:=2; exit; end;
if (M[5]=1) and (M[7]=1) and (M[3]=0) then begin M[3]:=2; exit; end;
if (M[5]=1) and (M[8]=1) and (M[2]=0) then begin M[2]:=2; exit; end;
if (M[5]=1) and (M[6]=1) and (M[4]=0) then begin M[4]:=2; exit; end;
if (M[6]=1) and (M[9]=1) and (M[3]=0) then begin M[3]:=2; exit; end;
if (M[7]=1) and (M[8]=1) and (M[9]=0) then begin M[9]:=2; exit; end;
if (M[7]=1) and (M[9]=1) and (M[8]=0) then begin M[8]:=2; exit; end;
if (M[8]=1) and (M[9]=1) and (M[7]=0) then begin M[7]:=2; exit; end;
//3
if (M[5]=0) then begin M[5]:=2; exit; end;
//4
for i:=1 to 9 do Z[i]:=0;
if (M[1]=0) and (M[2]<>1) and (M[3]<>1) and (M[4]<>1) and (M[7]<>1) then begin
if M[2]=1 then Z[1]:=Z[1]+1;
if M[3]=1 then Z[1]:=Z[1]+1;
if M[4]=1 then Z[1]:=Z[1]+1;
if M[7]=1 then Z[1]:=Z[1]+1;
end;
if (M[2]=0) and (M[1]<>1) and (M[3]<>1) and (M[5]<>1) and (M[8]<>1) then begin
if M[1]=1 then Z[2]:=Z[2]+1;
if M[3]=1 then Z[2]:=Z[2]+1;
if M[5]=1 then Z[2]:=Z[2]+1;
if M[8]=1 then Z[2]:=Z[2]+1;
end;
if (M[3]=0) and (M[1]<>1) and (M[2]<>1) and (M[6]<>1) and (M[9]<>1) then begin
if M[1]=1 then Z[3]:=Z[3]+1;
if M[2]=1 then Z[3]:=Z[3]+1;
if M[6]=1 then Z[3]:=Z[3]+1;
if M[9]=1 then Z[3]:=Z[3]+1;
end;
if (M[4]=0) and (M[1]<>1) and (M[7]<>1) and (M[5]<>1) and (M[6]<>1) then begin
if M[1]=1 then Z[4]:=Z[4]+1;
if M[7]=1 then Z[4]:=Z[4]+1;
if M[5]=1 then Z[4]:=Z[4]+1;
if M[6]=1 then Z[4]:=Z[4]+1;
end;
if (M[6]=0) and (M[3]<>1) and (M[9]<>1) and (M[4]<>1) and (M[5]<>1) then begin
if M[3]=1 then Z[6]:=Z[6]+1;
if M[9]=1 then Z[6]:=Z[6]+1;
if M[4]=1 then Z[6]:=Z[6]+1;
if M[5]=1 then Z[6]:=Z[6]+1;
end;
if (M[7]=0) and (M[1]<>1) and (M[4]<>1) and (M[8]<>1) and (M[9]<>1) then begin
if M[1]=1 then Z[7]:=Z[7]+1;
if M[4]=1 then Z[7]:=Z[7]+1;
if M[8]=1 then Z[7]:=Z[7]+1;
if M[9]=1 then Z[7]:=Z[7]+1;
end;
if (M[8]=0) and (M[7]<>1) and (M[9]<>1) and (M[2]<>1) and (M[5]<>1) then begin
if M[7]=1 then Z[8]:=Z[8]+1;
if M[9]=1 then Z[8]:=Z[8]+1;
if M[2]=1 then Z[8]:=Z[8]+1;
if M[5]=1 then Z[8]:=Z[8]+1;
end;
if (M[9]=0) and (M[3]<>1) and (M[6]<>1) and (M[7]<>1) and (M[8]<>1) then begin
if M[3]=1 then Z[9]:=Z[9]+1;
if M[6]=1 then Z[9]:=Z[9]+1;
if M[7]=1 then Z[9]:=Z[9]+1;
if M[8]=1 then Z[9]:=Z[9]+1;
end;
//поиск максимума из Z
m_z:=1;
for i:=2 to 9 do if Z[i]>Z[m_z] then m_z:=i;
if Z[m_z]>1 then begin
M[m_z]:=2;
exit;
end;
//5
if (M[1]=2) and (M[3]=0) and (M[2]=0) then begin M[2]:=2; exit; end;
if (M[1]=2) and (M[7]=0) and (M[4]=0) then begin M[4]:=2; exit; end;
if (M[1]=2) and (M[9]=0) and (M[5]=0) then begin M[5]:=2; exit; end;
if (M[2]=2) and (M[1]=0) and (M[3]=0) then begin M[1]:=2; exit; end;
if (M[2]=2) and (M[5]=0) and (M[8]=0) then begin M[5]:=2; exit; end;
if (M[3]=2) and (M[1]=0) and (M[2]=0) then begin M[2]:=2; exit; end;
if (M[3]=2) and (M[5]=0) and (M[7]=0) then begin M[5]:=2; exit; end;
if (M[3]=2) and (M[6]=0) and (M[9]=0) then begin M[6]:=2; exit; end;
if (M[4]=2) and (M[1]=0) and (M[7]=0) then begin M[1]:=2; exit; end;
if (M[4]=2) and (M[5]=0) and (M[6]=0) then begin M[5]:=2; exit; end;
if (M[6]=2) and (M[9]=0) and (M[3]=0) then begin M[9]:=2; exit; end;
if (M[7]=2) and (M[4]=0) and (M[1]=0) then begin M[1]:=2; exit; end;
if (M[7]=2) and (M[8]=0) and (M[9]=0) then begin M[8]:=2; exit; end;
if (M[8]=2) and (M[7]=0) and (M[9]=0) then begin M[7]:=2; exit; end;
if (M[9]=2) and (M[8]=0) and (M[7]=0) then begin M[8]:=2; exit; end;
//6
for i:=1 to 9 do if M[i]=0 then begin
M[i]:=2;
exit;
end;
end;
procedure OutPut;
begin
if M[1]=2 then begin Form2.Label1.Caption:=' O'; Form2.Label1.Enabled:=false; end;
if M[2]=2 then begin Form2.Label2.Caption:=' O'; Form2.Label2.Enabled:=false; end;
if M[3]=2 then begin Form2.Label3.Caption:=' O'; Form2.Label3.Enabled:=false; end;
if M[4]=2 then begin Form2.Label4.Caption:=' O'; Form2.Label4.Enabled:=false; end;
if M[5]=2 then begin Form2.Label5.Caption:=' O'; Form2.Label5.Enabled:=false; end;
if M[6]=2 then begin Form2.Label6.Caption:=' O'; Form2.Label6.Enabled:=false; end;
if M[7]=2 then begin Form2.Label7.Caption:=' O'; Form2.Label7.Enabled:=false; end;
if M[8]=2 then begin Form2.Label8.Caption:=' O'; Form2.Label8.Enabled:=false; end;
if M[9]=2 then begin Form2.Label9.Caption:=' O'; Form2.Label9.Enabled:=false; end;
end;
procedure Winer;
var
i: integer;
nobody: boolean;
begin
for i:=1 to 2 do begin
if (M[1]=i) and (M[4]=i) and (M[7]=i) then begin TheEnd(i); exit; end;
if (M[1]=i) and (M[5]=i) and (M[9]=i) then begin TheEnd(i); exit; end;
if (M[1]=i) and (M[2]=i) and (M[3]=i) then begin TheEnd(i); exit; end;
if (M[2]=i) and (M[5]=i) and (M[8]=i) then begin TheEnd(i); exit; end;
if (M[3]=i) and (M[5]=i) and (M[7]=i) then begin TheEnd(i); exit; end;
if (M[4]=i) and (M[5]=i) and (M[6]=i) then begin TheEnd(i); exit; end;
if (M[6]=i) and (M[3]=i) and (M[9]=i) then begin TheEnd(i); exit; end;
if (M[7]=i) and (M[8]=i) and (M[9]=i) then begin TheEnd(i); exit; end;
end;
nobody:=true;
for i:=1 to 9 do if M[i]=0 then nobody:=false;
if nobody then begin
ShowMessage(' НИЧЬЯ ');
win_nobody:=win_nobody+1;
Form2.Label12.Caption:='Ничья: '+IntToStr(win_nobody);
end;
end;
procedure TheEnd(q: integer);
begin
if q=1 then begin
ShowMessage(' ВЫ ВЫИГРАЛИ:) ');
win_men:=win_men+1;
end
else begin
ShowMessage(' КОМПЬЮТЕР ВЫИГРАЛ:( ');
win_comp:=win_comp+1;
end;
Form2.Label1.Enabled:=false;
Form2.Label2.Enabled:=false;
Form2.Label3.Enabled:=false;
Form2.Label4.Enabled:=false;
Form2.Label5.Enabled:=false;
Form2.Label6.Enabled:=false;
Form2.Label7.Enabled:=false;
Form2.Label8.Enabled:=false;
Form2.Label9.Enabled:=false;
Form2.Label10.Caption:='Человек: '+IntToStr(win_men);
Form2.Label11.Caption:='Компьютер: '+IntToStr(win_comp);
end;
procedure TForm2.Button1Click(Sender: TObject);
var
i: integer;
begin
for i:=1 to 9 do M[i]:=0;
Label1.Enabled:=true;
Label2.Enabled:=true;
Label3.Enabled:=true;
Label4.Enabled:=true;
Label5.Enabled:=true;
Label6.Enabled:=true;
Label7.Enabled:=true;
Label8.Enabled:=true;
Label9.Enabled:=true;
Label1.Caption:='';
Label2.Caption:='';
Label3.Caption:='';
Label4.Caption:='';
Label5.Caption:='';
Label6.Caption:='';
Label7.Caption:='';
Label8.Caption:='';
Label9.Caption:='';
if RadioGroup1.ItemIndex=1 then
begin
VirtualMind;
OutPut;
Winer;
end;
end;
procedure TForm2.Label1Click(Sender: TObject);
begin
M[1]:=1;
Label1.Caption:=' X';
Label1.Enabled:=false;
VirtualMind;
OutPut;
Winer;
end;
procedure TForm2.Label2Click(Sender: TObject);
begin
M[2]:=1;
Label2.Caption:=' X';
Label2.Enabled:=false;
VirtualMind;
OutPut;
Winer;
end;
procedure TForm2.Label3Click(Sender: TObject);
begin
M[3]:=1;
Label3.Caption:=' X';
Label3.Enabled:=false;
VirtualMind;
OutPut;
Winer;
end;
procedure TForm2.Label4Click(Sender: TObject);
begin
M[4]:=1;
Label4.Caption:=' X';
Label4.Enabled:=false;
VirtualMind;
OutPut;
Winer;
end;
procedure TForm2.Label5Click(Sender: TObject);
begin
M[5]:=1;
Label5.Caption:=' X';
Label5.Enabled:=false;
VirtualMind;
OutPut;
Winer;
end;
procedure TForm2.Label6Click(Sender: TObject);
begin
M[6]:=1;
Label6.Caption:=' X';
Label6.Enabled:=false;
VirtualMind;
OutPut;
Winer;
end;
procedure TForm2.Label7Click(Sender: TObject);
begin
M[7]:=1;
Label7.Caption:=' X';
Label7.Enabled:=false;
VirtualMind;
OutPut;
Winer;
end;
procedure TForm2.Label8Click(Sender: TObject);
begin
M[8]:=1;
Label8.Caption:=' X';
Label8.Enabled:=false;
VirtualMind;
OutPut;
Winer;
end;
procedure TForm2.Label9Click(Sender: TObject);
begin
M[9]:=1;
Label9.Caption:=' X';
Label9.Enabled:=false;
VirtualMind;
OutPut;
Winer;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
win_men:=0;
win_comp:=0;
win_nobody:=0;
Label10.Caption:='Человек: '+IntToStr(win_men);
Label11.Caption:='Компьютер: '+IntToStr(win_comp);
Label12.Caption:='Ничья: '+IntToStr(win_nobody);
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Form2.Close;
Form4.ProgressBar1.Visible:=false;
Form4.RadioButton1.checked:=false;
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
Form2.Close;
Form1.close;
Form4.close;
end;
procedure TForm2.Button4Click(Sender: TObject);
begin
Form2.Close;
Form1.Show;
end;
procedure TForm2.Button5Click(Sender: TObject);
var
s:string;
begin
s:='Результаты вашей игры : ';
Krestiki_Noliki.Lines.Add(s);
Krestiki_Noliki.Lines.Add(Label10.Caption);
Krestiki_Noliki.Lines.Add(Label11.Caption);
Krestiki_Noliki.Lines.Add(Label12.Caption);
if SaveDialog1.Execute then
Begin
Krestiki_Noliki.Lines.SaveToFile(SaveDialog1.FileName + '.txt');
ShowMessage('Файл успешно сохранён!');
end
else
ShowMessage('Сохранение файла отменено пользователем!');
end;
end.
unit Unit3; //поле 5х5
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Menus, XPMan, StdCtrls;
type
TForm3 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
GroupBox2: TGroupBox;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Image1: TImage;
Button5: TButton;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
const
C_CellWH = 60; // длина и ширина одной клетки
C_CC = 5; // колич клеток
type
TKrestikNolik = (knKrestik,knNolik); // крестик или нолик
TGorVertDiag = (gvGor,gvVert,gvD1,gvD2,gvAll); // горизонталь или вертикаль
TPole = array [0..C_CC-1] of array [0..C_CC-1] of Byte;
var
Form3: TForm3;
Pl: TPole;
i,j,k:integer;
procedure PaintKN(S:TKrestikNolik; CellX,CellY:byte);
function isYes(var P:TPole):byte;
function RandomNolik(var P:TPole; N:TGorVertDiag; K:byte):Boolean;
function NewNolik(var P:TPole; prevX,prevY:byte):byte;
procedure NewGame;
implementation
uses Unit4, Unit1;
{$R *.dfm}
procedure TForm3.FormCreate(Sender: TObject);
var i:integer;
begin
Form3.Button5.Visible:=false;
Form3.Button4.Visible:=true;
Form3.ClientHeight:=C_CellWH*C_CC;
Form3.ClientWidth:=Form3.ClientHeight; // C_CellWH*C_CC
Image1.ClientWidth:=Form3.ClientWidth;
Image1.ClientHeight:=Image1.ClientWidth; //Form1.ClientHeight
Image1.Picture:=nil;
Image1.Canvas.Pen.Color:=clblack;
for i:=1 to C_CC-1 do
begin
Image1.Canvas.MoveTo(C_CellWH*i,0);
Image1.Canvas.LineTo(C_CellWH*i,Image1.Height);
Image1.Canvas.MoveTo(0,C_CellWH*i);
Image1.Canvas.LineTo(Image1.Width,C_CellWH*i);
end;
FillChar(Pl,SizeOf(pl),0);
end;
procedure PaintKN(S:TKrestikNolik; CellX,CellY:byte);
begin
Form3.Image1.Canvas.Pen.Width:=3;
Case S of
knKrestik: begin
Form3.Image1.Canvas.Pen.Color:=clRed;
Form3.Image1.Canvas.MoveTo( (C_CellWH div 8) + CellX*C_CellWH,
(C_CellWH div 8) + CellY*C_CellWH );
Form3.Image1.Canvas.LineTo( 7*(C_CellWH div 8) + CellX*C_CellWH,
7*(C_CellWH div 8) + CellY*C_CellWH );
Form3.Image1.Canvas.MoveTo( (C_CellWH div 8) + CellX*C_CellWH,
7*(C_CellWH div 8) + CellY*C_CellWH );
Form3.Image1.Canvas.LineTo( 7*(C_CellWH div 8) + CellX*C_CellWH,
(C_CellWH div 8) + CellY*C_CellWH );
end;
knNolik: begin
Form3.Image1.Canvas.Pen.Color:=clBlue;
Form3.Image1.Canvas.Brush.Style:=bsClear;
Form3.Image1.Canvas.Ellipse( (C_CellWH div 8) + CellX*C_CellWH,
(C_CellWH div 8) + CellY*C_CellWH,
7*(C_CellWH div 8) + CellX*C_CellWH,
7*(C_CellWH div 8) + CellY*C_CellWH );
end;
End;
end;
function isYes(var P:TPole):byte;
var i,j:byte; A:Boolean; k,n:byte;
begin
// проверяем главную диагональ
k:=0; n:=0;
for i:=0 to C_CC-1 do
if p[i,i] = 1 then Inc(k) else if p[i,i] = 2 then Inc(n);
if k = C_CC then begin Result:=1; Exit; end;
if n = C_CC then begin Result:=2; Exit; end;
// проверяем вторую диагональ
k:=0; n:=0;
for i:=0 to C_CC-1 do
if p[i,C_CC-1-i] = 1 then Inc(k) else if p[i,C_CC-1-i] = 2 then Inc(n);
if k = C_CC then begin Result:=1; Exit; end;
if n = C_CC then begin Result:=2; Exit; end;
for i:=0 to C_CC-1 do
begin
// вертикаль
k:=0; n:=0;
for j:=0 to C_CC-1 do
if p[i,j] = 1 then Inc(k) else if p[i,j] = 2 then Inc(n);
if k = C_CC then begin Result:=1; Exit; end;
if n = C_CC then begin Result:=2; Exit; end;
// горизонталь
k:=0; n:=0;
for j:=0 to C_CC-1 do
if p[j,i] = 1 then Inc(k) else if p[j,i] = 2 then Inc(n);
if k = C_CC then begin Result:=1; Exit; end;
if n = C_CC then begin Result:=2; Exit; end;
end;
// проверяем занятость всех клеток
A:=false;
for i:=0 to C_CC-1 do
begin
for j:=0 to C_CC-1 do
if P[i,j] = 0 then begin A:=true; Break; end;
if A then Break;
end;
if not A then begin Result:=3; Exit; end;
Result:=0;
end;
function RandomNolik(var P:TPole; N:TGorVertDiag; K:byte):Boolean;
var i,j:byte;
begin
Result:=False;
if N = gvAll then
begin
if P[0,0] = 0 then
begin
P[0,0]:=2;
PaintKN(knNolik,0,0);
Result:=True; Exit;
end;
if P[C_CC-1,C_CC-1] = 0 then
begin
P[C_CC-1,C_CC-1]:=2;
PaintKN(knNolik,C_CC-1,C_CC-1);
Result:=True; Exit;
end;
if P[0,C_CC-1] = 0 then
begin
P[0,C_CC-1]:=2;
PaintKN(knNolik,0,C_CC-1);
Result:=True; Exit;
end;
if P[C_CC-1,0] = 0 then
begin
P[C_CC-1,0]:=2;
PaintKN(knNolik,C_CC-1,0);
Result:=True; Exit;
end;
for i:=0 to C_CC-1 do
for j:=0 to C_CC-1 do
if P[i,j] = 0 then
begin
P[i,j]:=2;
PaintKN(knNolik,i,j);
Result:=True; Exit;
end;
end;
for i:=0 to C_CC-1 do
begin
Case N of
gvGor: begin
if P[i,K] = 0 then
begin
P[i,K] := 2;
PaintKN(knNolik,i,K);
Result:=True;
Exit;
end else Result:=False;
end;
gvVert: begin
if P[K,i] = 0 then
begin
P[K,i] := 2;
PaintKN(knNolik,K,i);
Result:=True;
Exit;
end else Result:=False;
end;
gvD1: begin
if P[i,i] = 0 then
begin
P[i,i] := 2;
PaintKN(knNolik,i,i);
Result:=True;
Exit;
end else Result:=False;
end;
gvD2: begin
if P[i,C_CC-1-i] = 0 then
begin
P[i,C_CC-1-i] := 2;
PaintKN(knNolik,i,C_CC-1-i);
Result:=True;
Exit;
end else Result:=False;
end;
End;
end;
end;
function NewNolik(var P:TPole; prevX,prevY:byte):byte;
var i,j,n:byte; KG,KV,KD1,KD2,NG,NV,ND1,ND2,RN:Boolean;
vinX,vinY:byte;
begin
Result:=0;
i:=isYes(P);
if i in [1,3] then begin Result:=i; Exit; end;
KG:=False; KV:=False; KD1:=False; KD2:=False;
NG:=False; NV:=False; ND1:=False; ND2:=False;
RN:=False;
// анализ
for i:=0 to C_CC-1 do
begin
if i <> prevX then
Case P[i,prevY] of
1: KG:=True;
2: NG:=True;
end;
if i <> prevY then
Case P[prevX,i] of
1: KV:=True;
2: NV:=True;
end;
end;
if prevX = prevY then
for i:=0 to C_CC-1 do
if i <> prevX then
Case P[i,i] of
1: KD1:=True;
2: ND1:=True;
end;
if prevX + prevY = C_CC-1 then
for i:=0 to C_CC-1 do
if i <> prevX then
Case P[i,C_CC-1-i] of
1: KD2:=True;
2: ND2:=True;
end;
vinX:=255; vinY:=255;
for i:=0 to C_CC-1 do
begin
n:=0;
for j:=0 to C_CC-1 do if P[i,j] = 2 then Inc(n);
if n = C_CC-1 then
begin
for j:=0 to C_CC-1 do if P[i,j] = 0 then begin VinY:=j; VinX:=i; Break; end;
if (VinX <> 255) and (VinY <> 255) then Break;
end;
n:=0;
for j:=0 to C_CC-1 do if P[j,i] = 2 then Inc(n);
if n = C_CC-1 then
begin
for j:=0 to C_CC-1 do if P[j,i] = 0 then begin VinY:=i; VinX:=j; Break; end;
if (VinX <> 255) and (VinY <> 255) then Break;
end;
end;
// выбор решения
while True do
begin
if (VinX <> 255) and (VinY <> 255) then
begin
P[VinX,VinY]:=2;
PaintKN(knNolik,VinX,VinY);
RN:=true;
end;
if RN then Break;
if KG and not NG then RN := RandomNolik(P,gvGor,prevY);
if RN then Break;
if KV and not NV then RN := RandomNolik(P,gvVert,prevX);
if RN then Break;
if KD1 and not ND1 then RN := RandomNolik(P,gvD1,0);
if RN then Break;
if KD2 and not ND2 then RN := RandomNolik(P,gvD2,0);
if RN then Break;
RandomNolik(P,gvAll,0);
Break;
end;
i:=isYes(P);
if i in [2,3] then begin Result:=i; Exit; end;
end;
procedure NewGame;
var i:integer;
begin
Form3.Image1.Picture:=nil;
Form3.Image1.Canvas.Pen.Color:=clBlack;
for i:=1 to C_CC-1 do
begin
Form3.Image1.Canvas.MoveTo(C_CellWH*i,0);
Form3.Image1.Canvas.LineTo(C_CellWH*i,Form3.Image1.Height);
Form3.Image1.Canvas.MoveTo(0,C_CellWH*i);
Form3.Image1.Canvas.LineTo(Form3.Image1.Width,C_CellWH*i);
end;
FillChar(Pl,SizeOf(pl),0);
end;
procedure TForm3.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var Mess:String;
begin
if Button in [mbRight,mbMiddle] then Exit;
if Pl[(X div C_CellWH), (Y div C_CellWH)] <> 0 then Exit;
PaintKN(knKrestik,(X div C_CellWH), (Y div C_CellWH));
Pl[(X div C_CellWH),(Y div C_CellWH)]:=1;
Case NewNolik(Pl,(X div C_CellWH),(Y div C_CellWH)) of
0: Mess:='';
1: begin
Mess:='ВЫ ВЫИГРАЛ!:)';
i:=i+1;
Label3.caption:='Человек : '+IntToStr(i);
end;
2: begin
Mess:='КОМПЬЮТЕР ВЫИГРАЛ!:(';
j:=j+1;
Label3.caption:='Компьютер : '+IntToStr(j);
end;
3: begin
Mess:='НИЧЬЯ';
k:=k+1;
Label3.caption:='Ничья : '+IntToStr(k);
end;
End;
if Mess <> '' then
Case MessageDlg(Mess+#13#10+'Хотите сыграть ещё раз?',mtConfirmation,[mbYes, mbCancel],0) of
mrYes: NewGame;
End;
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
Form3.Close;
Form4.ProgressBar1.visible:=false;
Form4.RadioButton2.Checked:=FALSE;
end;
procedure TForm3.Button3Click(Sender: TObject);
begin
Form1.close;
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
Form3.Close;
Form4.close;
end;
procedure TForm3.Button4Click(Sender: TObject);
begin
NewGame;
end;
procedure TForm2.Button6Click(Sender: TObject);
var
s:string;
begin
s:='Результаты вашей игры : ';
Krestiki_Noliki.Lines.Add(s);
Krestiki_Noliki.Lines.Add(Label3.Caption);
Krestiki_Noliki.Lines.Add(Label4.Caption);
Krestiki_Noliki.Lines.Add(Label5.Caption);
if SaveDialog1.Execute then
Begin
Krestiki_Noliki.Lines.SaveToFile(SaveDialog1.FileName + '.txt');
ShowMessage('Файл успешно сохранён!');
end
else
ShowMessage('Сохранение файла отменено пользователем!');
end;
end.
unit Unit4; //выбор размерности поля
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, jpeg, ExtCtrls;
type
TForm4 = class(TForm)
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Button1: TButton;
Button2: TButton;
ProgressBar1: TProgressBar;
Image1: TImage;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
uses Unit2, Unit3, Unit1;
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
begin
ProgressBar1.Visible:=true;
ProgressBar1.Position:=30;
Подобные документы
Разработка алгоритма, выполняющего поиск наилучшего решения на каждый ход в игре "крестики-нолики" (используя минимальный алгоритм). Обоснование выбора программных средств для решения задачи. Блок-схема интеллектуального алгоритма реализации программы.
контрольная работа [380,0 K], добавлен 28.04.2014Проект программы "Крестики-нолики". Блок-схема алгоритма. Описание работы программного продукта. Инструкция по инсталляции. Инструкция программисту, возможность доработки с целью упрощения исполняемых кодов. Инструкция по проверке и тестированию.
курсовая работа [235,8 K], добавлен 05.12.2009Разработка популярной развлекательной игры крестики-нолики. Возможность играть с компьютером, который играет согласно созданному алгоритму. Новые возможности Visual Studio. Легкое усвоение программы. Удобный интерфейс - "визитная карточка" приложения.
курсовая работа [74,6 K], добавлен 20.12.2009Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.
курсовая работа [352,8 K], добавлен 14.04.2011Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Анализ предметной области разрабатываемого программного продукта. Разработка интерфейса пользователя и структурной схемы игровой программы "Крестики-нолики". Отладка и тестирование. Проведение исследования компонентов программной среды Borland Delphi 6.0.
курсовая работа [660,4 K], добавлен 08.03.2015Программный продукт для игры "Крестики-нолики". Описание пользовательского интерфейса. Факт базы данных, определяющий состояние счёта. Предикат изменяющий состояние игрового процесса и подсчитывающий количество занятых ячеек поля. Исходный код программы.
курсовая работа [34,6 K], добавлен 19.05.2014Общая характеристика языков программирования. Краткий обзор C, C++, Java, PHP, Python, Delphi и Visual Basic. Процесс разработки программы игра "Крестики и нолики" с помощью AppWizard. Компиляция и компоновка модулей, определение интерфейса приложения.
курсовая работа [2,5 M], добавлен 27.05.2014Разработка консольного приложения: описание и сценарий использования программы, интерфейс пользователя. Поэтапное описание создание кода компьютерной игры "Крестики нолики". Функциональные и нефункциональные требования, описание исключительных ситуаций.
методичка [819,6 K], добавлен 12.05.2013Знакомство с интерфейсом пользователя и сценарием использования программы игры в крестики и нолики. Функциональные и нефункциональные требования для персонального компьютера. Исключительные ситуации и реакция программы. Пример кода игры и комментарии.
курсовая работа [236,5 K], добавлен 27.01.2014