Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PM_02_09_02_04_UP_02.---osnovy-algoritmizacii-i-programmirovanija-artyuhina-korenkova — копия.doc
Скачиваний:
45
Добавлен:
09.12.2018
Размер:
3.37 Mб
Скачать

1 Способ. Подключаем клавиатуру

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

Рассмотрим ситуацию на примере:

procedure TForm1.BitBtn1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

if key = VK_Left then BitBtn1.left:=BitBtn1.left-2 ;

// Если нажата кнопка "стрелочка влево" на клавиатуре, то переместить кнопку на 2 точки влево

if key = VK_Right then BitBtn1.left:=BitBtn1.left+2 ;

// Если нажата кнопка "стрелочка вправо" на клавиатуре, то переместить кнопку на 2 точки вправо

Но учтите, что для того, чтобы ваша лодка обрабатывала эти кнопки, элемент должен быть активен. Сделать активным вашу кнопку можно командой: BitBtn1.SetFocus.

Для нашей игры достаточно сведений.

2 Способ. Передать управление кораблю.

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

3 Способ. Сделать игру для двоих...

Рис.46. Форма игры для двоих

Суть игры:

При запуске игры на правой панели появляется меню выбора режимов игры:

Игра на двоих,

Игра подлодкой против компьютера корабля,

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

Затем выбрав режим игры нажать кнопку игра.

После этого надо потопить противника.

Количество жизней:

На верхней панели отображаются количество попаданий.

3 попадания в подлодку или 10 попаданий в корабль и кто-то тонет.

Задание 8. Создать игру «Ипподром»

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

Мы создадим компьютерный вариант скачек. Свой ипподром, но не лошадиный, а морской. И назовем соответственно: Морской ипподром.

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

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

Предварительная подготовка:

  1. Скачайте рисунки к игре

  1. Поместите рисунки в папку Hippodrome.

Расставляем компоненты.

  1. Откройте Delphi.

  2. Сохраните свой проект в папке Hippodrome- ту, где находятся картинки.

  3. На форму поместите компонент Image и, в его свойство Picture, загрузите рисунок fonippod.jpg.

  4. Свойству Stretch (растяжка) присвойте значение True (чтобы рисунок подгонялся под размеры компонента).

  5. На рисунок поместите пять кнопок BitBtn (страница Additional) - это наши лодки.

  6. В свойство Gryph каждой кнопки поместите изображение соответствующего корабля.

Рис.47. Форма игры

  1. На форму поместите компонент Panel. А на нее следующие компоненты:

    1. Элемент RadioGroup

    2. 5 элементов RadioButton

    3. Кнопка «Старт»- элемент Button

    4. Элемент GroupBox

    5. 5 элементов Label

    6. Элемент Label6

    7. Таймер

На этом оформление программы пока закончено. Приступаем к программированию.

Что будет делать программа? При нажатии на кнопку Старт, лодки начинают двигаться слева направо. Та, которая первая достигнет отметки 600 пикселов, будет победителем.

Управляет движением лодок таймер. Его и начнем программировать.

  1. Сделайте двойной щелчок по таймеру. Откроется процедура обработки события:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

end;

  1. Между begin и end пишем код:

randomize; - запускаем процедуру генераций счетчика случайных чисел;

bitbtn1.Left:= bitbtn1.Left+random(10); - перемещаем кнопку на случайное количество точек вправо в диапазоне от 0 до 10.

bitbtn2.Left:= bitbtn2.Left+random(10);- аналогично и со всеми кнопками.

bitbtn3.Left:= bitbtn3.Left+random(10);

bitbtn4.Left:= bitbtn4.Left+random(10);

bitbtn5.Left:= bitbtn5.Left+random(10);

Эти операторы дадут нам видимость движения, а случайный выбор- видимость соревнования.

  1. Интервал срабатывания таймера поставьте равный 50.

  2. Запустите программу, посмотрите, что получилось. Кнопки скачут не останавливаясь? Правильно. Нужно придумать, как их остановить.

  3. Вернитесь в режим проектирования.

Было бы очень просто написать: if bitbtn1.Left> 600 then Timer1.Tnabled:=false.

И все. Но! Как узнать, какая лодка пришла к финишу первой, а какая последней?

Воспользуемся свойством Tag, который есть у всех компонентов, следовательно, у BitBtn тоже. Это свойство Delphi не нужно, сделано оно специально для программистов. Хранить в нем можно любое целое число.

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

  1. Еще раз двойной щелчок по таймеру. Добавьте следующие строки:

if bitbtn1.Left> 600 then

if bitbtn1.Tag=0 then

begin

n:=n+1;

bitbtn1.Tag:=n;

label1.Caption:='Желтая - '+IntToStr (bitbtn1.Tag)+' место';

end;

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

if bitbtn2.Left> 600 then

if bitbtn2.Tag=0 then

begin

n:=n+1;

bitbtn2.Tag:=n;

label2.Caption:='Розовая - '+IntToStr (bitbtn2.Tag)+' место';

end;

if bitbtn3.Left> 600 then

if bitbtn3.Tag=0 then

begin

n:=n+1;

bitbtn3.Tag:=n;

label3.Caption:='Фиолетовая - '+IntToStr (bitbtn3.Tag)+' место';

end;

if bitbtn4.Left> 600 then

if bitbtn4.Tag=0 then

begin

n:=n+1;

bitbtn4.Tag:=n;

label4.Caption:='Красная - '+IntToStr (bitbtn4.Tag)+' место';

end;

if bitbtn5.Left> 600 then

if bitbtn5.Tag=0 then

begin

n:=n+1;

bitbtn5.Tag:=n;

label5.Caption:='Голубая - '+IntToStr (bitbtn5.Tag)+' место';

end;

  1. Определяем победителя по формуле:

if n>4 then

begin

timer1.Enabled:=false;

groupBox1.visible:=true;

if (radioButton1.Checked) and (bitbtn1.Tag=1) then label6.Caption:='Вы победили!';

if (radioButton2.Checked) and (bitbtn2.Tag=1) then label6.Caption:='Вы победили!';

if (radioButton3.Checked) and (bitbtn3.Tag=1) then label6.Caption:='Вы победили!';

if (radioButton4.Checked) and (bitbtn4.Tag=1) then label6.Caption:='Вы победили!';

if (radioButton5.Checked) and (bitbtn5.Tag=1) then label6.Caption:='Вы победили!';

end

else label6.Caption:='Вы проиграли...';

  1. Не забудьте зарегистрировать переменную n, как тип Integer.

implementation

var n:integer;

{$R *.DFM}

  1. Проверьте, работают ли кнопки так, как надо. Выскакивает ли надпись 'Вы победили!', если угадан победитель. Появляются ли места, занятые участниками гонки?

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

  1. В инспекторе объектов Таймера выберите свойство Enabled:= False.

  2. А в обработчик события кнопки Старт прописываем:

procedure TForm1.Button1Click(Sender: TObject);

begin

timer1.Enabled:=true;

end;

  1. Далее все просто. Или, как говорят математики, тривиально. Наводим красоту, кое-что до поры до времени прячем, кое-что отключаем. И игра готова.

Самостоятельно: Добейтесь того, чтобы игра выглядела как на рисунке

Рис.48. Форма игры

Тотализатор.

Цель: переоборудовать игру для игры на деньги.

Идея: Дать возможность делать ставки. Тотализатор будет работать следующим образом:

В начале игры у Вас есть 1000 долларов. ВЫ можете ставить любую сумму, не бо`льшую, той, что у Вас есть, на любую лошадь (то есть лодку). Если Ваша лодка приходит первой, то сумма, поставленная на лодку, увеличивается в два раза. Если ваша лодка приходит второй, то Вам возвращаются деньги, если же лодка приходит 3, 4 или 5-ой, то Ваши деньги пропадают.

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

  1. Откройте Delphi и загрузите проект игры

В любом тотализаторе есть возможность поставить не на одну, а на несколько лошадей. У нас эта возможность тоже должна быть. Однако кнопки RadioButton позволяют ставить только на одну лошадь (то есть лодку). Значит, долой их.

  1. Удалите все пять радиокнопок.

  1. Вместо них поставьте 5 CheckBox-ов. Они находятся на панели Standart.

  2. Поставьте на форму компонент GroupBox2. А в него поместите 5 компонентов Edit.

После данных манипуляций фрагмент данной формы должен быть похожий на следующий:

Рис.49. Фрагмент формы приложения

  1. Свойства Text всех компонентов Edit я изменил на ----------, а сами свойство Enabled:= False, чтобы отключить их, при начале игры.

  1. Программируем работу флажка (CheckBox1):

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

If (sender as TCheckBox=CheckBox1) then

begin

If checkbox1.checked=false then //если флажок отключен, то

begin

Edit1.enabled:=false; // отключаем edit1

Edit1.Color:=clBtnFace;

Edit1.Text:='----------------';

end;

If checkbox1.checked=true then //если флажок включен, то

begin

Edit1.enabled:=true; // включаем Edit1.

Edit1.Color:=clWhite;

Edit1.Text:='';

end;

end;

  1. Аналогично создайте обработчики событий для всех остальных флажков.

Так как в Edit мы будем вводить только цифры, то пишем обработчик события, чтобы это устранить.

  1. Выберите элемент Edit1 и щелкните в Инспекторе объектов по закладке Events.

  2. В событии OnKeyPress (при нажатии) введите:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if not ((key>='0') and (key<='9') or (key=#8)) - все кнопки, кроме цифр и Backspase

игнорируются.

then key:=chr(0);

end;

Далее, всё остальное Вам известно. Проявляйте творчество. Посмотрите, как сделана моя программа.

Рис.50. Форма приложения

Задание 9. Создать игру «21»

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

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

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

Правила игры:

  1. В 21 играют колодой, состоящей из 52 карт.

  1. Играют последовательно, сначала нужное количество карт набирает игрок, затем компьютер.

  1. По требованию игрока, компьютер сдает сколько карт, сколько необходимо игроку. Задача игрока набрать максимальное количество очков, близкое к 21, но не более. Идеально, если игрок набирает 21 очко- тогда игра прекращается, присуждая победу игроку.

  2. Игра прекращается и в том случае, если игрок наберет более 21 очка. Тогда возникает ситуация перебора, и победу присуждают компьютеру.

  3. При достижении нужного количества очков, например 19, когда следующий шаг слишком рисковый, игрок говорит достаточно. Тогда компьютер сдает карты себе.

  4. Если у компьютера перебор- выигрывает человек, если 21 очко или равное количество очков с игроком- выигрывает компьютер.

  5. Очки начисляются следующим образом: туз-11 очков, король-4, дама-3, валет-2, все числовые карты имеют тот же номинал. Масть значения не имеет.

Предварительная подготовка.

Для игры необходимы рисунки с изображениями карт.

Все рисунки названы в соответствии с мастью и номиналом двумя буквами. Первая буква отвечает за масть карты, вторая за номинал. Например, p8.jpg- означает пиковую восьмерку, а bv.jpg- бубнового вальта.

Начинаем творить:

  1. Откройте Delphi или создайте новый проект.

  1. Форму я закрасил зеленым цветом- под вид сукна игрового стола.

  1. На форме расположите 14 компонентов Image – так как на рисунке 51

Рис.51. Форма игры

Конечно, программисты-профессионалы скажут, что мы делаем все нерационально: данные необходимо сохранять в массиве, а все компоненты создавать в процессе выполнения. Да, все верно! Однако, мы условились обходиться пока без массивов и без создания компонентов в run-time.

  1. Размеры Image-й задайте 73*97.

  2. На форму поместите 2 кнопки: Дать Карту и Себе.

Начинаем программирование:

В компонент Image8 (на рисунке он у меня выделен ) при нажатии на кнопку Дать карту должна появиться случайная карта. Для этого:

  1. Сделайте двойной щелчок по кнопке Дать карту и измените код кнопки на мой:

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

Сначала командой randomize; - перемешиваем карты

randomize;

Достаем случайную карту из колоды:

x:=random(52)+1;

И, в зависимости от выбранной карты, если выпала цифра 1, то

а) увеличиваем сумму игрока на 2; б) в Image8 помещаем карту 2 пики.

case x of

1: begin s:=s+2; image8.Picture.LoadFromFile ('p2.jpg'); end;

Аналогично и с другими картами:

2: begin s:=s+3; image8.Picture.LoadFromFile ('p3.jpg'); end;

3: begin s:=s+4; image8.Picture.LoadFromFile ('p4.jpg'); end;

4: begin s:=s+5; image8.Picture.LoadFromFile ('p5.jpg'); end;

5: begin s:=s+6; image8.Picture.LoadFromFile ('p6.jpg'); end;

6: begin s:=s+7; image8.Picture.LoadFromFile ('p7.jpg'); end;

7: begin s:=s+8; image8.Picture.LoadFromFile ('p8.jpg'); end;

8: begin s:=s+9; image8.Picture.LoadFromFile ('p9.jpg'); end;

9: begin s:=s+10; image8.Picture.LoadFromFile ('p10.jpg'); end;

10: begin s:=s+2; image8.Picture.LoadFromFile ('pv.jpg'); end;

11: begin s:=s+3; image8.Picture.LoadFromFile ('pd.jpg'); end;

12: begin s:=s+4; image8.Picture.LoadFromFile ('pk.jpg'); end;

13: begin s:=s+11;image8.Picture.LoadFromFile ('pt.jpg'); end;

14: begin s:=s+2; image8.Picture.LoadFromFile ('k2.jpg'); end;

15: begin s:=s+3; image8.Picture.LoadFromFile ('k3.jpg'); end;

16: begin s:=s+4; image8.Picture.LoadFromFile ('k4.jpg'); end;

17: begin s:=s+5; image8.Picture.LoadFromFile ('k5.jpg'); end;

18: begin s:=s+6; image8.Picture.LoadFromFile ('k6.jpg'); end;

19: begin s:=s+7; image8.Picture.LoadFromFile ('k7.jpg'); end;

20: begin s:=s+8; image8.Picture.LoadFromFile ('k8.jpg'); end;

21: begin s:=s+9; image8.Picture.LoadFromFile ('k9.jpg'); end;

22: begin s:=s+10;image8.Picture.LoadFromFile ('k10.jpg'); end;

23: begin s:=s+2; image8.Picture.LoadFromFile ('kv.jpg'); end;

24: begin s:=s+3; image8.Picture.LoadFromFile ('kd.jpg'); end;

25: begin s:=s+4; image8.Picture.LoadFromFile ('kk.jpg'); end;

26: begin s:=s+11; image8.Picture.LoadFromFile ('kt.jpg'); end;

27: begin s:=s+2; image8.Picture.LoadFromFile ('b2.jpg'); end;

28: begin s:=s+3; image8.Picture.LoadFromFile ('b3.jpg'); end;

29: begin s:=s+4; image8.Picture.LoadFromFile ('b4.jpg'); end;

30: begin s:=s+5; image8.Picture.LoadFromFile ('b5.jpg'); end;

31: begin s:=s+6; image8.Picture.LoadFromFile ('b6.jpg'); end;

32: begin s:=s+7; image8.Picture.LoadFromFile ('b7.jpg'); end;

33: begin s:=s+8; image8.Picture.LoadFromFile ('b8.jpg'); end;

34: begin s:=s+9; image8.Picture.LoadFromFile ('b9.jpg'); end;

35: begin s:=s+10; image8.Picture.LoadFromFile ('b10.jpg'); end;

36: begin s:=s+2; image8.Picture.LoadFromFile ('bv.jpg'); end;

37: begin s:=s+3; image8.Picture.LoadFromFile ('bd.jpg'); end;

38: begin s:=s+4; image8.Picture.LoadFromFile ('bk.jpg'); end;

39: begin s:=s+11; image8.Picture.LoadFromFile ('bt.jpg'); end;

40: begin s:=s+2; image8.Picture.LoadFromFile ('c2.jpg'); end;

41: begin s:=s+3; image8.Picture.LoadFromFile ('c3.jpg'); end;

42: begin s:=s+4; image8.Picture.LoadFromFile ('c4.jpg'); end;

43: begin s:=s+5; image8.Picture.LoadFromFile ('c5.jpg'); end;

44: begin s:=s+6; image8.Picture.LoadFromFile ('c6.jpg'); end;

45: begin s:=s+7; image8.Picture.LoadFromFile ('c7.jpg'); end;

46: begin s:=s+8; image8.Picture.LoadFromFile ('c8.jpg'); end;

47: begin s:=s+9; image8.Picture.LoadFromFile ('c9.jpg'); end;

48: begin s:=s+10; image8.Picture.LoadFromFile ('c10.jpg'); end;

49: begin s:=s+2; image8.Picture.LoadFromFile ('cv.jpg'); end;

50: begin s:=s+3; image8.Picture.LoadFromFile ('cd.jpg'); end;

51: begin s:=s+4; image8.Picture.LoadFromFile ('ck.jpg'); end;

52: begin s:=s+11; image8.Picture.LoadFromFile ('ct.jpg'); end;

end;

  1. На форму поместите компонент Label2. В нем мы будем отражать количество очков игрока.

  2. В обработчике кнопки допишите: label2.caption:= inttostr(s1);

Теперь необходимо зарегистрировать переменные, которые участвуют в обработке кнопки:

  1. В разделе implementation запишите:

implementation

var s1,x:integer;

{$R *.DFM}

  1. Запустите программу. Вы должны увидеть при нажатии на кнопку выбранную карту и сумму игрока на этот момент.

Самостоятельно: придумайте, как далее расположить карты, механизм раздачи следующих карт.

Располагаем карты.

Как расположить карты в процессе игры? В Image 1 понятно. Туда пойдет первая карта. Во второй Image- 2-ая. Но как это сделать? Можно поступить следующим образом: ввести дополнительную переменную и сопоставлять ей значение Image. А можно поступить следующим образом: у каждого элемента в Delphi есть свойство Tag. Это свойство в процессе работы не используется, его разработчики ввели специально для программиста. В этом свойстве можно хранить целое число. Что мы и сделаем:

Если карта уже находится в Image, то его свойство Tag присвоим равным 1.

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

  1. Допишите следующие строки:

if image1.Tag=0 then

begin

image1.Picture:=image8.Picture;

image1.Tag:=1;

end

  1. Аналогично и для других рисунков:

else if image2.Tag=0 then

begin

image2.Picture:=image8.Picture;

image2.Tag:=1;

end

else if image3.Tag=0 then

begin

image3.Picture:=image8.Picture;

image3.Tag:=1;

end

else if image4.Tag=0 then

begin

image4.Picture:=image8.Picture;

image4.Tag:=1;

end

else if image5.Tag=0 then

begin

image5.Picture:=image8.Picture;

image5.Tag:=1;

end

else if image6.Tag=0 then

begin

image6.Picture:=image8.Picture;

image6.Tag:=1;

end

else if image7.Tag=0 then

begin

image7.Picture:=image8.Picture;

image7.Tag:=1;

end;

4. Теперь необходимо прописать условия окончания игры:

bitbtn1.Caption:='Дать еще карту';

if s=21 then

begin

label2.Caption:='Ты победил';

button3.Enabled:=false;

bitbtn1.Enabled:=false;

end;

if s>21 then

begin

label2.Caption:= 'Извини, Ты проиграл';

button3.Enabled:=false;

bitbtn1.Enabled:=false;

end;

Самостоятельно: пропишите подобные механизмы и для компьютера (щелчок по кнопке Себе)

Логика:

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

Вот как это сделал я, по-моему, тут все ясно:

while s1<s do

begin

bitbtn2.Click;

sleep(500);

application.ProcessMessages();

end;

if s1=s then label3.Caption:= 'Я выиграл!';

if (s1>s) and (s1<22) then label3.Caption:= 'Я выиграл!';

if s1>21 then label3.Caption:= 'Ты выиграл!'