| | | | |
Радик Ишмуратов дата публикации 30-01-2004 14:00 урок из цикла:
Урок 12. Параметр Sender. Совершенствуем игру.На прошлом уроке мы создавали свою первую игру. Я говорил о том, что сегодня нам предстоит изменить ее, усовершенствовать. Что же в ней плохо?
- Вы обратили внимание, что для всех 5-ти кнопок мы писали один и тот же код, за исключением номера кнопки, т.е. для первой - Button1, для второй- Вutton2 и т.д. Так настоящие программисты не поступают. Они пишут одну процедуру, а для всех остальных делают на нее ссылку. Помните, как в шутливой памятке: п1. Начальник всегда прав; п2. Если начальник не прав, смотри п1.
- На игровое поле надо нанести какую-либо разметку, например, нарисовать черту посередине поля.
- Глупо играть одному в такую игру. Значит нужно предусмотреть вариант игры для двоих.
Цель ясна? Начинаем творить.
- Открываем Delphi и загружаем туда наш проект, который мы делали на прошлом уроке, командой File/Open Project…и выберите ваш проект.
- Откройте обработчик события - щелчка 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;
| |
- Нам необходимо, чтобы данная процедура была универсальна, т.е. использовалась всеми пятью кнопками. Но как это сделать, если везде присутствует запись Button1? В данном примере мы использовали статическую ссылку на объект, а надо использовать динамическую- то есть узнать объект, который вызвал событие. Это записывается так: (Sender as TButton). И теперь, если мы запишем (Sender as TButton) вместо Button1, то получим код, действующий правильно для всех кнопок:
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;
| |
Теперь необходимо данную процедуру назначить всем остальным кнопкам. Для этого:
- Выделите вторую кнопку.
- В инспекторе объектов перейдите на закладку Events.
- Рядом с надписью OnClick щелкните по стрелочке и из списка возможных процедур выберите Button1.
- Повторите п 5-7 для кнопок 3,4,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 - высота формы, то есть получим вертикальную линию во всю высоту формы.
Поместите данные операторы в код кнопки Button1.
Запустите программу, проверьте. После щелчка по любой из кнопок, должна появиться вертикальная черта (рис)
Самостоятельно сделайте так, чтобы слева появилась еще одна черта — линия Старта (как на рис).
А как сделать игру для двоих? Это уже не трудно. Для этого нужно:
- Поместить еще 5 кнопок справа у самого края формы, отключить их- свойство Enabled.
- Изменить обработчик события 1-ой кнопки, чтобы при достижении всех пяти кнопок финиша, включались другие пять кнопок.
- Написать для них соответствующих обработчик события, чтобы при помещении их в левую половину формы кнопки отключались, а новые переменные фиксировали количество ходов второго игрока и количество кнопок, достигших финиша.
- При достижении всех кнопок финиша сравнивить количество ходов 1-го и второго игрока (соответствующие переменные) и Вывести информацию о победителе.
Рекомендую сделать это самим. Всей информацией для этого Вы обладаете.
Посмотреть, как эта игрушка выглядит у меня, Вы сможете здесь: http://umnik.rikt.ru/everest/distant/delphi.htm
Если у Вас что-либо не получается — скачайте исходники данной игры с нашего сайта
придумайте сами какую-либо подобную игру и воплотите ее в жизнь.
Обсуждение материала [ 25-07-2010 11:20 ] 6 сообщений |
|