Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

События от мыши

Введение | Глава 1 | Рисование узоров | Рисование поля для различных игр | Для построения графиков | Построение графиков элементарных функций | В случайных местах | Движение двоичного образа по фоновой картинке | В динамических приложениях | Код клавиши |


Читайте также:
  1. XX. События 38-летнего странствования по пустыне. Завоевание восточно-иорданской страны. Последние распоряжения и увещания Моисея; его пророческое благословление народа и кончина.
  2. Акции и специальные события
  3. Богов активизируют люди и события
  4. Более яркие события и более глубокие кризисы
  5. Вероятность события равна отношению числа благоприятных исходов к общему числу исходов.
  6. Возникает вопрос – что проявляет те или иные данные в человеке? – данные которые человек накопил за свою жизнь проявляются в человеке через события которые с ним происходят.
  7. Глава 11. Случаи и события как сигналы

3.1.1. Проект «Попади в мишень»

Постановка задачи. В случайном месте формы рисуется небольшой кружок заданного радиуса и произвольного цвета. Одновременно запускается таймер, и играющий должен успеть щелкнуть по кружку. Число попаданий и число щелчков подсчитываются. Игра продолжается до 10 щелчков.

Реализация. Положите на форму таймер, установите подходящий интервал. Положите одну кнопку «Старт». Кнопка сначала видна, по ее нажатию обнуляются счетчики, и запускается таймер,
а также свойству Button 1. Visible присваивается значение false. Во время игры кнопка уже не видна. После 10 выстрелов форма очищается, и кнопка вновь видна. Число попаданий и выстрелов будем выводить в строке Form 1. Caption (рис. 17).

 

Рис. 17. Форма проекта «Попади в мишень»

Потребуется написать процедуру mishen рисования кружка заданного цвета с использованием стандартного метода Ellipse. Используем следующие глобальные переменные

 

var cw,ch,rad, a,b:integer;

vist, popal:integer;

c:TColor;

procedure mishen(x,y:integer;rad:integer;c:TColor);

begin

with Form1.Canvas do

begin

Pen.Color:=c;

Brush.Color:=c;

Ellipse(x,y,x+2*rad,y+2*rad);

end;

end;

 

Ниже приведен код FormCreate, Timer1Timer, FormMouseDown и Button1Click.

 

procedure TForm1.FormCreate(Sender: TObject);

begin

randomize;

cw:=ClientWidth; // Ширина формы

ch:=ClientHeight; // Высота формы

rad:=10;

Timer1.Enabled:=false;

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

c:=Form1.Color; // Закрашиваем мишень цветом формы

mishen(a,b,rad,c);

c:=RGB(random(256),random(256),random(256));

a:=1+random(cw-2*rad);

b:=1+random(ch-2*rad);

mishen(a,b,rad,c); // Рисуем мишень в новом месте

end;

 

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var x1,y1:integer;

begin

vist:=vist+1;

{Переменные х, у – «экранные» координаты точки щелчка, поэтому пересчитаем их так, чтобы значения х 1, у 1 «были» внутри мишени }

x1:=abs(x-a)-rad div 2;

y1:=abs(y-b)-rad div 2;

if (x1*x1+y1*y1<=rad*rad) then

// Указатель мыши внутри мишени

begin

popal:=popal+1;

end;

Form1.Caption:='Выстрелов: '+IntToStr(vist)+

' Попаданий: '+IntToStr(popal);

if vist = 10 then

Begin

Timer1.Enabled:=false;

with Canvas do

begin

Font.Size:=24;

Font.Color:=ClTeal;

Brush.Color:=Form1.Color;

TextOut(70,80,'Игра окончена');

end;

Button1.Visible:=true; // Можем начать сначала

end;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

vist:=0;

popal:=0;

// Очистим форму

with Canvas do

begin

Pen.Color:=Form1.Color;

Brush.Color:=Form1.Color;

Rectangle(0,0,cw,ch);

end;

Timer1.Enabled:=true;

Button1.Visible:=false; // Кнопка невидима

end;

 

На рис. 18 нарисован «один миг» из игры.

 

Рис. 18. Игра «Попади в мишень»

 

Задание. Вместо кружка нарисуйте симпатичную картинку, создайте переменную класса TBitMap и загрузите картинку в эту переменную с помощью метода LoadFromFile. «Стирать» картинку можно рисованием прямоугольника цветом формы.

3.1.2. Проект «Снежинки»

Постановка задачи. Рисование снежинки на поверхности формы в точке, в которой пользователь нажал кнопку мыши. Демонстрирует использование процедуры PolyLine, а также процедуры обработки события OnMouseDown для получения координаты точки, в которой нажата кнопка мыши. При нажатии левой кнопки мыши цвет снежинки синий, а при нажатии правой – голубой (рис. 19).

Рис. 19. Результат работы программы «Снежинки»

Реализация. Напишем процедуру snowflake рисования снежинки. Входными параметрами для нее являются координаты x 0, y 0 центра снежинки и r − радиус снежинки.

 

procedure snowflake(x0,y0,r: integer);

// x0,y0 - координаты центра снежинки

// r - радиус снежинки

var p: array[1..21] of TPoint; // Массив координат лучей и впадин

a: integer; // Угол в градусах между осью Оx и прямой,
// соединяющей центр снежинки и конец луча или впадины

i: integer;

begin

a:= 18; // Строим от правого горизонтального луча

for i:=1 to 20 do

begin

if (i mod 2 = 0) then

begin // Впадина

p[i].x:= x0+Round(r/6*cos(a*2*pi/360));

p[i].y:=y0-Round(r/6*sin(a*2*pi/360));

end

else

begin // Луч

p[i].x:=x0+Round(r*cos(a*2*pi/360));

p[i].y:=y0-Round(r*sin(a*2*pi/360));

end;

a:= a+18;

end;

p[21].x:= p[1].x; // Замкнуть контур снежинки

p[21].y:= p[1].y;

Form1.Canvas.Polyline(p); // Начертить снежинку

end;

 

На событие OnMouseDown напишем код, в котором проверяем, какая кнопка была нажата.

 

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

if Button = mbLeft then // Нажата левая кнопка мыши

// Устанавливаем синий цвет

Form1.Canvas.Pen.Color:= clBlue

else

// Задаём голубой цвет

Form1.Canvas.Pen.Color:= clSkyBlue;

// Вызов процедуры отрисовки снежинки

snowflake(x, y, 10);

end;

3.1.3. Проект «Крестики-нолики»

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

Реализация. Положите на форму компонент TPaintBox. Используйте процедуру DrawPole из параграфа «Рисование поля для различных игр» (пункт 2.1.2). Эта процедура рисует поле, состоящее
из N х N квадратиков, как указано на рис. 20. Рисовать будем
на компоненте TPaintBox, поэтому переменные x 0 и y 0 равны нулю и не будут использоваться. Клетки будут квадратные, значит, dx = dy (сторона квадратика в пикселях).

Зададим размер поля константой N = 5.

 

На рис. 20 выделен квадратик
с номером строки i = 2 и номером столбца k = 3. Для нахождения координат этого квадратика на TPaintBox используем формулы (1):

 

x = (k –1) * dx;

y = (i– 1) * dy.

 

Обратно, зная x и y, можно найти номер строки и номер столбца
по формулам (2):

Рис. 20. Поле для проекта «Крестики-нолики»  


k = x div dx+1;

i = y div dy+1.

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

Опишите глобальную переменную булевского типа, означающую признак того, что ходят крестики, например:

 

var pr_krest:boolean.

 

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

 

procedure mas_clear; {Обнуление элементов массива}

var i,k:integer;

begin

for i:=1 to N do

for k:=1 to N do

a[i,k]:=0;

end;

В процессе игры мышью будем указывать клетку, в которую надо выводить «Х» или «О» в зависимости от значения признака pr_krest. Эти буквы будем выводить с помощью метода TextOut. При этом мышь должна указать место на сетке, т. е. какой-либо квадратик с номером строки i и номером столбца k. Для нахождения значений переменных i и k будем использовать формулы (2).

В параметрах процедуры TForm1.PaintBox1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer), являющейся обработчиком события «щелчок по левой кнопке», есть переменные x и y. Эти значения x и y подставим в формулы (2):

k:= x div dx + 1;

i:= y div dy + 1;

Так мы узнаем номер строки и номер столбца квадратика [i, k]. Кроме того, при щелчке мышью по клетке занесем в соответствующую ячейку массива a[i, k]:=1 (крестики) или a[i, k]:=2 (нолики). Надо не забыть, что ставить крестик или нолик мы можем только
в том случае, если в соответствующей ячейке массива стоит 0. Ниже приведен код обработчика PaintBox1MouseDown.

 

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var c,b:integer;

begin

k:=x div dx +1;

i:=y div dy +1;

if a[i, k] = 0 then

begin

c:=(k-1)*dx+8; // Место для вывода символа

b:=(i-1)*dy+2;

with PaintBox1.Canvas do

begin

Font.Color:=clblue;

Font.Size:=18;

brush.color:=ClWhite;

end;

if pr_krest then

begin

PaintBox1.Canvas.TextOut(c,b,'X');

a[i,k]:=1;

{ Здесь должна быть проверка }

pr_krest:=false;

Label1.Caption:='Ход ноликов';

end

else

begin

PaintBox1.Canvas.TextOut(c,b,'О');

a[i,k]:=2;

{Здесь должна быть проверка}

pr_krest:=true;

Label1.Caption:='Ход крестиков';

end;

end;

end;

 

На рис. 21 показан момент игры «Крестики-нолики».

 

Рис. 21. Игра «Крестики-нолики»

 

После того как крестик или нолик поставлен, необходимо организовать проверку по горизонтали, вертикали и диагонали. В случае успеха вывести соответствующее сообщение, например, «Выиграли крестики!» В следующей функции line_vert организована проверка по вертикали.

 

function line_vert (i,k, c: integer): boolean;

{ Числа i, k – это номер строки и номер столбца квадратика [i, k], в который только что поставили крестик (переменная c равна 1) или нолик (переменная c равна 2) }

var p,q:integer;

begin

p:=i;q:=i; {Начинаем проверку от квадратика [i,k]}

while(p<=n)and(a[p,k]=c)do

{Идем вниз по полю}

p:=p+1;

while(q>=1)and(a[q,k]=c)do

{Идем вверх по полю}

q:=q-1;

if(p-q)=n+1 then

line_vert:=true else line_vert:=false;

end;

 

Игра заканчивается, если выигрыш или не осталось свободных клеток.

 

Задание. Организуйте проверку по горизонтали и диагоналям.


Дата добавления: 2015-08-20; просмотров: 58 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Перемещение картинок| Движение образа по удерживанию левой кнопки мыши

mybiblioteka.su - 2015-2024 год. (0.02 сек.)