Програма Пінг-понг демонструє, як можна зробити графіку інтерактивною. У вікні програми два об’єкти: м’ячик і ракетка, якою за допомогою клавіш переміщення курсору керує гравець. На формі програми тільки один компонент – Timer.

Код написання програми
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;
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;
}
програмування