Разработка программы-игры ‘Шашки’

Курсовая работа

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

Цель работы: закрепление теоретических знаний, полученных при изучении курса «Объектно-ориентированное программирование», путем создания приложения, представляющего собой программную реализацию известной логической игры «Шашкии».

Разработка объектно-ориентированных программ состоит из следующих последовательных работ:

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

Объектно-ориентированное программирование позволяет программисту моделировать объекты определённой предметной области путем программирования их содержания и поведения в пределах класса. Конструкция «класс» обеспечивает механизм инкапсуляции для реализации

Инкапсуляция как бы скрывает и подробности внутренней реализации типов, и внешние операции и функции, допустимые для выполнения над объектами этого типа.

1. Объектно-ориентированное программирование

Объектно-ориентированное, или объектное, программирование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов. В случае языков с прототипированием вместо классов используются объекты-прототипы.

5 стр., 2009 слов

Создание отчета как объекта базы данных. Экспертные и обучающиеся системы

... Параметры страницы (меню Файл). При разработке макетов отчета руководствуйтесь следующей формулой: ширина отчета + левое поле + правое поле ... на два вида: Создающие управленческие отчеты (выполняющие обработку данных: поиск, сортировку, фильтрацию). Принятие решения ... Конструктора отчетов щелкнуть на кнопке Автоформат, откроется диалоговое окно Автоформат. В списке Стили объекта "отчет - ...

1.1 История возникновения

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

Формирование КОП от ООП произошло, как случилось формирование модульного от процедурного программирования: процедуры сформировались в модули — независимые части кода до уровня сборки программы, так объекты сформировались в компоненты — независимые части кода до уровня выполнения программы. Взаимодействие объектов происходит посредством сообщений. Результатом дальнейшего развития ООП, по-видимому, будет агентно-ориентированое программирование, где агенты — независимые части кода на уровне выполнения. Взаимодействие агентов происходит посредством изменения среды , в которой они находятся.

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

Субъектно-ориентированное программирование расширяет понятие объект посредством обеспечения более унифицированного и независимого взаимодействия объектов. Может являться переходной стадией между ООП и агентным программирование в части самостоятельного их взаимодействия.

Первым языком программирования, в котором были предложены принципы объектной ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования.

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

1.2 Определение ООП и его основные концепции

программа объектный технический

Появление в ООП отдельного понятия класса закономерно вытекает из желания иметь множество объектов со сходным поведением. Класс в ООП — это в чистом виде абстрактный тип данных, создаваемый программистом. С этой точки зрения объекты являются значениями данного абстрактного типа, а определение класса задаёт внутреннюю структуру значений и набор операций, которые над этими значениями могут быть выполнены. Желательность иерархии классов (а значит, наследования) вытекает из требований к повторному использованию кода — если несколько классов имеют сходное поведение, нет смысла дублировать их описание, лучше выделить общую часть в общий родительский класс, а в описании самих этих классов оставить только различающиеся элементы.

50 стр., 24567 слов

«Разработка методической поддержки базового курса информатики ...

... программирования в базовом курсе информатики. Создать сайт учителя. Структура дипломной работы. ... высококвалифицированным программистом программы ... программирования относятся: процедурное программирование ( Pascal , Basic, Fortran , С ); логическое программирование ( Prolog ); функциональное программирование ( Lisp ); объектно-ориентированное программирование ... старших классах. Системы программирования В ...

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

активных объектов

Однако общность механизма обмена сообщениями имеет и другую сторону — «полноценная» передача сообщений требует дополнительных накладных расходов, что не всегда приемлемо. Поэтому в большинстве ныне существующих объектно-ориентированных языков программирования используется концепция «отправка сообщения как вызов метода» — объекты имеют доступные извне методы, вызовами которых и обеспечивается взаимодействие объектов. Данный подход реализован в огромном количестве языков программирования, в том числе C++, Object Pascal. В настоящий момент именно он является наиболее распространённым в объектно-ориентированных языках.

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

1.3 Особенности реализации

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

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

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

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

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

25 стр., 12250 слов

Дипломная работа разработка автоматизированной системы контроля ...

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

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

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

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

Методы доступа называют ещё аксессорами (от англ. access — доступ), а по отдельности — геттерами (англ. get — чтение) и сеттерами.

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

Свойства, по сути — не более чем синтаксический сахар, поскольку никаких новых возможностей они не добавляют, а лишь скрывают вызов методов доступа. Конкретная языковая реализация свойств может быть разной. Например, в C#объявление свойства непосредственно содержит код методов доступа, который вызывается только при работе со свойствами, то есть не требует отдельных методов доступа, доступных для непосредственного вызова. В Delphi объявление свойства содержит лишь имена методов доступа, которые должны вызываться при обращении к полю. Сами методы доступа представляют собой обычные методы с некоторыми дополнительными требованиями к сигнатуре.

Полиморфизм реализуется путём введения в язык правил, согласно которым переменной типа «класс» может быть присвоен объект любого класса-потомка её класса.

1.4 Основные понятия

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

Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.

24 стр., 11547 слов

Содержит страниц рисунков таблиц

... и углепластика  Лодки из стеклопластика  Автомобильные покрышки  Металлокомпозиты  Спортивное оборудование Машиностроение В машиностроении композиционные материалы широко применяются для создания защитных покрытий на ... состава композиционного материала может характеризоваться следующими свойствами:  толщина до 100 мкм;  класс чистоты поверхности вала (до 9);  иметь поры с размерами 1 — ...

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

Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности (объекта).

Фактически он описывает устройство объекта, являясь своего рода чертежом. Говорят, что объект — это экземпляр класса. При этом в некоторых исполняющих системах класс также может представляться некоторым объектом при выполнении программы посредством динамической идентификации типа данных. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.

Объект

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

Прототип — это объект-образец, по образу и подобию которого создаются другие объекты. Объекты-копии могут сохранять связь с родительским объектом, автоматически наследуя изменения в прототипе; эта особенность определяется в рамках конкретного языка.

2. Логическая игра «Шашки», .1 Назначение программы

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

2.2 Используемые технические и программные средства

Программа была создана в среде программирования Borland Delphi 7.0.

Язык программирования: Pascal

Минимальные системные требования:

  • не менее 500 кб свободного места на жёстком диске;
  • не менее 4 Мб свободной оперативной памяти;
  • операционная система — Windows XP/2000/Vista;
  • клавиатура;
  • мышь.

Порядок запуска программы на выполнение:

Для запуска программы достаточно запустить (сделать на нём двойной щелчок левой клавишей мыши) файл DCheckers.exe.

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

2.3 Описание логической структуры

Исходный код состоит из четырех unit (Main, Draughts, About, VChessBoard) и двух форм (fmCheckers, fmAbout).VChessBoard — данный раздел содержит метод прорисовки поля (прорисовка клеток и шашек).About — данный раздел содержит информацию о программе и правила игры;Draughts — данный раздел описывает все действия, совершаемые с шашками (Возможные ходы, запись ходов, рубка, запоминание срубленных шашек)Main — данный раздел описывает алгоритм игры. Если шашка выбрана, то проверяем правильность ходов, если рубки нет и клетка пустая, то ход сделан и переключаем игрока, если есть возможность рубки, то рубить обязательною. Отрисовка возможных ходов с учетом обязательной рубки. Проверяем, возможна ли рубка в данную клетку, рубка верна, далее рубим, определяем срубленную шашку и перескакиваем. Далее мы определяем, возможно, ли продолжение рубки, устанавливаем режим рубки, заканчиваем рубку и переключаем игрока. Проверяем победу по срубам и по блокировкам. Заканчиваем игру, и всплывает окно: победа команды белых или черных. Так же показывается, чей ход и время игры.

37 стр., 18434 слов

Проектирование Базы Данных для коммерческого предприятия

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

Исходный вид программы, после запуска приложения появится окно (рис. 1):

 описание логической структуры 1

Рисунок 1 — Основная форма содержащая игровое поле

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

 описание логической структуры 2

Рисунок 2 — Раздел меню, начать игру.

Нажав на начав игру, на игровом поле появятся шашки. Белые и черные. Ход начинают белые. С запуском начинается отсчет времени игры (рис. 3)

 описание логической структуры 3

Рисунок 3 — Появление шашек. Время игры.

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

Простые шашки могут перемещаться только вперед по диагонали на одну клетку, если она не занята. Если клетка занята шашкой соперника и за этой клеткой свободное поле, тогда должен быть произведен бой — шашка ходящего «перескакивает» через шашку соперника и последняя снимается с доски. За один бой простая шашка может побить несколько шашек соперника.

 описание логической структуры 4

Рисунок 4 — Возможные ходы

 описание логической структуры 5

Рисунок 5 — Возможность рубки

При достижении простой последней горизонтали шашка становится дамкой (рис. 6).

 описание логической структуры 6

Рисунок 6 — Дамка

Дамки могут ходить (рис. 7) или совершать бой по диагонали в любом направлении (рис. 8)

 описание логической структуры 7

Рисунок 7 — Возможные ходы дамки

 описание логической структуры 8

Рисунок 8 — Возможность рубки дамкой

После того как какой либо из игроков выигрывает всплывает окно: Игра закончена (рис. 9) и какая команда победила (рис. 10)

 описание логической структуры 9

Рисунок 9 — Окно: Игра закончена

 описание логической структуры 10

Рисунок 10 — Окно, какая команда победила

Нажав кнопку «О программе», пользователь увидит правила игры (рис. 11).

 описание логической структуры 11

Рисунок 11 — О программе

Чтобы выйти из приложения в меню нужно выбрать файл и нажать на выход (рис. 7).

47 стр., 23239 слов

Автоматизированное проектирование натяжных потолков

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

 описание логической структуры 12

Рисунок 7 — Выход из программы

2.6

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

Заключение

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

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

Пользовательское приложение разработано в среде программирования Borland Delphi 7.0.

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

[Электронный ресурс]//URL: https://inzhpro.ru/kursovaya/razrabotka-igryi-shashki/

1) Галисеев Г.В. Программирование в среде Delphi 2005. Самоучитель. Издательство «Диалектика», 2006.

2) Бобровский С.И. Технологии Delphi. Разработка приложений для бизнеса. Учебный курс. Издательство «Питер», 2006.

3) Котов В.М. Чрезвычайно грамотное и подробное описание задач динамического программирования, 2000

4) Фаронов В.В. Delphi. Программирование на языке высокого уровня. Учебник для вузов. Издательство «Питер», 2006.

5) Цветкова А.В. Информатика и информационные технологии. Издательство «Эксмо», 2008.

6) Специалисты NIIT. Использование C#. Специальное издание.: Перевод с англ. — М.: Издательский дом «Вильямс», 2002. — 528 с.

Приложение А, Исходный код

unit Main;

— interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, ExtCtrls, StdCtrls, Buttons, Menus,, VChessBoard;= class(TForm): TTimer;: TPanel;: TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TPanel;: TLabeledEdit;: TLabeledEdit;: TLabel;: TLabel;: TStaticText;: TLabel;: TStaticText;: TMenuItem;miExitClick (Sender: TObject);FormCreate (Sender: TObject);FormResize (Sender: TObject);miStartLocalGameClick (Sender: TObject);Timer1Timer (Sender: TObject);miCancelGameClick (Sender: TObject);miAboutClick (Sender: TObject);

{Private declarations}

{Public declarations}:TVisualChessBoard;, CurrentPlayer: Integer;: Boolean;:TCellPosition;: Boolean;: Integer;:TDateTime;: Boolean;vcbChessMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);vcbChessMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);vcbChessMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);TrySelectNewDraught (x, y: Integer);TryMakeStrike (x, y: Integer);SwitchCurrentPlayer;CheckForWin: Integer;;: TfmCheckers;About;

— {$R *.dfm}TfmCheckers.miExitClick (Sender: TObject);;;TfmCheckers. FormCreate (Sender: TObject);:=TVisualChessBoard. Create(pnChessBoard);. Parent:=pnChessBoard;. Left:=8;. Top:=8;. Width:=1200;. Height:=1200;. OnMouseMove:=vcbChessMouseMove;. OnMouseDown:=vcbChessMouseDown;. OnMouseUp:=vcbChessMouseUp;. Refresh;;TfmCheckers. FormResize (Sender: TObject);: Integer;pnChessBoard. Width<pnChessBoard. Height Then:=(pnChessBoard. Width-16) div 8:=(pnChessBoard. Height-16) div 8;. Left:=8;. Top:=8;. Width:=CellSize*8;. Height:=CellSize*8;. Refresh;IsDraughtChosen Then(DraughtPosition.X, DraughtPosition.Y);;TfmCheckers.vcbChessMouseMove (Sender: TObject; Shift: TShiftState;, Y: Integer);, yP: Integer;. Cursor:=crDefault;. GetCellNumberByCoord (X, Y, xP, yP);vcbChess. Board. GetDraught (xP, yP)<>nil ThenvcbChess. Board. GetDraught (xP, yP).Side=PlayerSide Then. Cursor:=crHandPoint;;TfmCheckers.vcbChessMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);, yP: Integer;StrikeMode Then Exit;. GetCellNumberByCoord (X, Y, xP, yP); Not(IsDraughtChosen) Then // Если еще нет выбранной шашки

10 стр., 4904 слов

Информатика» «Разработка программы для игры «Питон

... выполнять поставленные задачи и правильно функционировать.[3] Задачей данной курсовой работы стала разработка программы для игры «Питон». Разработанная программа, предназначенная для изображения движущегося “питона”, ... таблицы и формы программы. Алгоритм процедуры TForm1.FormCreate представлен на рисунке 3. procedure TForm1.FormCreate (Sender: TObject) Связать finfo с файлом i=0 Нет Файл ‘info.dat’ ...

Begin(xP, yP);Begin // Если уже есть выбранная шашкаvcbChess. Board. GetDraught (xP, yP)=nil Then // Если клетка пустая, то обработаем как отпускание мыши

vcbChessMouseUp (Sender, Button, Shift, X, Y);

Else Begin // Если там стоит наша шашка, то сбросим выбор и рекурсируем

If vcbChess. Board. GetDraught (xP, yP).Side=PlayerSide Then. Refresh;:=False;(Sender, Button, Shift, X, Y);;;;;TfmCheckers.vcbChessMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);, yP: Integer;, Strikes, Strickens:TList;. GetCellNumberByCoord (X, Y, xP, yP); IsDraughtChosen Then // Если есть выбранная шашка

Begin

// Проверим: можно ли в принципе шагнуть сюда

If vcbChess. Board. GetDraught (xP, yP)<>nil Then Exit;

// Клетка пустая

// Проверим правильность хода в эту клетку

vcbChess. Board. FindMoves (DraughtPosition.X, DraughtPosition.Y, Moves, Strikes, Strickens); Strikes. Count=0 Then // Нет рубки — пытаемся просто ходить

BeginCheckPosition (xP, yP, Moves)>=0 Then // Ход верен!. Board. MoveDraught (DraughtPosition.X, DraughtPosition.Y, xP, yP);:=False;. Refresh;(Sender, Shift, X, Y);; // Ход сделан — переключем игрока;;

End

Else Begin // Есть возможность рубки — обязательно!

TryMakeStrike (xP, yP);;(Moves);(Strikes);(Strickens);Begin // Шашка не еще выбрана;;TfmCheckers. TrySelectNewDraught (x, y: Integer);, Strikes, Strickens:TList;:TList;vcbChess. Board. GetDraught (x, y)=nil Then Exit;vcbChess. Board. GetDraught (x, y).Side<>PlayerSide Then Exit;

// Проверим обязательные рубки

StrikingDraughts:=vcbChess. Board. FindStrikingDraughts(PlayerSide);StrikingDraughts. Count>0 ThenCheckPosition (x, y, StrikingDraughts)<0 Then(StrikingDraughts);;;;(StrikingDraughts);.X:=x;.Y:=y;:=True;

— vcbChess. Board. FindMoves (x, y, Moves, Strikes, Strickens);Strikes. Count=0 Then. DrawMoves (Moves, nil).

DrawMoves (nil, Strikes);(Moves);(Strikes);(Strickens);;TfmCheckers. TryMakeStrike (x, y: Integer);, Strikes, Strickens:TList;:PCellPosition;Not(IsDraughtChosen) Then Exit;. Board. FindMoves (DraughtPosition.X, DraughtPosition.Y, Moves, Strikes, Strickens);

// Возможна ли рубка в данную клетку

If CheckPosition (x, y, Strikes)>=0 Then // Рубка верна! // рубим

67 стр., 33309 слов

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

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

// Определим срубленную шашку

CP:=Strickens. Items [CheckPosition(x, y, Strikes)];. Board. DeleteDraught (CP^.X, CP^.Y);

— // Перескакиваем. Board. MoveDraught (DraughtPosition.X, DraughtPosition.Y, x, y);.X:=x; DraughtPosition.Y:=y;(Moves);(Strikes);(Strickens);

// Определим: возможно ли продолжение рубки

vcbChess. Board. FindMoves (DraughtPosition.X, DraughtPosition.Y, Moves, Strikes, Strickens);Strikes. Count>0 Then:=True; // Установим режим рубкиBegin:=False;; // Закончена рубка — переключим игрока

End;

— ClearMoves(Moves);(Strikes);(Strickens);. Refresh;;StrikeMode Then:=False;(DraughtPosition.X, DraughtPosition.Y);;;;TfmCheckers. SwitchCurrentPlayer;CurrentPlayer=sdWhite Then CurrentPlayer:=sdBlack Else CurrentPlayer:=sdWhite;LocalGame Then PlayerSide:=CurrentPlayer;CurrentPlayer=sdWhite Then stCurrentPlayer. Caption:=’Белые’ Else stCurrentPlayer. Caption:=’Черные’;PlayerSide=CurrentPlayer Then. Enabled:=True;Begin. Enabled:=False;;;TfmCheckers. CheckForWin: Integer;:=-1;

— // Проверим победу по срубамvcbChess. Board. CountDraughts(sdWhite)=0 Then:=sdBlack;;vcbChess. Board. CountDraughts(sdBlack)=0 Then:=sdWhite;;

// Проверим победу по блокировкам

If Not (vcbChess. Board. AbleToMove(CurrentPlayer)) ThenCurrentPlayer=sdWhite Then Result:=sdBlack Else Result:=sdWhite;Result<0 Then Exit;

— //Game Over!(Self);Result Of: Application. MessageBox (‘Победила команда «Белых» ‘, ‘Победили Белые!’, MB_OK+MB_ICONINFORMATION);

— sdBlack: Application. MessageBox (‘Победила команда «Черных» ‘, ‘Победили Черные!’, MB_OK+MB_ICONINFORMATION);

— End;;TfmCheckers. Timer1Timer (Sender: TObject);

— // Inc(PlayTime);

— // stTimer. Caption:=Format (‘ % d:%.2d:%.2d’, [PlayTime div 3600, (PlayTime mod 3600) div 60, (PlayTime mod 3600) mod 60]);. Caption:=TimeToStr (Now-StartTime);;TfmCheckers.miStartLocalGameClick (Sender: TObject);:=True;. ReadOnly:=True;. ReadOnly:=True;

— // PlayTime:=0;:=Now;:=sdWhite;:=sdBlack;:=False;:=False;. Board. Respawn;. Refresh;. Enabled:=True;. Enabled:=True;;;TfmCheckers.miCancelGameClick (Sender: TObject);. Enabled:=False;. Enabled:=False;. ReadOnly:=False;. ReadOnly:=False;. MessageBox (‘Игра зкончена’, ‘Игра закончена’, MB_OK+MB_ICONINFORMATION);;TfmCheckers.miAboutClick (Sender: TObject);. ShowModal;;.

Draughts;;=Record, dY: Integer;;=0;=1;=255;=0;=1;=0;=1;=1; {}=2; {}=3; {}=4; {}: Array [1..4] Of TMove=((dX: — 1; dY:1), (dX:1; dY:1), (dX: — 1; dY: — 1), (dX:1; dY: — 1));=Set Of MoveNW..MoveSE;=^TCellPosition;=Record, Y: Integer;;=Class(TObject)

_Side: Integer; {Сторона: Белая / Черная}

_Kind: Integer; {Тип: Простая / Дамка}:TPossibleMoves; {Возможные ходы}SetSide (Value: Integer);SetKind (Value: Integer);Create (sd: Integer);Destroy; Override;Side: Integer read _Side write SetSide;Kind: Integer read _Kind write SetKind;;=Record: Integer;:TDraught;;=Class(TObject): Array [0..9, 0..9] Of TBoardCell;Create;Destroy; Override;AddDraught (x, y: Integer; Side: Integer; Kind: Integer=kdSimple):TDraught;DeleteDraught (x, y: Integer);GetDraught (x, y: Integer):TDraught;SetDraught (x, y: Integer; Const Draught:TDraught):Boolean;Clear;Respawn;MoveDraught (FromX, FromY, ToX, ToY: Integer):Boolean;FindMoves (x, y: Integer; Var Moves, Strikes, Strickens:TList);FindStrikingDraughts (Side: Integer):TList;CountDraughts (Side: Integer):Integer;AbleToMove (Side: Integer):Boolean;;ClearMoves (Var Moves:TList);CheckPosition (x, y: Integer; Const Positions:TList):Integer;ClearMoves (Var Moves:TList);: Integer;:PCellPosition;Moves=nil Then Exit;i:=0 To Moves. Count-1 Do:=Moves. Items[i];(CP);;. Free;:=nil;;CheckPosition (x, y: Integer; Const Positions:TList):Integer;: Integer;:PCellPosition;:=-1;Positions=nil Then Exit;i:=0 To Positions. Count-1 Do:=Positions. Items[i];((CP^.X=x) And (CP^.Y=y)) Then:=i;;;;;TDraught. Create (sd: Integer);Create;:=sd;:=kdSimple;;TDraught. Destroy;Destroy;;TDraught. SetSide (Value: Integer);Value=sdWhite Then

_Side:=sdWhite;:=[MoveNW, MoveNE]Begin

_Side:=sdBlack;:=[MoveSW, MoveSE];;Kind=kdKing Then PossibleMoves:=[MoveNW, MoveNE, MoveSW, MoveSE];;TDraught. SetKind (Value: Integer);Value=kdSimple Then

_Kind:=kdSimple

_Kind:=kdKing;(_Side);;TChessBoard. Create;, y: Integer;Create;y:=0 To 9 Dox:=0 To 9 Do((x=0) Or (y=0) Or (x=9) Or (y=9)) Then[y, x].CellType:=ctNone((Odd(x) And Odd(y)) Or (Not (Odd(x)) And Not (Odd(y)))) Then[y, x].CellType:=ctBlack[y, x].CellType:=ctWhite;[y, x].Draught:=nil;;;;TChessBoard. Destroy;;Destroy;;TChessBoard. AddDraught (x, y: Integer; Side: Integer; Kind: Integer=kdSimple):TDraught;:=nil;((Cells [y, x].CellType=ctNone) Or (Cells [y, x].Draught<>nil)) Then Exit;:=TDraught. Create(Side);. Kind:=Kind;[y, x].Draught:=Result;;TChessBoard. DeleteDraught (x, y: Integer);Cells [y, x].Draught<>nil Then Cells [y, x].Draught. Free;[y, x].Draught:=nil;;TChessBoard. GetDraught (x, y: Integer):TDraught;:=Cells [y, x].Draught;;TChessBoard. SetDraught (x, y: Integer; Const Draught:TDraught):Boolean;:=True;[y, x].Draught:=Draught;Draught=nil Then Exit;(((Draught. Side=sdWhite) And (y=8)) Or ((Draught. Side=sdBlack) And (y=1))) Then. Kind:=kdKing;;TChessBoard. Clear;, y: Integer;y:=0 To 9 Dox:=0 To 9 Do(x, y);;TChessBoard. Respawn;: Integer;;

— // Белыеx:=1 To 8 DoOdd(x) Then(x, 2, sdWhite)Begin(x, 1, sdWhite);(x, 3, sdWhite);;

— // Черныеx:=1 To 8 DoNot (Odd(x)) Then(x, 7, sdBlack)Begin(x, 8, sdBlack);(x, 6, sdBlack);;;TChessBoard. MoveDraught (FromX, FromY, ToX, ToY: Integer):Boolean;:=False;((Cells [FromY, FromX].CellType=ctNone) Or (Cells [ToY, ToX].CellType=ctNone)) Then Exit;((GetDraught (FromX, FromY)=nil) Or (GetDraught (ToX, ToY)<>nil)) Then Exit;(ToX, ToY, GetDraught (FromX, FromY));(FromX, FromY, nil);:=True;;TChessBoard. FindMoves (x, y: Integer; Var Moves, Strikes, Strickens:TList);: Integer;, dY, dL: Integer;:PCellPosition;: Boolean;:=nil;:=nil;:=nil;Cells [y, x].Draught=nil Then Exit;:=TList. Create;:=TList. Create;:=TList. Create;i:=1 To 4 Do:=False;:=DraughtMoves[i].dX;:=DraughtMoves[i].dY;:=0;(dL);Cells [y+dY*dL, x+dX*dL].CellType<>ctNone Then // Можно ли вставать на эту клеткуCells [y+dY*dL, x+dX*dL].Draught=nil Then // Если клетка пустая, то запишем ход…

// …запишем ход в том случае, если шашка может ходить в эту сторону

If (i In Cells [y, x].Draught. PossibleMoves) Then(P);^.X:=x+dX*dL; P^.Y:=y+dY*dL;. Add(P);Cells [y, x].Draught. Kind=kdSimple Then MoveOver:=True; // Если это простая шашка, то закончим ход

Else // Шашка не может ходить в этом направлении — закончим ход

MoveOver:=True;

End

Else Begin // Если в клетке стоит шашка, то проверим ее

If Cells [y+dY*dL, x+dX*dL].Draught. Side<>Cells [y, x].Draught. Side Then // Если это чужая шашка, то проверим на сруб

Inc(dL); // Перешагнем через шашку

If ((Cells [y+dY*dL, x+dX*dL].CellType<>ctNone) And (Cells [y+dY*dL, x+dX*dL].Draught=nil)) Then // Можно ли вставать на эту клетку

Begin // Рубка удалась

// Запомним срубленную шашку

New(P);^.X:=x+dX*(dL-1); P^.Y:=y+dY*(dL-1);. Add(P);

— // Запишем рубку(P);^.X:=x+dX*dL; P^.Y:=y+dY*dL;. Add(P);;;:=True;;// Достигнут бордюр — завершим ход:=True;MoveOver;;;TChessBoard. FindStrikingDraughts (Side: Integer):TList;, y: Integer;, Strikes, Strickens:TList;:PCellPosition;:=TList. Create;y:=1 To 8 Dox:=1 To 8 DoGetDraught (x, y)<>nil ThenGetDraught (x, y).Side=Side Then(x, y, Moves, Strikes, Strickens);Strikes. Count>0 Then(CP);^.X:=x; CP^.Y:=y;. Add(CP);;(Moves);(Strikes);(Strickens);;;TChessBoard. CountDraughts (Side: Integer):Integer;, y: Integer;:=0;y:=1 To 8 Dox:=1 To 8 DoGetDraught (x, y)<>nil ThenGetDraught (x, y).Side=Side Then Inc(Result);;TChessBoard. AbleToMove (Side: Integer):Boolean;, y: Integer;, Strikes, Strickens:TList;:=False;y:=1 To 8 Dox:=1 To 8 DoGetDraught (x, y)<>nil ThenGetDraught (x, y).Side=Side Then(x, y, Moves, Strikes, Strickens);((Moves. Count>0) Or (Strikes. Count>0)) Then Result:=True;(Moves);(Strikes);(Strickens);Result Then Exit;;;.VChessBoard;, Classes, ExtCtrls,;=Class(TImage)DrawDraught (x, y: Integer; Side: Integer; Kind: Integer);DrawMove (x, y: Integer);DrawStrike (x, y: Integer);:TChessBoard;Create (AOwner:TComponent); Override;Destroy; Override;Repaint; Override;GetCellRectByNumber (x, y: Integer):TRect;GetCellNumberByCoord (xCoord, yCoord: Integer; Var x, y: Integer);DrawMoves (Const Moves, Strikes:TList);DrawMovesByNumber (x, y: Integer);;;TVisualChessBoard. Create (AOwner:TComponent);Create(AOwner);:=TChessBoard. Create;

— // Repaint;;TVisualChessBoard. Destroy;. Free;Destroy;;TVisualChessBoard. Repaint;, y: Integer;Repaint;

— {Нарисуем клетки}. Brush. Style:=bsSolid;y:=1 To 8 Dox:=1 To 8 Do((Odd(x) And Odd(y)) Or (Not (Odd(x)) And Not (Odd(y)))) Then. Brush. Color:=clBlack. Brush. Color:=clWhite;. FillRect (GetCellRectByNumber(x, y));;;. Pen. Color:=clBlack;. Pen. Style:=psSolid;. Pen. Width:=1;. Brush. Style:=bsClear;

— // Canvas. Rectangle (0, (Height mod 8), Width — (Width mod 8), Height);. Rectangle (0, 0, Width, Height);

— {Нарисуем шашки}Board=nil Then Exit;y:=1 To 8 Dox:=1 To 8 DoBoard. GetDraught (x, y)<>nil Then(x, y, Board. GetDraught (x, y).Side, Board. GetDraught (x, y).Kind);;;;TVisualChessBoard. GetCellRectByNumber (x, y: Integer):TRect;. Left:=Trunc((x-1)*(Width/8));. Right:=Trunc (x*(Width/8));. Top:=Height-Trunc (y*(Height/8));. Bottom:=Height-Trunc((y-1)*(Height/8));;TVisualChessBoard. GetCellNumberByCoord (xCoord, yCoord: Integer; Var x, y: Integer);:=1+Trunc (xCoord/(Width/8));:=8-Trunc (yCoord/(Height/8));;TVisualChessBoard. DrawDraught (x, y: Integer; Side: Integer; Kind: Integer);=5;, tR:TRect;. Pen. Color:=clSilver;. Pen. Style:=psSolid;. Pen. Width:=3;. Brush. Style:=bsSolid;Side=sdWhite Then Canvas. Brush. Color:=clWhite Else Canvas. Brush. Color:=clBlack;:=GetCellRectByNumber (x, y);. Ellipse (R. Left+dR, R. Top+dR, R. Right-dR, R. Bottom-dR);Kind=kdKing Then Begin:=R;. Left:=tR. Left+((tR. Right-tR. Left) div 4);. Right:=tR. Right — ((tR. Right-tR. Left) div 4);. Top:=tR. Top+((tR. Bottom-tR. Top) div 4);. Bottom:=tR. Bottom — ((tR. Bottom-tR. Top) div 4);. Ellipse(R);;;TVisualChessBoard. DrawMove (x, y: Integer);=5;:TRect;. Pen. Color:=clLime;. Pen. Style:=psSolid;. Pen. Width:=1;. Brush. Color:=clLime;. Brush. Style:=bsDiagCross;:=GetCellRectByNumber (x, y);. Ellipse (R. Left+dR, R. Top+dR, R. Right-dR, R. Bottom-dR);;TVisualChessBoard. DrawStrike (x, y: Integer);=5;:TRect;. Pen. Color:=clRed;. Pen. Style:=psSolid;. Pen. Width:=1;. Brush. Color:=clRed;. Brush. Style:=bsDiagCross;:=GetCellRectByNumber (x, y);. Ellipse (R. Left+dR, R. Top+dR, R. Right-dR, R. Bottom-dR);;TVisualChessBoard. DrawMoves (Const Moves, Strikes:TList);:PCellPosition;: Integer;Moves<>nil Theni:=0 To Moves. Count-1 Do:=Moves. Items[i];(CP^.X, CP^.Y);;Strikes<>nil Theni:=0 To Strikes. Count-1 Do:=Strikes. Items[i];(CP^.X, CP^.Y);;;TVisualChessBoard. DrawMovesByNumber (x, y: Integer);, Strikes, Strickens:TList;. FindMoves (x, y, Moves, Strikes, Strickens);(Moves, Strikes);(Moves);(Strikes);(Strickens);;.About;, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,, Buttons, ExtCtrls, ShellApi;= class(TForm): TBitBtn;: TLabel;: TMemo;: TLabel;bbOkClick (Sender: TObject);FormCreate (Sender: TObject);

{Private declarations}

{Public declarations};: TfmAbout;

— {$R *.DFM}TfmAbout.bbOkClick (Sender: TObject);;;TfmAbout. FormCreate (Sender: TObject);. Text:=’ ПРАВИЛА ИГРЫ. ‘;

— MemAbout. Text:=memAbout. Text+’ ‘;. Text:=memAbout. Text+’Игра идет на поле размерами 8 X 8 клеток, шашки занимают первые три ряда с каждой стороны. ‘;

— MemAbout. Text:=memAbout. Text+’Бить можно произвольное количество шашек в любых направлениях, простая может бить назад, дамка может ходить на любое число полей, цель игры съесть или запереть все шашки противника.’;

— MemAbout. Text:=memAbout. Text+’Каждая из сторон в начале игры имеет по 12 шашек. Шашки расставляются в трех ближайших к игрокам, горизонталях. ‘;

— MemAbout. Text:=memAbout. Text+’Два центральных ряда полей остаются свободными. Здесь на этих полях, происходит сближение и первое соприкосновение противостоящих сил.;

— MemAbout. Text:=memAbout. Text+’ Противники ходят поочередно, перемещая шашки своего цвета по игровым полям. Первыми начинают белые.;

— MemAbout. Text:=memAbout. Text+’Выигрывает та сторона, которой удалось уничтожить или заблокировать движение всех шашек противника. ‘;;.