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

Самостоятельно:

  1. Очень внимательно разберитесь с каждой строчкой кода. Поймите, зачем нужно каждое действие.

  2. Постарайтесь самостоятельно еще раз написать данную игру, не подсматривая в материал урока.

  3. Усовершенствуйте программу по своему вкусу ( например, измените вид курсора мыши, измените цвета, шрифты).

  4. Поставьте на панель еще одну метку (Label2) и сделайте так, чтобы она отражала текущую информацию (комментировала игру- например, при достижении 1-ой кнопки заветной середины, выдавала бы надпись: «1-ая кнопка закончила»).

  5. Сделайте кнопки более информативными (например, чтобы свойство Caption кнопки отражало координату Left этой кнопки).

  6. Разберите внимательно код кнопки 1. Сделайте пояснения на русском языке, что делает каждая строчка в этой процедуре так, как это делал я в материалах прошлых уроков.

Вместо вопросиков Вам нужно сделать краткие пояснения

procedure TForm1.Button1Click(Sender: TObject); // ?

Begin // ?

button1.Left := random (650)+25; // ?

k:=k+1; // ?

if button1.Left > 325 then // ?

Begin // ?

button1. enabled:=false; // ?

n:=n+1; // ?

if n=5 then // ?

Begin // ?

form1.Color:=clred; // ?

ShowMessage (' Победа '); // ?

end; // ?

end; // ?

label1.Caption:= 'Вы сделали '+ IntToStr(k)+' ходов'; // ?

end; // ?

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

Ваше домашнее задание Вы сможете отправить мне по адресу: rk@rikt.ru

Самостоятельно:

  1. Доделайте программу, чтобы она при неправильном пароле выводила надпись: У вас осталась 1 попытка ( или 2 или 3).

  2. Ответьте на вопрос: «Почему нельзя задавать начальное значение счетчика в процедуре нажатия клавиши?». Если не догадались, вставьте его туда, и посмотрите, что происходит.

  3. Напишите обработчик для второй кнопки Закрыть, чтобы при нажатии на нее, форма закрывалась.

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

Параметр Sender. Совершенствуем игру.

На предыдущем шаге мы создавали свою первую игру. Сейчас нам необходимо ее усовершенствовать.

  1. Вы обратили внимание, что для всех 5-ти кнопок мы писали один и тот же код, за исключением номера кнопки, т.е. для первой – Button1, для второй- Вutton2 и т.д. Так настоящие программисты не поступают. Они пишут одну процедуру, а для всех остальных делают на нее ссылку. Помните, как в шутливой памятке: п1. Начальник всегда прав; п2. Если начальник не прав, смотри п1.

  2. На игровое поле надо нанести какую-либо разметку, например, нарисовать черту посередине поля.

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

Ход работы

  1. Открываем Delphi и загружаем туда наш проект, который мы делали на прошлом уроке, командой File/OpenProect…и выберите ваш проект.

  1. Откройте обработчик события – щелчка 1-ой кнопки, дважды щелкнув по ней. Откроется процедура, которую мы уже писали ранее. Давайте на нее посмотрим еще раз:

procedure TForm1.Button1Click(Sender: TObject);

Begin

button1.Left := random (650)+25;

k:=k+1;

if button1.Left > 325 then

Begin

button1.enabled:=false;

n:=n+1;

if n=5 then

Begin

form1.Color:=clred;

ShowMessage (' Победа ');

end;

end;

label1.Caption:= 'Вы сделали '+ IntToStr(k)+' ходов';

end;

  1. Нам необходимо, чтобы данная процедура была универсальна, т.е. использовалась всеми пятью кнопками. Но как это сделать, если везде присутствует запись Button1? В данном примере мы использовали статистическую ссылку на объект, а надо использовать динамическую- то есть узнать объект, который вызвал событие. Это записывается так: (Sender as TButton). И теперь, если мы запишем (Sender as TButton) вместо Button1, то получим код, действующий правильно для всех кнопок.

  1. Измените свою процедуру таким образом, чтобы вместо Button1 была запись: Sender as TButton):

procedure TForm1.Button1Click(Sender: TObject);

begin

(sender as Tbutton).Left := random (650);

k:=k+1;

if (sender as Tbutton).Left> 325 then

begin

(sender as Tbutton).enabled := false;

n:=n+1;

if n=5 then

Begin

form1.Color:=clred;

ShowMessage (' Победа ');

end;

end;

label1.Caption:= 'Вы сделали '+ IntToStr(k)+' ходов';

end;

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

  1. Выделите вторую кнопку.

  2. В инспекторе объектов перейдите на закладку Events.

  3. Рядом с надписью OnClick щелкните по стрелочке и из списка возможных процедур выберите Button1.

  4. Повторите п 5-7 для кнопок 3,4,5.

  5. Запустите программу, проверьте, она должна работать как надо.

Так, с первым заданием покончили. Теперь на очереди – рисование линии.

За рисование на форме отвечает свойство Canvas (Канва).

form1.Canvas.Pen.Color:=clRed;- Устанавливаем для карандаша красный цвет

form1.Canvas.MoveTo(325,0); - Помещаем карандаш в точку с координатами (325,0)

form1.Canvas.LineTo(325,form1.Height); - рисуем линию из точки (325,0) в точку с координатами (325, form1.Width). form1.Heigth – высота формы, то есть получим вертикальную линию во всю высоту формы.

  1. Поместите данные операторы в код кнопки Button1.

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

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

  1. Самостоятельно сделайте так, чтобы слева появилась еще одна черта- линия Старта (как на рис).

А как сделать игру для двоих? Это уже не трудно. Для этого нужно:

Поместить еще 5 кнопок справа у самого края формы, отключить их- свойство Enabled.

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

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

При достижении всех кнопок финиша сравниваем количество ходов 1-го и второго игрока (соответствующие переменные) и Выводим информацию о победителе.

  1. Необходимо сделать это самим. Всей информацией для этого Вы обладаете.

Самостоятельно: придумайте сами какую-либо подобную игру и воплотите ее в жизнь.

Задание 4. Создать приложение «Игровой автомат»

На нынешнем уроке мы создадим игру, имитирующую игровой автомат.

Создание игры мы опишем так, как ее создавал один из наших учеников.

Итак, для игры нам необходимо: 3 label-а (для вывода информации о том, какие фишки выпали), кнопка для начала игры, информация о выигрыше, информация о моем счете.

1. Создайте форму, как показано на рисунке:

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

Логика программы:

В начале игры пользователю выдаем сумму, равную 1000р.

При нажатии на кнопку Играем в label1, label2 в label3 заносятся разные случайные цифры. При совпадении всех трех чисел- выводим надпись о победе, а сумму ставки увеличиваем в 5 раз. В случае проигрыша сумму игрока уменьшаем на 100р- это наша ставка.

Начинаем прописывать код кнопки Играем:

  1. Сделайте двойной щелчок по кнопке Играем.

  2. В обработчике события напишем (то, что выделено цветом):

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

x:= random(3)+1; - вводим переменную, отвечающую за первое число- x. Этой переменной присваиваем любое число от 1 до 3. (Напомню, что random(3) использовать нельзя, т.к. компьютер в этом случае генерирует число в промежутке от 0 до 2, поэтому независимо от результата я прибавил число 1).

label1.Caption:=IntToStr(x);- выводим число на экран.

  1. Добавляем операторы для других чисел:

y:= random(3)+1;

label2.Caption:=IntToStr(y);

z:= random(3)+1;

label3.Caption:=IntToStr(z);

Что теперь? Сравниваем их, if ((x=y) and (x=z) and (y=z))

и если они равны, то увеличиваем сумму на 500р (за выигрыш) then sum:= sum+ 100*5;

иначе – уменьшаем сумму на 100 руб (за проигрыш) else sum:= sum-100;

  1. Продолжаем программировать кнопку:

Выводим на экран сведения о деньгах: label5.Caption:='У вас на счету: ' + IntToStr (Sum);

Вводим переменную для счета сыгранных игр, и, поскольку один раз уже сыграли , то n:=n+1;

Выводим на экран сведения о количестве сыгранных игр label6.Caption:='Количество игр: ' + IntToStr (n);

Заканчиваем игру, когда пользователь сыграет 10 раз:

if n=10 then

begin

showMessage ('Игра закончена! У вас ' + IntToStr (Sum)+' руб');

form1.Close;

end;

  1. Описываем переменные.

  2. В нашей программе участвуют 5 переменных. 3 из них внутренние- это x,y,z. Внутренние- это значит используются только внутри данной процедуры. Есть и другое название- локальные. Их описывают внутри процедуры, сразу после названия. Посмотрите, сделайте так же у себя:

procedure TForm1.Button1Click(Sender: TObject);

var x,y,z:integer;

begin

  1. Две другие будут участвовать еще и в процедуре создания формы: OnCreate. Поэтому в раздел implementations запишите их, как у меня:

implementation

var n,sum:integer;

{$R *.DFM}

  1. И последнее. Надо задать начальные значение для счетчика n= 0 и для Sum= 1000.

Это производится в процедуре создания формы OnCreate.

Если не вспомнили, посмотрите приведенный ниже код, сверьте его со своим:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

var n,sum:integer;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var x,y,z:integer;

begin

randomize;

x:= random(3)+1;

label1.Caption:=IntToStr(x);

y:= random(3)+1;

label2.Caption:=IntToStr(y);

z:= random(3)+1;

label3.Caption:=IntToStr(z);

if ((x=y) and (x=z) and (y=z))

then

sum:= sum+ 100*5;

else

sum:= sum-100;

label5.Caption:='У вас на счету: ' + IntToStr (Sum);

n:=n+1;

label6.Caption:='Количество игр: ' + IntToStr (n);

if n=10 then

begin

showMessage ('Игра закончена! У вас ' + IntToStr (Sum)+' руб');

form1.Close;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

n:=0;

sum:=1000;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

close;

end;

end.