Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет мой.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.46 Mб
Скачать

Задача 29. Пинг понг.

Программа Пинг-понг (Рис. 36) демонстрирует, как можно сделать графику интерактивной. В окне программы два объекта: мячик и ракетка, которой при помощи клавиш перемещения курсора управляет игрок. На форме программы только один компонент — Timer.

Рис 36

Вывод: В этой задаче мы научились создавать с помощью кода и тоглько одного компонента простую игру.

Листинг

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int x, y; // положение мячика

int dx, dy; // приращение координат

int r; // радиус мячика

TColor cBall; // цвет мячика

TColor cBack; // цвет поля

int wp, hp; // размер поля (формы)

// это переменные для управления движешлем ракетки

int rd; // 0 - ракетка не движется; 1 -движется

// влево; 2 - движетсявправо

int rx1, rx2; // координаты X концов ракетки

int ry; // координата Y концовракетки

int rdx; // шаг перемещения ракетки

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

r = 5; // радиус мячика

x = r; y = 50; // начальное положение мячика

dx = 1;

dy= 1;

cBall = (TColor)RGB(217, 217, 25);// цветмячика

cBack = (TColor)RGB(33, 94, 33); // цветполя

Form1->Color = cBack;

wp = Form1->ClientWidth;

hp = Form1->ClientHeight;

// управление ракеткой

rd = 0; // ракетка на месте (не движется)

rx1 = 100;

rx2 - 125;

ry = Form1->ClientHeight - 20; // расстояние до нижней

// границы формы 20пикселей

rdx = 2; // шаг движенияракетки

// настройкатаймера

Timer1->Interval = 10;

Timer1->Enabled = true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)

{

// нарисоватьракету

Form1->Canvas->Pen->Color = clRed;

Form1->Canvas->Rectangle(rx1, ry, rx2, ry+1) ;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

// стеретьизображениемяча

Form1->Canvas->Pen->Color = cBack;

Form1->Canvas->Ellipse(x,y,x+r,y+r);

// ** вычислить новое положение мяча **

if ( dx > 0 )

{

// мяч движется вправо

if (x + dx + r > wp) dx = -dx;

}

else

// мяч движется влево

if ( x + dx - r < 0 ) dx = -dx;

if ( dy > 0 )

{

// мяч движется вниз

if ((x >= rx1) && (x <= rx2 -r) && (y == ry - r - 1) )

// мячик попал в ракетку

dy = - dy;

else

if ( y + dy + r > Form1->ClientHeight ) dy = -dy;

}

else

{

// мячикдвижетсявверх

if ((x >= rx1) && (x <= rx2) && (y >= ry - r) && (y <=

ry + r) )

{

// мячик отскочил от нижней стенки и попал в ракетку снизу

// чтобы не было дырок в ракетке перерисуем ее.

Form1->Canvas->Pen->Color = clRed;

Form1->Canvas->Rectangle(rx1, ry, rx2, ry+1);

}

if ( y + dy - r < 0 ) dy = -dy;

}

x += dx;

y +=dy;

// нарисовать мяч в новой точке

Form1->Canvas->Pen->Color = cBall;

Form1->Canvas->Ellipse(x,y,x+r,y+r);

// *** ракетка ***

if ( rd != 0)

{

// игрок нажал и удерживает стрелку вправо или влево

// (см. FormKeyDown )

if ( rd == 1 )

{

//вправо

if ( rx2 < wp )

{

// стеретьчастьслева

Form1->Canvas->Pen->Color = cBack;

Form1->Canvas->Rectangle(rx1, ry, rx1 + rdx,

ry + 1 ) ;

// дорисоватьчастьсправа

Form1->Canvas->Pen->Color = clRed;

Form1->Canvas->Rectangle (rx2, ry, rx2 + rdx,

ry + 1) ;

rx1 += rdx;

rx2 += rdx;

}

}

else

// влево

if (rx1 > 1 )

{ // стереть часть справа

Form1->Canvas->Pen->Color = cBack;

Form1->Canvas->Rectangle (rx2, ry, rx2 - rdx,

ry+1);

// дорисоватьслева

Form1->Canvas->Pen->Color = clRed;

Form1->Canvas->Rectangle(rx1 - rdx, ry, rx1 +

rdx, ry+1);

rx1 -= rdx;

rx2 -= rdx ;

}}}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,

TShiftState Shift)

{

if (rd != 0 )

// пользователь удерживает клавищу ракетка движется

return;

switch ( Key )

{

case VK_LEFT : // шагвправо

rd = 2; break;

case VK_RIGHT : // ?шагвлево

rd = 1; break;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,

TShiftState Shift)

{

rd = 0;

}

//---------------------------------------------------------------------------