Игровая программа "Крестики-нолики"

Анализ требований к программному средству, разработка функциональных требований и алгоритма. Описание компонентов 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.