Игровая программа Нарды

Мосалев Р. А.

Утв.

Н.контрр.

Пров.

Разраб.

У

Лит.

Лист

1

2

Листов

ВАМК.230105.БКП.21-09 ПЗ

Дата

Подп.

№докум.

Изм.

Лист

  ПО-106



№ докум.

Лист



Содержание

			

	Введение	2

	1 Общая часть	4

	1.1 Постановка задачи	4

	1.2 Технико-математическое описание	6

	1.3 Программное обеспечение	9

	1.4 Состав и параметры технических и программных средств	12

	2 Специальная часть	14

	2.1 Описание алгоритмов	14

	2.2 Описание работы программы	16

	2.3 Инструкция по выполнению программы	18

	2.4 Тестирование и отладка	22

	2.5 Контрольный пример	24

	Заключение	28

	Список литературы	30

	Приложение А. Текст программы	31

		

	




Введение

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

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

Задачей курсового проектирования ставится разработка игровой программы «Нарды», которая является виртуальным аналогом настольной игры. Перенос реальной игры на виртуальную основу имеет ряд преимуществ:

		позволяет немедленно приступить к игре без каких либо действий по ее подготовке;

		исключает возможность жульничества во время игры;

		исключает возможность случайных нарушений правил игры в связи с их незнанием;

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

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

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

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

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

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

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

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







1 Общая часть

Постановка задачи



	Задание курсового проекта - разработать игровую программу «Нарды», которая должна предоставлять все средства для игры в соответствующую игру на персональном компьютере.

		Целью разработки является реализация качественного программного продукта.

	Программа должна быть построена по модульно-иерархическому принципу и включать блоки: РабочаяФорма, ИгровыеВычисления, Заполнение, Правила игры.

	Программа должна включать в себя следующие компоненты:

	правила игры в Нарды;

	игровую плоскость;

	фишки игроков;

	механизм определения и завершения ходов;

	механизм слежения за соблюдением правил игры;

	механизм сохранения и загрузки игры.

Входными данными являются:

		файлы в формате *.SAV, содержащие информацию о сохраненных играх;

	графические изображения.

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

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

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

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

	Механизм сохранения и загрузки игры позволяет сохранить результаты незавершенной партии и загрузить их в любой удобный для пользователя момент. Таким образом уже достигнутые результаты затянувшейся партии не будут потеряны.

	Для корректной работы программы рекомендуется операционная система Windows XP;  процессор с тактовой частотой не менее 850 МГц; видео карта с памятью не менее 64 Мб, клавиатура, мышь, pекомендуется использовать разрешение экрана 1024х768 базовый язык программирования – Delphi 7.0 .

	Специальных требований к характеристикам программы не предъявляется.

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






















1.2 Технико-математическое описание



Работа программы базируется на двух основных массивах и операциях над ними. Массив mas[i,j] содержит информацию об игровом процессе, массим bones[i] содержит значения ходов игрока. При «броске» кубиков в массив bones[i] заносятся два значения в интервале от одного до щести, которые генерируются при помощи функции random, затем при помощи конструкции case выбираются два изображения кубиков, соответствующие сгенерировонным числам и выводятся на экран. Если эти значения равны, то в соответствии с правилами игры в массив заносится четыре значения.

Далее программа в цикле проверяет доступность сгенерированных ходов: программа проверяет каждую ячейку на игровом поле, пока не найдет ячейку с фишкой, принадлежащей текущему игроку. Затем проверяется возможность хода   if mas[i+bones[j],1]=0 or mas[i+bones[j],1]=player(идентификатор игрока). 

Если условие выполняется хотя бы раз, то ход доступен. Все недоступные ходы блокируются.

Чтобы избежать неверного удаления доступных ходов, программа перед окончательной блокировкой проверяет, возможен ли ход bones[2] после хода bones[1] и возможен ли ход bones[1] после хода bones[2]. Для этого программа по очереди находит все ячейки с принадлежащими текущему игроку фишками, из которых возможен один из ходов, «перемещает» фишку на этот ход, пытается совершить второй ход из новой позиции. 

Когда игрок приводит все свои фишки в «дом» (для первого игрока: ячейки с 19 по 24, для второго игрока: ячейки с седьмой по 12) проверко возможных ходов для этого игрока отключается, так как в этом случае игрок может совершать любые ходы, не зависимо от расположения фишек.

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

n=4-количество возможных ходов





j:=1 to 4

i:=1 to 24

mas[i+bones[j],1]=0 or mas[i+bones[j],1]=player

k:=k+1

да

нет

k<4

да

n:=4-k

нет

После генерации и проверки ходов они отображаются на экране, и игрок может начать ход. При выборе ячейки, из которой нужно совершить ход, программа просчитывает, возможно ли осуществить ход из этой ячейки по формуле mas[i+bones[j],1]=0 or mas[i+bones[j],1]=player. Доступные перемещения фишки подсвечиваются стрелками на игровом поле.

После перемещения фишки программа запоминает на сколько ячеек была передвинута и обнуляет соответствующее значение в массиве bones[i].

Ход может быть завершен только в случае, когда все значения массива bones[i] равны нулю. 

Если после совершения одного из доступных ходов игрок не может совершить второй, это значит, что ход совершен не по правилам. Игроку следует нажать кнопку «ОТМЕНА ХОДА», которая возвращает игровой процесс к моменту броска кубиков, и совершить другой ход, который откроет возможность использовать все доступные перемещения.

Когда все фишки игрока попадают в «дом» необходимо снимать их с игрового поля. «Дом» для первого игрока – это ячейки с 19 по 25, для второго – с седьмой по 12 и 26. Игрок считается пришедшим в дом, если:

– для первого игрока:

mas[19,2]+mas[20,2]+mas[21,2]+mas[22,2]+mas[23,2]+mas[24,2]+mas[25,2]=15

– для второго игрока:

mas[7,2]+mas[8,2]+mas[9,2]+mas[10,2]+mas[11,2]+mas[12,2]+mas[26,2]=15

Ячейки 25 и 26 не отображаются на игровом поле, они служат «хранилищем» для снятых фишек. Игорок побеждает когда все его фишки окажутся в соответствующем хранилище:

– для первого игрока mas[26]=15;

– для второго игрока mas[25]=15.






1.3 Программное обеспечение



Для разработки программного продукта использовалась среда разработки – Delphi. Delphi представляет собой систему программирования. Как любая подобная система, Delphi предназначена для разработки программ и имеет две характерные особенности: создаваемые ею программы могут работать не только под управлением Windows, а сама она относится к классу инструментальных средств ускоренной разработки программ. Визуальное конструирование форм избавляет программиста от многих аспектов разработки интерфейса программы, т.к. Delphi автоматически готовит необходимые программные заготовки и соответствующий файл ресурсов.                    

В данной разработке использовалась возможность Delphi работать с  интернет браузером, которая позволяет использовать при создании программы средства HTML.  Основным компонентом разработки является компонент TImage, который позволяет загружать в него графические изображения и отображать их на экране, а также содержит методы позволяющие осуществлять взаимодействие с пользователем. Таким образом при помощи метода OnClick компонента TImage организован весь интерфейс программы и управление игровым процессом.

Реализовать программу «Нарды» можно было также средствами:    

С++

TurboPascal;

Basic;

JavaScript.

Но из-за их недостатков выбор был сделан в пользу Delphi.

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

Языки TurboPascal и Basic не являются объектно-ориентированными, что усложняет процесс создания приложения. Графические возможности этих языков весьма малы, работа с мультимедиа не поддерживается, возможность создания удобного и привлекательного интерфейса пользователя отсутствует.

При использовании языка JavaScript возможно некорректное отображение информации в некоторых веб-браузерах. Требуется постоянная проверка ссылок на файлы при перемещении страниц в другие папки жесткого диска. Также иногда приходится прописывать большой программный код для небольшого раздела.

Помимо среды разработки в процессе программной разработки использовались следующие прикладные средства под управлением Windows XP:

Adobe Photoshop CS 3 – мощный графический редактор, предоставляющий широкие возможности по созданию и редактированию изображений. Использовался для создания внешнего вида программы и объектов, скоторыми взаимодействует игрок;

Microsoft Office FrontPage 2003 – позволяет создавать различные веб-узлы и управлять ими. Использовался для создания теоретической базы, основанной на HTML-документах;

Microsoft Office Word – текстовый процессор, использовался для оформления пояснительной записки;

Microsoft Office Visio 2007 – система автоматизированного проектирования, использовалась для проектирования схемы работы программы;

Autoplay menu builder – создание автозапусков;

NullSoft Install System – создание инсталляций.    

Для создания игровой программы «Нарды» использовались следующие компоненты среды разработки Delphi:

Image – обеспесивает вывод на поверхность формы иллюстраций, представленных в *.bmp или *.jpg формате, при помощи этого компонента организовано отображение игровой доски, перемещаемых фишек и генератор ходов (кубики);

Panel – представляет собой панель, на поверхность которой можно поместить другие компоненты, использовалась для разграничения рабочих областей;

SpeedButton – представляет собой кнопку с возможностью размещения картинки на ее поверхности;

ListBox – представляет собой список, в котором можно выбрать нужный элемент, использовался для отображения списка доступных сохраненных игр;

Edit – представляет собой поле ввода-редактирования строки/символа, использовалось для ввода имени сохраняемой игры.



	


1.4 Состав и параметры технических и программных средств

 

Минимальный набор технических средств (Таблица 2.1) подобран для операционной системы Windows_XP. Для её нормальной работы на жёстком диске необходимо 300_Мб свободного пространства. Для программного продукта необходимо 20 Мб свободного дискового пространства и 256 Мб ОЗУ, потому что в программе содержится большое количество графических изображений. Так как в программе присутствует графические файлы, ей необходима видеокарта с размером ОЗУ     32 Мб. Главная форма имеет размер 810 пикселей на 535 пикселей, поэтому необходим монитор, поддерживающий разрешение 1024х768. 

Таблица 1.1 - Минимальный состав технических средств

Наименование

Конфигурация

Процессор

Intel Pentium III 850 МГц

Оперативная память

DIMM 256 Мб

Видеокарта

SVGA 32 Мб

Жесткий диск

40 Гб

Монитор

17”

Клавиатура

стандартная 101/102

Манипулятор «мышь»

стандартный PS/2



Оптимальный набор технических средств (Таблица 2.2) подобран для ОС Windows_ХР. Рекомендуемые требования являются оптимальным вариантом для работы с программой, ее модернизации и создания.

Для  работы программы необходим процессор Intel Pentium IV 1500 Мгц, оперативная память - 512 Мб. Видеокарта с объемом ОЗУ 64 Мб и монитор 17” необходимы для просмотра графической информации. Рекомендуемое разрешение экрана – 1152х864. 3 Гб свободного дискового пространства для самой операционной системы и промежуточных файлов во время работы программы. Для модификации программы необходима среда разработки Borland Delphi 7.

Таблица 1.2 - Оптимальный состав технических средств

Наименование

Конфигурация

Процессор

Intel Pentium IV 1500 МГц

Оперативная память

DDR II 512 Мб

Видеокарта

PCI express 64 Мб

Жесткий диск

40 Гб

Монитор

17”

Клавиатура

стандартная 101/102

Манипулятор «мышь»

стандартный PS/2



Игровая программа «Нарды» работает под управлением операционной системы Windows XP/Vista. Для работы программы не требуется установка дополнительного программного обеспечения.

Для модификации программы необходимо наличие:

– среды разработки Delphi 7 для перекомпиляции проекта;

– графического редактора для редактирования используемых в программе изображений;

– MS FrontPage 2003 для редактирования используемых в программе HTML-документов.


2 Специальная часть

2.1 Описание алгоритмов



Основными алгоритмами программы являются:

– механизм слежения за соблюдением правил игры;

– механизм реализации игрового процесса;

– механизм отображения игрового процесса;

– механизм сохранения и загрузки результатов игры.  

Механизм слежения за соблюдением правил игры срабатывает в момент «броска » кубиков, он определяет все возможные ходы игрока и блокирует невозможные (процедуры ablemove и doublebones). Процедуры ablemove и doublebones виртуально совершают все возможные ходы, если какой-либо ход невозможен – он блокируется. Процедура ablemove используется в случае, когда значения, выпавшие на кубиках, неравны, в противном случае используется процедура doublebones. Эти процедуры отличаются циклом проверки доступности хода: doublebones проверяет только текущий ход,  ablemove проверяет текущий ход и его влияние на дальнейшие варианты ходов.  Игрок должен совершить максимальное количество ходов, программа не позволяет завершить ход, пока существуют возможные варианты хода. Это осуществляется при помощи массива bones, в который заносятся значения выпавшие на кубиках, после совершения хода соответствующее значение массива обнуляется. Ход может быть завершен только  тогда, когда все элементы массива равны нулю.

Процедура variants следит непосредственно за совершением хода, не позволяя игроку «поставить» свою фишку в недоступную клетку. Эта процедура использует процедуру arrow, которая при выборе фишки подсвечивает ее возможные перемещения.

Механизм реализации игрового процесса основан на двумерном массиве mas[26,2]. Первая строка  массива содержит информацию о том, каким игроком занята клетка (элементы 1 – 24 соответствуют номерам клеток на игровом поле, элементы 25 и 26 – «дом» первого и второго игроков соответственно) и принимает значения: «1» – первый игрок, «2» – второй игрок, «0» – клетка свободна. Вторая строка массива содержит информацию о количестве фишек в клетке. С массивом mas работает процедура move, она определяет номер клетки выбранной фишки и номер клетки, в которую этав фишка будет помещена. Затем в соответствии с этими данными  происходит изменение значений в массиве mas , а также обнуляется соответствующее значение массива bones.

Механизм отображения игрового процесса обеспечивается процедурами visible и redraw, которые вызываются сразу после выполнения процедуры move. Процедура visible скрывает все элементы игрового поля, после чего выполняется процедура redraw. Она считывает значения массива mas и в соответствии с полученными данными изменяет элементы игрового поля (загружает необходимые изображения) и «показывает» их игроку.

Механизм сохранения и загрузки обеспечивается в модулях save и load. Save открывает форму, предлагающую пользователю ввести имя сохранения, после чего по нажатию кнопки «Сохранить» считывает значения всех переменных и массивов, используемых в программе, в файл с расширением *.SAV. Load считывает из папки saves в каталоге программы все файлы с расширением *.SAV, после чего отображает форму, предлагающую игроку выбрать  ранее сохраненную игру из списка. По нажатии кнопки «Загрузить» данные из файла сохранения переносятся в соответствующие переменные, используемые в программе, и вызываются процедуры механизма отображения игрового процесса.

Подробная схема работы системы представлена в приложении Б. 
2.2 Описание работы программы



	Программа содержит семь модулей:

	– main содержит в себе главную форму, на которой расположены все визуальные элементы программы, и вызов всех остальных модулей программы;

	– game содержит в себе процедуры, связанные с обработкой игрового процесса;

	– draw содержит в себе процедуры, отображающие игровой процесс на экране при помощи визуальных элементов главной формы;

	– save содержит в себе форму, предоставляющую пользователю возможность сохранить результаты игры;

	– load содержит в себе форму, предоставляющую пользователю список всех ранее сохраненных игр;

	– help содержит форму, которая отображает HTML-документ,  содержащий правила игры;

	– about содержит форму, которая отображает информацию о программе и разработчиках;

	– exit содержит форму, запрашивающую подтверждение на выход из программы.

	 

  Таблица 2.1 – Модули программы

Наименование модуля

Функциональное назначение

Компоненты взаимодействия





вызывающие

вызываемые

main.pas

Модуль главной формы

-

game.pas, load.pas, save.pas, help.pas, about.pas

game.pas

Модуль игровых рассчетов

main.pas

draw.pas

draw.pas

Модуль отображения игрового процесса на главной форме

game.pas, load.pas

-

Наименование модуля

Функциональное назначение

Компоненты взаимодействия





вызывающие

вызываемые

save.pas

Модуль сохранения данных

main.pas

-

load.pas

Модуль загрузки данных

main.pas

draw.pas

help.pas

Модуль справки

main.pas

-

about.pas

Модуль информации о программе и разработчике





exit.pas

Модуль подтверждения выхода

main.pas






2.3 Инструкция по выполнению программы

При запуске программы отображается главная форма, на которой доступны семь кнопок: «НОВАЯ ИГРА» , «ЗАГРУЗИТЬ», «СОХРАНИТЬ», «ОТМЕНИТЬ ХОД», «О ПРОГРАММЕ», «СПРАВКА» и «ВЫХОД» (рисунок 1). 





Рисунок 1 – Главная форма.





При нажатии на кнопку «НОВАЯ ИГРА» программа автоматически случайным образом определяет, какой игрок будет ходить первым, и предлагает ему «бросить » кубики. При нажатии на кнопку «ЗАГРУЗИТЬ»  программа считывает из папки saves корневого каталога программы все сохраненные игры и предоставляет список пользователю на новой форме (рисунок 2). После выбора нужной игры и нажатия на кнопку «ЗАГРУЗИТЬ» программы загружает сохраненные данные и предлагает продолжить игру.





Рисунок 2- Форма загрузки игры

Чтобы «бросить кубики» игроку необходимо навести указатель мыши на картинку в правом верхнем углу главной формы (рисунок 3) и нажать левую кнопку мыши. Произойдет случайная генерация двух чисел в диапозоне от одного до шести, которые являются предоставленными ходами. После генерации ходов производится проверка возможности их совершить, если из предоставленных ходов невозможно совершить ни один, происходит смена игрока. Доступные ходы отображены на главной форме (рисунок 3). В соответствии с правилами, игрок не имеет права завершить свой ход, пока существует возможность его продолжить. Игроки совершают ходы по очереди до завершения игры. 





Рисунок 3 – Генерация ходов.



Если игра завершилась победой одного из игроков, то отображается соответствующее сообщение (рисунок 4).





Рисунок 4 – Сообщение о победе.

Во время игры существует возможность отменить свой ход до полного его завершения при помощи кнопки «ОТМЕНИТЬ ХОД». Нажатие этой кнопки ведет к восстановлению всех данных в их состояние на момент «броска» кубиков.

Также во время игры можно сохранить все данные нажатием на кнопу «СОХРАНИТЬ ИГРУ». При нажатии на эту кнопку активируется новая форма, предлагающая игроку ввести имя новой сохраняемой игры (рисунок 5). После ввода имени и нажатии на кнопку «СОХРАНИТЬ» программа сохраняет данные в папку saves в корневом каталоге программы.





Рисунок 5 – Форма сохранения игры.



	Выйти из программы можно в любое время нажатием на кнопку «ВЫХОД».

	При нажатии на кнопку «СПРАВКА» активируется форма с расположенным на ней вэб-браузером, в котором отображаются правила игры (рисунок 6).





Рисунок 6 – Форма «СПРАВКА».

	При нажатии на кнопку «О ПРОГРАММЕ» активируется форма, на которой отображается информация о разработчиках и о программе (рисунок 7).





Рисунок 7 – Форма «О ПРОГРОАММЕ»

	


2.4 Тестирование и отладка

Существует три основных типа ошибок, которые могут явиться причиной прекращения выполнения программы или неверного результата:

		синтаксические ошибки;

		ошибки выполнения;

		логические ошибки.

Синтаксические ошибки обнаруживаются при компиляции или запуске программы. 

Большинство синтаксических ошибок легко обнаруживается и устраняется. 

Ошибки выполнения являются наиболее распространенным типом ошибок. Однако данный тип ошибок достаточно легко обнаруживается и устраняется с помощью отладчика.

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



Таблица 2.2 – Ошибки при разработке программы.

Ошибка

Тип ошибки

Метод устранения

Out of range

логическая

Добавлены дополнительные условия, сокращен диапазон выполнения цикла.

Некорректоне определение присутствия игрока в «доме»

Логическая

Добавлено новое условие

Ошибка

Тип ошибки

Метод устранения

Cant find file

выполнения

Прописан новый путь к файлам

Access violation filed

логическая

Добавлено новое исключение в алгоритм

Возможность совершить бесконечное количество ходов

логическая

Введена автоматическая смена игрока перед генерацией нового хода

Невозможность победы

логическая

Отключение процедуры проверки возможности хода при условии, что игрок «пришел в «дом»

Некорректные результаты процедуры проверки возможных, ходов при первом ходе

логическая

Добавлено дополнительное условие, изменен алгоритм проверки

Неккоректные результаты процедуры отображения игрового процесса

логическая

Добавлена конструкция begin…end;

Совпадение имен массива и процедуры

логическая

Исправлено имя процедуры

Обнуление основных переменных при отмене хода сразу после загрузки ранее сохраненной игры

логическая

Добавлено заполнение резервных переменных

Некорректное действие при нажатии кнопки «НОВАЯ ИГРА»

логическая

Добавлено занесение начальных данных в основные переменные


2.5 Контрольный пример



В качестве контрольного примера рассмотрим игру между двумя игроками: «Игрок 1» и «Игрок 2».

При нажатии на кнопку «НАЧАТЬ ИГРУ» выводится сообщение «Начинающий игрок определен случайным образом, бросьте зары» (рисунок 8). 





Рисунок 8 – Сообщение о начале игры.

 

Один из игроков нажимает на кубики, выводится сообщение: «Ходят белые». Превый игрок начинает свой ход. Доступные ходы – три и два. «Игрок 1» перемещает фишку на три, а затем на две клетки вперед (рисунок 9). 





Рисунок 9 – Первый ход «Игрока 1».



«Игрок 2» нажимает на кубики, вывдится сообщение: «Ходят черные». «Игрок 2» совершает свой ход, «Игрок 1» нажимает на кубики. Спустя несколько ходов Игроку 1 доступно четыре хода по пять ячеек, он совершает три хода и нажимает на кубики. Программа выдает сообщение об ошибке: «Ход не завершен!» (Рисунок 10).





Рисунок 10 – Ход не завершен.



 Спустя еще несколько ходов «Игроку 2» «выпадает» на кубиках шесть и три, но ход «три» недоступен, «Игрок 2» совершает ход «шесть» и передает ход «Игроку 1». Игрок один нажимает на кубики, «выпадает» один и четыре, но ни один из этих ходов не доступен. Выводится сообщение: «Вы не можете походиться»    (рисунок 11). Ход переходит к «Игроку 2».





Рисунок 11 – Невозможность совершить ход.



Игроки совершили по 15 ходов, вид игрового поля перед сохранением изображен на рисунке 12.



Рисунок 12 – Игровой процесс перед сохранением.



Сохраняем игру под имеем «Игра1», выходим из игры. После этого загружаем «Игра1» и проверяем правильность загруженных данных. Вид игрового поля после загрузки изображен на рисунке 13. Все данные загружены верно, игроки продолжают партию.



Рисунок 13 – Игровой процесс после загрузки.

а1няем игру под имеем "гв, вид игрового поля изображен на рисункеимает на кубики.  2.


«Игрок 2» побеждает в партии, выводится сообщение: «Игра окончена, победили черные» (Рисунок 14).





Рисунок 14 – Сообщение о победе.






Заключение





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

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

Решение задачи получено с помощью методов нелинейного программирования. 

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

В процессе создания программы использовались приложения:

		Adobe Photoshop CS3;

		Microsoft FrontPage 2003;

		Microsoft Office Word 2003;

		Adobe Indesign CS3.

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

Разработанная программа обладает следующими свойствами:

	простота в использовании;

	имеет наглядный и понятный интерфейс;

	позволяет сохранять и загружать данные.

Так же в свою очередь программа обладает некоторым недостатком. Механизм проверки возможных ходов в исключительных ситауциях выдает неверные данные по невыясненным причинам.






Список литературы



1 http://www.fpclub.ru/games/nardy/nardylong.php

2 Боровский А Н Программирование в Delphi 2005

3 Банкел Джулиан М. Фундаментальные алгоритмы и структуры данных в Delphi

4 Дерахвелидзе П. Г., Марков Е. П. Программирование в Delphi 7

5 Кенту М. Delphi7 для профессионалов

6 Фленов М. Е. Библия Delphi

7 Культин Н. Б. Основы программирования в Delphi 8 для Microsoft.NET Framework


Приложение А 

(обязательное)

Текст программы



Модуль MAIN содержит главную форму и вызов основных процедур программы





uses draw, game, save, load, exit, help, about;



{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);

var i:integer;

begin

  getdir(0,path);

  status:=0;

  for i:=1 to 4 do bones[i]:=0;

  for i:=1 to 4 do bones2[i]:=0;

  varbones(sender);

  for i:=1 to 26 do mas[i,1]:=0;

  for i:=1 to 26 do mas[i,2]:=0;

  for i:=1 to 26 do mas2[i,1]:=0;

  for i:=1 to 26 do mas2[i,2]:=0;

  mas[1,1]:=1;

  mas[1,2]:=15;

  mas[13,1]:=2;

  mas[13,2]:=15;

  mas[25,1]:=1;

  mas[26,1]:=2;

  mas2[1,1]:=1;

  mas2[1,2]:=15;

  mas2[13,1]:=2;

  mas2[13,2]:=15;

  mas2[25,1]:=1;

  mas2[26,1]:=2;

  draw.visible(sender);

  draw.redraw(sender);

end;



procedure TForm1.niClick(Sender: TObject); // i – от 1 до 24 

begin

  game.variants(sender,1);

end;



procedure TForm1.miClick(Sender: TObject); // i  - от 1 до 24

begin

  game.move(sender,1);

end;



procedure TForm1.bldomclickClick(Sender: TObject);

begin

  game.movehouse(Sender,26,zar);

end;



procedure TForm1.bones_clickClick(Sender: TObject);

begin

  game.bonesclick(sender);

end;



procedure TForm1.Button1Click(Sender: TObject);

var z1,z2:integer;

begin

  If messagedlg('Вы действительно хотите начать новую игру?',mtinformation,[mbOk,mbCancel],0)=1 then begin

  formcreate(sender);

  z1:=random(6)+1;

  z2:=random(6)+1;

  if z1=z2 then form1.Button1Click(sender)

  else begin

  if z1>z2 then player:=2;

  if z2>z1 then player:=1;

  if z1<>z2 then status:=2;

  wf:=0;

  blf:=0;

  messagedlg('Начинающий игрок определен случайным образом, бросьте зары',mtinformation,[mbok],0);

  bones_click.Enabled:=true;

  end;

  end;

end;





procedure TForm1.Button2Click(Sender: TObject);

var i,j:integer;

begin

  for i:= 1 to 26 do

    for j:= 1 to 2 do mas[i,j]:=mas2[i,j];

  for i:=1 to 4 do bones[i]:=bones2[i];

  golova:=0;

  draw.visible(sender);

  draw.redraw(sender);

  varbones(sender);

end;



procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

  form2.ShowModal;

end;



procedure TForm1.SpeedButton2Click(Sender: TObject);

begin

form3.ShowModal;

end;



procedure TForm1.SpeedButton3Click(Sender: TObject);

begin

form4.ShowModal;

end;



procedure TForm1.SpeedButton4Click(Sender: TObject);

begin

form5.showmodal;

end;



procedure TForm1.SpeedButton5Click(Sender: TObject);

begin

form4.ShowModal;

end;



procedure TForm1.SpeedButton6Click(Sender: TObject);

begin

application.Minimize;

end;



procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

begin

ReleaseCapture;

SendMessage(Form1.Handle, WM_SysCommand,$F012, 0);

end;



procedure TForm1.SpeedButton7Click(Sender: TObject);

begin

form6.showmodal;

end;



procedure TForm1.wdomclickClick(Sender: TObject);

begin

  game.movehouse(Sender,25,zar);

end;



end.



Модуль GAME содержит процедуры реализации игрового процесса



uses main, draw;



procedure variants(Sender: TObject; num:integer);

var x,sum,i,j:integer;

begin

  if status=2 then begin

  messagedlg('Бросьте зары',mtinformation,[mbok],0);

  exit;

  end;

  if (status=1) and (mas[num,1]=player) then begin

    if player=1 then begin

      sum:=0;

      for i:=19 to 25 do

      if mas[i,1]=1 then sum:=sum+mas[i,2];

      if sum=15 then begin

        draw.visible(Sender);

        nomer:=num;

        for i:=1 to 4 do if bones[i]<>0 then begin

          x:=num+bones[i];

          sum:=0;

          for j:=18 to num-1 do if mas[j,1]=player then sum:=sum+mas[j,2];

          if (sum=0) and (x>25) then x:=25;

          if x=25 then zar:=i;

          if x<26 then if (mas[x,1]=player) or (mas[x,1]=0) then arrow(sender,x);

          end;

          exit;

        end;

      end;

    if player=2 then begin

      sum:=0;

      for i:=7 to 12 do

      if mas[i,1]=2 then sum:=sum+mas[i,2];

      sum:=sum+mas[26,2];

      if sum=15 then begin

        visible(Sender);

       nomer:=num;

        for i:=1 to 4 do if bones[i]<>0 then begin

          x:=num+bones[i];

         sum:=0;

         for j:=6 to num-1 do if mas[j,1]=player then sum:=sum+mas[j,2];

         if (sum=0) and (x>13) then x:=13;

         if x=13 then x:=26;

         if x=26 then zar:=i;

         if x<27 then if (mas[x,1]=player) or (mas[x,1]=0) then if (x<13) or (x=26) then arrow(sender,x);

        end;

        exit;

      end;

    end;

  end;

  if (status=1) and (mas[num,1]=player) then

  if ((mas[num,1]=1) and (num=1) and (golova=2)) or ((mas[num,1]=2) and (num=13) and (golova=2)) then else begin

  visible(Sender);

  nomer:=num;

  if bones[1]<>0 then begin

    x:=num+bones[1];

    if (mas[num,1]=2) and (x>24) then x:=x-24;

    if (x>24) or ((mas[num,1]=2) and (num<=12) and (x>12)) then else

    if (mas[x,1]=player) or (mas[x,1]=0) then arrow(sender, x);

  end;

  if bones[2]<>0 then begin

    x:=num+bones[2];

    if (mas[num,1]=2) and (x>24) then x:=x-24;

    if (x>24) or ((mas[num,1]=2) and (num<=12) and (x>12)) then else

    if (mas[x,1]=player) or (mas[x,1]=0) then arrow(sender, x);

  end;

  if main.bones[3]<>0 then begin

    x:=num+bones[3];

    if (mas[num,1]=2) and (x>24) then x:=x-24;

    if (x>24) or ((mas[num,1]=2) and (num<=12) and (x>12)) then else

    if (mas[x,1]=player) or (mas[x,1]=0) then arrow(sender, x);

  end;

  if bones[4]<>0 then begin

    x:=num+bones[4];

    if (mas[num,1]=2) and (x>24) then x:=x-24;

    if (x>24) or ((mas[num,1]=2) and (num<=12) and (x>12)) then else

    if (mas[x,1]=player) or (mas[x,1]=0) then arrow(sender, x);

  end;

end;

end;



function proverka(m:integer; zz:integer):integer;

var  i,j,nn,x:integer;

begin

nn:=0;

case player of

  1: begin

    if mas[m,1]=player then  for j:=1 to 4 do

       if m+zz*j<=24 then

        if (mas[m+zz*j,1]=player)or (mas[m+zz*j,1]=0) then  begin nn:=nn+mas[m,2];

         end

          else begin

          result:=nn;

          exit;

          end;





    end;

  2: if (m>=13) and (m<=24) then

    if mas[m,1]=player then  for j:=1 to 4 do begin

       x:=m+zz*j;

       if x>24 then x:=x-24;

        if (mas[x,1]=player)or (mas[x,1]=0) then   nn:=nn+mas[m,2]

          else begin

          result:=nn;

          exit;

          end; end else begin

    if mas[m,1]=player then  for j:=1 to 4 do

       if m+zz*j<=12 then

        if (mas[m+zz*j,1]=player)or (mas[m+zz*j,1]=0) then  nn:=nn+1*mas[m,2]

          else

          begin

          result:=nn;

          exit;

          end;

         end;

  end;

  result:=nn;

end;



procedure doublebones(sender:tobject);

var i,j,n,z,x:integer;

begin

  z:=bones[1];

  n:=0;

  case player of

  1: begin

  for i:=1 to 24-bones[1] do begin

  x:=proverka(i,z);

  n:=n+x;

 end;

  if mas[1,2]>=1 then begin

  if mas[1,2]=15 then n:=n-13 else n:=n+1-mas[1,2];

  end;

    end;

  2: begin

    for i:=13 to 24 do n:=n+proverka(i,z);

    for i:=1 to 12-bones[1] do n:=n+proverka(i,z);

    if mas[13,2]>=1 then begin

    if mas[13,2]=15 then n:=n-13 else n:=n+1-mas[13,2];

    end; //else

     end;

     end;

   if n>=4 then exit else case n of

   0: for i:=1 to 4 do bones[i]:=0;

   1: for i:=4 downto 2 do bones[i]:=0;

   2: for i:=4 downto 3 do bones[i]:=0;

   3: bones[4]:=0;

   end;

end;



procedure ablemove(sender:tobject);

var z:array[1..2] of boolean;

    p:boolean;

    i,j,x,z1,z2,s1,s2,sum:integer;

begin

  if player=1 then begin

      for i:=19 to 25 do

      if mas[i,1]=1 then sum:=sum+mas[i,2];

      if sum=15 then exit;

      end;

  if player=2 then begin

      for i:=7 to 12 do

      if mas[i,1]=2 then sum:=sum+mas[i,2];

      sum:=sum+mas[26,2];

      if sum=15 then exit;

      end;

  z1:=bones[1];

  z2:=bones[2];

  s1:=mas[24,2]+mas[23,2]+mas[22,2]+mas[21,2]+mas[20,2]+mas[19,2];

  s2:=mas[7,2]+mas[8,2]+mas[9,2]+mas[10,2]+mas[11,2]+mas[12,2];

  z[1]:=false;

  z[2]:=false;

  p:=false;

  case player of

  1: begin if bones[1]<>main.bones[2] then begin

    for j:=1 to 2 do begin

      for i:=1 to 24-bones[j] do

          if (mas[i,1]=player) and (p=false) then

            if (mas[i+bones[j],1]=player) or (mas[i+bones[j],1]=0) then begin

              p:=true;

              z[j]:=true;

              end;

      p:=false;

    end;

  case z[1] of

  true: begin

    if z[1]=z[2] then exit else

        for i:= 1 to 24-bones[1]-bones[2] do

          if (mas[i,1]=player) and  (z[2]=false) then

            if (mas[i+bones[1]+bones[2],1]=player) or (

              mas[i+bones[1]+bones[2],1]=0) then z[2]:=true;

        if z[2]=false then bones[2]:=0;

    end;

  false: begin

    if z[1]=z[2] then begin

      bones[1]:=0;

      bones[2]:=0;

      end else

        for i:= 1 to 24-bones[1]-bones[2] do

          if (mas[i,1]=player) and  (z[1]=false) then

            if (mas[i+bones[1]+bones[2],1]=player) or (

              mas[i+bones[1]+bones[2],1]=0) then z[1]:=true;

        if z[1]=false then bones[1]:=0;

    end;



  end;

  if s1=15 then begin

    if mas[z1+18,2]>=1 then bones[1]:=z1;

    if mas[z2+18,2]>=1 then bones[2]:=z2;

    end; end else doublebones(sender);

  end;

  2: begin if bones[1]<>bones[2] then begin

  for j:=1 to 2 do begin

      for i:=13 to 24 do

          if (mas[i,1]=player) and (p=false) then begin



            x:=i+main.bones[j];

            if x>24 then x:=x-24;

            if (mas[x,1]=player) or (mas[x,1]=0) then begin

              p:=true;

              z[j]:=true;

              end;

            end;

      for i:=1 to 12-bones[j] do

          if (mas[i,1]=player) and (p=false) then  begin

            x:=i+main.bones[j];

            if (mas[x,1]=player) or (mas[x,1]=0) then begin

              p:=true;

              z[j]:=true;

              end;

              end;

      p:=false;

    end;

  case z[1] of

  true: begin

    if z[1]=z[2] then exit else

        for i:= 13 to 24 do

          if (mas[i,1]=player) and  (z[2]=false) then begin

            x:=i+bones[1]+bones[2];

            if x>24 then x:=x-24;

            if (mas[x,1]=player) or (mas[x,1]=0) then z[2]:=true;

            end;

        for i:=1 to 12-bones[1]-bones[2] do

          if (mas[i,1]=player) and  (z[2]=false) then

            if (mas[i+bones[1]+bones[2],1]=player) or (

              mas[i+bones[1]+bones[2],1]=0) then z[2]:=true;

        if z[2]=false then bones[2]:=0;

    end;

  false: begin

    if z[1]=z[2] then begin

      bones[1]:=0;

      bones[2]:=0;

      end else

        for i:= 13 to 24 do

          if (mas[i,1]=player) and  (z[1]=false) then begin

            x:=i+bones[1]+bones[2];

            if x>24 then x:=x-24;

            if (mas[x,1]=player) or (mas[x,1]=0) then z[1]:=true;

            end;

        for i:=1 to 12-bones[1]-bones[2] do

          if (mas[i,1]=player) and  (z[1]=false) then

            if (mas[i+bones[1]+bones[2],1]=player) or (

              mas[i+bones[1]+bones[2],1]=0) then z[1]:=true;

        if z[1]=false then bones[1]:=0;

    end;

  end;



  if s2=15 then begin

    if mas[z1+6,2]>=1 then bones[1]:=z1;

    if mas[z2+6,2]>=1 then bones[2]:=z2;

     end; end else doublebones(sender);

  end; end;

end;



procedure bonesclick(Sender: TObject);

var i,j:integer;

begin

  if (player=1) and (mas[25,2]=15) then begin

    messagedlg('Игра закончена! Белые победили!',mtinformation,[mbok],0);

    exit;

    end ;

   if (player=2) and (mas[26,2]=15) then begin

        messagedlg('Игра закончена! Черные победили!',mtinformation,[mbok],0);

        exit;

        end;

  if (main.bones[1]=0) and (main.bones[2]=0) and (main.bones[3]=0) and

    (main.bones[4]=0) then begin

      status:=2;

      if player=1 then begin

        player:=2;

        messagedlg('Ходят черные',mtinformation,[mbok],0);

        end else begin

          player:=1;

          messagedlg('Ходят белые',mtinformation,[mbok],0);

          end;





  with form1 do begin

  randomize;

  z1:=random(6)+1;

  case z1 of

  1: leftbone.Picture:=b1.Picture;

  …

  6: leftbone.Picture:=b6.Picture;

  end;

  z2:=random(6)+1;

  case z2 of

  1: rightbone.Picture:=b1.Picture;

  …

  6: rightbone.Picture:=b6.Picture;

  end;



  golova:=0;

  status:=1;

  if z1<>z2 then begin

  bones[1]:=z1;

  bones[2]:=z2;

  bones[3]:=0;

  bones[4]:=0;

  end else begin

  bones[1]:=z1;

  bones[2]:=z1;

  bones[3]:=z2;

  bones[4]:=z2;

  end;

  if (player=1) and (bones[3]<>0) and (mas[1,2]=15) then wf:=1;

  if (player=2) and (bones[3]<>0) and (mas[13,2]=15) then blf:=1;

  ablemove(sender);

  varbones(sender);

  if (bones[1]=0) and (main.bones[2]=0) and (bones[3]=0) and (bones[4]=0) then  begin

    messagedlg('Вы не можете походиться!',mtinformation,[mbok],0);

    end;



  end;

  for i:=1 to 26 do

    for j:=1 to 2 do mas2[i,j]:=mas[i,j];

  for i:=1 to 4 do bones2[i]:=bones[i];

  end else messagedlg('Ход не завершен!',mtinformation,[mbok],0)



end;







procedure move(Sender: TObject; number1:integer);

var i,k:integer;

begin

  if (nomer=1) and (mas[nomer,1]=1) then golova:=2;

  if (nomer=1) and (mas[nomer,1]=1) and (wf=1) then begin

    golova:=1;

    wf:=0;

  end;

  if (nomer=13) and (mas[nomer,1]=2) then golova:=2;

   if (nomer=13) and (mas[nomer,1]=2) and (blf=1) then begin

    golova:=1;

    blf:=0;

  end;

  mas[nomer,2]:=mas[nomer,2]-1;

  mas[number1,1]:=player;

  mas[number1,2]:=mas[number1,2]+1;

  if mas[nomer,2]=0 then mas[nomer,1]:=0;

  draw.visible(sender);

  draw.redraw(sender);

  k:=number1-nomer;

  if k<1 then k:=k+24;

  i:=0;

  repeat

    i:=i+1;

    if main.bones[i]=k then begin

      main.bones[i]:=0;

      k:=0;

    end;

  until k=0;

  varbones(sender);

end;





procedure movehouse(Sender: TObject; number2,zar:integer);

begin

  main.bones[zar]:=0;

  mas[number2,2]:=mas[number2,2]+1;

  mas[nomer,2]:=mas[nomer,2]-1;

  if mas[nomer,2]=0 then mas[nomer,1]:=0;

  draw.visible(sender);

  draw.redraw(sender);

  varbones(sender);

  if (player=1) and (mas[25,2]=15) then begin

    messagedlg('Игра закончена! Белые победили!',mtinformation,[mbok],0);

    exit;

    end ;

   if (player=2) and (mas[26,2]=15) then begin

        messagedlg('Игра закончена! Черные победили!',mtinformation,[mbok],0);

        exit;

        end;

end;



end.



Модуль DRAW содержит процедуры отображения игрового процесса



uses main;



procedure visible(Sender: TObject);

begin

    with form1 do  begin

    m1.Visible:=false;

    …

    m24.Visible:=false;

    wdomclick.Visible:=false;

    bldomclick.Visible:=false;

    end;

end;



procedure arrow(Sender: TObject; number:integer);

begin

    with form1 do

    case number of

    1: begin

        m1.Visible:=true;

        if mas[1,2]=0 then begin

            m1.Left:=n1.Left;

            m1.Top:=n1.Top;

            end else begin

            m1.Left:=n1.Left;

            m1.Top:=n1.Top-20;

            end;

        end;

    …

    26: begin

        bldomclick.Visible:=true;

        if mas[26,2]=0 then begin

            bldomclick.Left:=bldom.Left;

            bldomclick.Top:=bldom.Top;

            end else begin

            bldomclick.Left:=bldom.Left;

            bldomclick.Top:=bldom.Top-20;

            end;

        end;

    end;

end;



procedure redraw(sender: TObject);

var i:integer;

pic:tpicture;

begin

    with form1 do

    for i:=1 to 26 do begin

    if mas[i,1]=0 then

    case i of

    1: n1.Visible:=false;  

     …

    26: bldom.Visible:=false;

    end else begin

    case i of

    1: n1.Visible:=true;

    …

    26: bldom.Visible:=true;

    end;

    if mas[i,1]=1 then

    case mas[i,2] of

    0: pic:=picpusto.Picture;

    …

    15: pic:=w15.Picture;

    end;

    if mas[i,1]=2 then

    case mas[i,2] of

    0: pic:=picpusto.Picture;

     …

    15: pic:=bl15.Picture;

    end;

    case i of

    1: n1.Picture:=pic;

     …

    26: bldom.Picture:=pic;

    end;

    end;

    end;

end;



procedure varbones(sender: Tobject);

var pic:tpicture;

i:integer;

begin

    with form1 do

    for i:=1 to 4 do begin

    case bones[i] of

    0: pic:=picpusto.Picture;

    …

    6: pic:=image8.picture;

    end;

    case i of

    1: v1.picture:=pic;

    …

    4: v4.picture:=pic;

    end;

    end;

end;

end.





Модуль LOAD содержит форму загрузки сохраненной игры



uses main, draw;



{$R *.dfm}



procedure TForm3.SpeedButton2Click(Sender: TObject);

begin

  form3.Close;

end;



procedure TForm3.SpeedButton1Click(Sender: TObject);

var i,j:integer;

begin

  if listbox1.Items.Count=0 then begin

  form3.Close;

  exit;

  end;

  form1.memo_save.Clear;

  form1.memo_save.Lines.LoadFromFile(path+'\saves\'+listbox1.Items[listbox1.itemindex]+'.sav');

  with form1 do begin

  i:=0;

  status:=strtoint(memo_save.Lines[i]);

  i:=1;

  player:=strtoint(memo_save.Lines[i]);

  i:=2;

  for j:=1 to 4 do begin

    main.bones[j]:=strtoint(memo_save.Lines[i]);

    i:=i+1;

  end;

  for j:=1 to 26 do begin

    mas[j,1]:=strtoint(memo_save.Lines[i]);

    i:=i+1;

  end;

  for j:=1 to 26 do begin

    mas[j,2]:=strtoint(memo_save.Lines[i]);

    i:=i+1;

  end;

  golova:=strtoint(memo_save.Lines[i]);

  i:=i+1;

  z1:=strtoint(memo_save.Lines[i]);

  i:=i+1;

  z2:=strtoint(memo_save.Lines[i]);

  case z1 of

  1: leftbone.Picture:=b1.Picture;

  …

  6: leftbone.Picture:=b6.Picture;

  end;

  case z2 of

  1: rightbone.Picture:=b1.Picture;

  …

  6: rightbone.Picture:=b6.Picture;

  end;

  draw.visible(sender);

  draw.redraw(sender);

  varbones(sender);

  end;

  form3.Close;

end;



procedure TForm3.FormActivate(Sender: TObject);

var

  s:string;

  SearchRec: TSearchRec;// структура SearchRec содержит информацию

                        // о файле, удовлетворяющем условию поиска

begin

  ListBox1.Clear;

  // сформировать список sav файлов

  if FindFirst(Path+'\saves\' + '*.sav', faAnyFile, SearchRec) =0 then

     begin

          // в каталоге есть файл с расширением sav

          // добавим имя этого файла в список

          s:=searchrec.Name;

          Delete(s, length(S)-3,4);

          ListBox1.Items.Add(s);

          // есть еще sav-файлы ?

          while (FindNext(SearchRec) = 0) do begin

              s:=searchrec.Name;

          Delete(s, length(S)-3,4);

          ListBox1.Items.Add(s);

          end;

              end;

   ListBox1.ItemIndex := 0;

   if listbox1.Items.Count=0 then begin

   messagedlg('Нет сохраненной игры',mtinformation,[mbok],0);

   form3.Close;

   end;

   form1.bones_click.Enabled:=true;

end;



end.



Модуль SAVE содержит форму сохранения игры



uses main;



{$R *.dfm}



procedure TForm2.SpeedButton1Click(Sender: TObject);

begin

  form1.memo_save.Lines.SaveToFile(path+'\saves\'+saveedit.Text+'.sav');

  form2.Close;

end;



procedure TForm2.SpeedButton2Click(Sender: TObject);

begin

form2.Close;

end;



procedure TForm2.FormShow(Sender: TObject);

var i:integer;

begin

with form1 do begin

memo_save.Clear;

  memo_save.Lines.Add(inttostr(status));

  memo_save.Lines.Add(inttostr(player));

  for i:=1 to 4 do memo_save.Lines.Add(inttostr(bones[i]));

  for i:=1 to 26 do memo_save.Lines.Add(inttostr(mas[i,1]));

  for i:=1 to 26 do memo_save.Lines.Add(inttostr(mas[i,2]));

  memo_save.Lines.Add(inttostr(golova));

  memo_save.Lines.Add(inttostr(z1));

  memo_save.Lines.Add(inttostr(z2));

  end;

end;



end.



Модуль EXIT содежит форму подтверждения выхода из программы



uses main, start;



{$R *.dfm}



procedure TForm4.SpeedButton1Click(Sender: TObject);

begin

form7.Close;

end;



procedure TForm4.SpeedButton2Click(Sender: TObject);

begin

form4.Close;

end;



end.



24

ВАМК.230105.БКП.21-09 ПЗ



Лист

Дата

Подп.		

 Изм









Петров А.Е.

Игровая программа «Нарды»



Пояснительная записка