Как сделать сапера в delphi
Игрок управляет длинным, тонким существом, напоминающим змею, которое ползает по плоскости (как правило, ограниченной стенками), собирая еду (или другие предметы), избегая столкновения с собственным хвостом и краями игрового поля.
Используемые библиотеки: Не требуются
Всем знакомая игра "Змейка"
Подобие игры на дэнди Battle Tank (конечно же глючная и тормознутая)
Игра программ. Вирусы.
На поле(квадратное, размер от 20х20)
случайно кидается от 2х до 10 экземпляров вирусов каждого класса(от 2х до 6 классов).
Каждый экземпляр вируса случайно получает управление.
Поучив управление, вирус может
либо ПОЙТИ* в любом из 8 направлений,
либо ПОМОЧЬ* в любом из 8 направлений.
.
От переводчика: этот пост — перевод оригинальной статьи Маки Чиза, опытного кодера, который не только пишет классные программы, но и демонстрирует возможности различных языков своим коллегам, как новичкам, так и профессионалам.
Прежде чем начать, скажу, что этот туториал рассчитан на тех, кто уже знает Java. Опыт работы с Processing необязателен.
Итак, начинаем. Первый шаг — определение состояния игры. Я решил реализовать это вот так.
Здесь, кажется, имеет смысл все, кроме вот этого участка: int[][] mines. Почему сетка мин является целым числом, а не булевым? Дело в том, что это позволяет легко подсчитать, сколько мин находится рядом с определенной позицией.
Этот код определяет, сколько мин находится рядом с определенным участком. После того, как мы уберем исключения, мы получим что-то похожее на это:
Главная задача самой игры — раскрывать квадраты, начиная с точки х, у.
В итоге мы имеем следующий алгоритм:
- Если позиция за пределами поля, end;
- Если позиция раскрыта, end;
- Раскрываем текущую позицию;
- Если у нас бомба рядом с текущей позицией, end;
- Если мы дошли до этого пункта во время выполнения функции, текущая позиция в пределах игрового поля была обнаружена и рядом с ней нет бомб, открываем смежные квадраты.
Если вы хотите узнать о визуализации, читайте дальше.
Визуализация
Здесь все должно быть понятно, но я объясню сложные части.
Итак, у нас есть переменная cellSize, определяющая количество пикселей в каждом квадрате.
Таким образом мы создаем поле со сторонами gridW x gridH, где размеры каждого квадрата будут равняться значению cellSize.
Затем мы возвращаем переменные в изначальное состояние.
Для инициализации поля:
И далее включаем реакцию на клики мышью.
И функция отображения, вызываем ее один раз для каждого кадра.
Сапер представляет собой логическую игру, основной целью которой является нахождения всех спрятанных бомб на минном поле. Ваша задача открыть все ячейки поля, не содержащие бомб, заблокировав(пометив) при этом ячейки, в которых расположены бомбы. Поле игры задано в виде двухмерного массива. В этом массиве расположены ячейки. Изначально они все закрыты. Ячейки могут быть пустые, с цифрами и с бомбами. Для каждой такой ячейки мы задаем класс. При нажатии левой клавиши мыши открывается ячейка, при нажатии правой кнопки, выставляется флажок, при этом левой кнопкой мыши вы уже не можете нажать на заблокированную ячейку, но правой кнопкой можно снять пометку флажка. Ячейка с цифрой обозначает то, сколько мин находится в округе этой ячейки. При первом нажатии кнопки мыши на ячейку не может открыться ячейка с бомбой.
Игра считается проигранной, если вы открыли ячейку с бомбой. Игра считается выигранной, если на игровом поле все ячейки с бомбами отмечены и все остальные ячейки - открыты.
Интерфейс программы был создан с помощью стандартной библиотеки SDL.
Для реализации интерфейса игры в данном пункте используются следующие компоненты:
TLabel служит для отображения текста на экране. Можно изменить шрифт и цвет метки, если дважды щелкнуть на свойство Font в Инспекторе Объектов. Видно, что это легко сделать и во время выполнения программы, написав всего одну строчку кода.
Этот компонент доступен из модуля STDCTRLS, и находится на странице Палитры компонентов Standard.
Компонент представляет собой статический текст. С помощью этого компонента на рабочей поверхности формы можно отобразить информацию, сделать пояснения и показать названия других компонентов. Но он имеет и другую важную функцию -- если в составе текста TLabel есть символы-акселераторы, информация об их нажатии может передаваться от TLabel другому элементу управления.
Свойства компонента приведены в табл.2.1:
Таблица 2.1 Свойства компонента TLabel
(Pb) property Caption: TCaption; TCaption = string[255];
Содержит строку с выводимым текстом.
(Pb) property Alignment: TAlignment;
Устанавливает правило выравнивания текста -- по правому, левому краю или по центру клиентской области.
(Pb) property AutoSize: Boolean;
В случае True происходит автоматическое приведение размеров компонента к размерам текста и высоте шрифта.
(Pb) property FocusControl: TWinControl;
(Pb) property Transparent: Boolean;
Прозрачность фона компонента. Если свойство установлено в True, то при перерисовке элемента управления не происходит закрашивание клиентской области. В противном случае -- происходит закрашивание кистью bsSolid и цветом Color.
(Pb) property WordWrap: Boolean;
Определяет возможность разрыва слов в случае, если длина выводимого текста превышает ширину компонента.
TImage - отображает графическое изображение на форме. Воспринимает форматы BMP, ICO, WMF. Если картинку подключить во время дизайна программы, то она прикомпилируется к EXE файлу.
Этот компонент доступен из модуля EXTCTRLS, и находится на странице Палитры компонентов Additional.
Этот компонент служит надстройкой над классом TPicture и замыкает всю иерархию графических объектов VCL. Он предназначен для показа на форме изображения: битовой карты (TBitmap), метафайла (TMetafile), значка (TIcon).
В качестве канвы используется канва объекта Picture. Graphic -- только если поле Graphic ссылается на объект класса TBitmap:
(Pb) property Canvas: TCanvas;
Если это не так, то попытка обращения к свойству вызовет исключительную ситуацию EInvalidOperation, так как рисовать на метафайле или значке нельзя.
Следующие три свойства определяют, как именно Tpicture располагается в рабочей области компонента:
- (Pb) property AutoSize: Boolean;
- -- означает, что размеры компонента настраиваются по размерам содержащегося в нем графического объекта. Устанавливать его в True нужно перед загрузкой изображения из файла или буфера обмена;
- (Pb) property Stretch: Boolean;
- -- если это свойство установлено в True, то изображение "натягивается" на рабочую область, при необходимости уменьшая или увеличивая свои размеры. Если оно установлено в False, то играет роль следующее свойство;
- (Pb) property Center: Boolean;
- -- если это свойство установлено в True, изображение центрируется в пределах рабочей области. В противном случае -- располагается в ее верхнем левом углу.
TEdit - стандартный управляющий элемент Windows для ввода. Он может быть использован для отображения короткого фрагмента текста и позволяет пользователю вводить текст во время выполнения программы.
Этот компонент доступен из модуля STDCTRL, и находится на странице Палитры компонентов Standard.
Этот компонент не содержит собственного кода, в нем только опубликованы свойства его предка TCustomEdit. Он представляет собой редактируемую строку (далее -- просто редактор).
Стиль обрамления этого компонента
(Pb) property BorderStyle: TBorderStyle;
по умолчанию равен bsSingle.
(Pb) property AutoSize: Boolean;
равно True, компонент изменяет свою высоту в зависимости от размера шрифта (свойство Font). Для того чтобы изменения имели место, должен еще быть установлен стиль обрамления bsSingle.
Вводимый в редактор текст может автоматически подвергаться некоторым преобразованиям.
Преобразование, задаваемое свойством CharCase, позволяет автоматически преобразовывать все символы только в верхний или только в нижний регистр:
(Pb) property CharCase: TEditCharCase;
TEditCharCase = (ecNormal, ecUpperCase, ecLowerCase) ;
По умолчанию установлен стиль ecNormal и преобразования не происходит.
(Pb) property OEMConvert: Boolean;
определяет необходимость автоматического преобразования вводимых символов из кодировки OEM в ANSI и обратно. Такое свойство часто бывает нужно при обработке текста в кодировке MS-DOS.
Два следующих свойства описывают поведение выделенного текста при переходе фокуса. Первое из них
(Pb) property AutoSelect: Boolean;
описывает реакцию редактирующего элемента при получении фокуса. Если оно установлено в True (по умолчанию это так), то при получении фокуса ввода весь текст в нем выделяется независимо от состояния свойства SelText. Если AutoSelect установлено в False, то при получении фокуса выделяется лишь то, что было выделено до его утери.
После утери фокуса редактором выделенный в нем текст обычно теряет цветовое выделение. Чтобы оно оставалось, установите в False второе свойство:
(Pb) property HideSelection: Boolean;
На длину текста может быть наложено ограничение. Свойство
(Pb) property MaxLength: Integer;
определяет максимальную длину текста редактора в символах. Если значение этого свойства равно 0, то ограничений на длину текста нет.
Свойство PasswordChar предназначено для ввода пароля с использованием редактора:
(Pb) property PasswordChar: Char;
Его значение -- это символ, используемый для отображения вместо любых вводимых символов.
Можно запретить возможность редактирования текста. Если значение
свойства: (Pb) property ReadOnly: Boolean;
равно True, текст изменить нельзя.
Можно отследить изменения текста в редакторе, обрабатывая поступающие события:
(Pb) property OnChange: TNotifyEvent ;
TButton позволяет выполнить какие-либо действия при нажатии кнопки во время выполнения программы. В Delphi все делается очень просто. Поместив TButton на форму, по двойному щелчку можно создать заготовку обработчика события нажатия кнопки. Далее нужно заполнить заготовку кодом:
procedure TForm1.Button1Click(Sender: TObject);
MessageDlg('Are you there?',mtConfirmation,mbYesNoCancel,0);
Этот компонент доступен из модуля STDCTRL, и находится на странице Палитры компонентов Standard.
Двойной щелчок на кнопке не предусмотрен.
Основным событием, связанным с нажатием кнопки (любым способом) является:
(Pb) property OnClick: TNotifyEvent;
Под "любым способом" здесь подразумевается щелчок мышью, нажатие комбинации клавиши -- акселератора, нажатие или (только для
некоторых кнопок) или вызов метода Click из программы.
Текст кнопки, появляющийся на ее поверхности, определен в свойстве:
(Pb) property Caption: string;
Если в составе текста есть амперсанд ('&'), то следующий за ним символ
используется в акселераторе, и нажатие комбинации клавиш +
вызывает нажатие кнопки.
Водораздел среди кнопок проходит по тому, что именно означает нажатие. Ряд кнопок -- TRadioButton, TCheckBox и группа TRadioGroup -- предназначен для ввода или переключения фиксированных параметров, и программиста более интересует их состояние в некоторый момент времени, чем сам факт нажатия. Кнопки TButton, TSpinButton и TBitBtn напротив, как правило, своим нажатием инициируют немедленные действия. Кнопка TSpeedButton может успешно служить для решения обеих задач.
Как уже было сказано, нажатие влечет за собой OnClick. Но это не означает, что всегда нужно писать код для обработки всех нажатий. Например, исключением из этого правила является использование кнопок в модальных формах.
Модальная форма, или модальный диалог -- специальная разновидность окон Windows (и форм Delphi), предназначенная для ввода пользователем необходимых программе данных или выбора одного ответа из нескольких вариантов. Обычно при этом ему редоставляется несколько кнопок, соответствующих вариантам. Вплоть до получения ответа в модальном диалоге пользователь не может переключиться на другие окна той же задачи, а в системном модальном диалоге -- и на другие задачи. Для использования в таких случаях предназначены стандартная кнопка Windows TButton и ее младшая сестра TBitBtn, отличающаяся только наличием картинки на ее поверхности.
При их нажатии значение свойства ModalResult кнопки передается одноименному свойству формы, где такое изменение означает вывод формы из модального состояния и ее закрытие:
(Pb) property ModalResult: TModalResult;
TModalResult = Low(Integer) ..High(Integer);
В модальной форме могут быть предусмотрены две специальные кнопки, соответствующие положительному и отрицательному решениям. Одна из них срабатывает при нажатии на клавиатуре , другая -- . Любая кнопка может получить такой статус, установив в True соответственно одно из свойств:
(Pb) property Default: Boolean;
(Pb) property Cancel: Boolean;
У двух рассмотренных кнопок результат, который при нажатии кнопки
передается модальной форме, будет соответственно равен mrOk и mrCancel.
Bevel (фаска) располагается на вкладке "Additional" Палитры Инструментов. Его назначение в приложении чисто декоративное.
Внешний вид полученной фигуры будет зависеть от свойства
- · bsBox -прямоугольник,
- · bsFrame - рамка,
- · bsBottomLine - линия снизу,
- · bsLeftLine - линия слева,
- · bsRightLine - линия справа,
- · bsSpacer - область для разметки, во время работы программы не видна,
- · bsTopLine - линия сверху.
Свойство Style задает внешний вид оформления фаски:
- · bsLowerd (фаска вогнутая по отношению к поверхности размещения),
- · bsRaised (фаска выпуклая по отношению к поверхности размещения).
Реализация игры посредством использования языка Delphi
сапер игра компьютерный интерфейс
Если открыта ячейка с миной, игра проиграна. Если открыта пустая ячейка, игра продолжается. Если в ячейке указано число, оно показывает, сколько мин скрыто в восьми ячейках вокруг данной. Это число помогает понять, где находятся безопасные ячейки.
При запуске программы, вы можете выбрать уровень сложности “Новичок”, “Любитель”, “Профи” или же можете установить количество бомб, количество строк и столбцов.
Далее вы щелкаете на ячейку, чтобы открыть ее, где предположительно нет бомбы.
Путем дальнейших размышлений, вы щелкаете правой кнопкой мышки на ячейках, где должны располагаться бомбы. Количество бомб вокруг ячейки написано в нижнем левом углу игрового поля.
Проигрыш или выигрыш определяются в зависимости от того, все ли бомбы отмечены и все ли поля без бомб раскрыты, если вы попадаете на ячейку с бомбой, вы проиграли.
Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля. Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
. (продолжение следует) .
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца.
Спасибо большое.
2 из них запускаются а другие нет.
Что значит - написана с использованием DelphiX
При нажатии на файл с расширение DPR у двух прог:
в одной пишет - что Class TDX. не найден
в другой что не найден Class TWinMine
Как их нужно установить.
ее я и наверное возьму за каркас.
А где можно скачать DelphiX для Delphi 7
Нет, это старая версия, качать нужно UnDelphiX
Читайте также:
- Как сделать кантриболз будущее европы
- Как сделать прицел арбалета
- Как сделать страшный квест
- Как сделать паэлью с курицей
- Как сделать попкорн крючком