- •Задача 1. Конвертер
- •Задача 2. Фунты-килограммы
- •Задача 3. Сила тока.
- •Задача 4. Сопротивление
- •Задача 5. Кафе
- •Задача 6. Любимый напиток
- •Задача 7. Электроэнергия
- •Задание 8. Осаго
- •Задание 9.Просмотр иллюстраций
- •Задача 10. Калькулятор
- •Задача 11. Калькулятор-2
- •Задача 12.Секундомер
- •Задача 13. Угадай число
- •Задание 14.Угадай число-2
- •Задание 15.Запуск Internet Explorer
- •Задание 16.Конвертор
- •Задание 17.Конвертор 2
- •Задание 18.Погода
- •Задание 19.Средняя температура
- •Задание 20. Простая база данных
- •Задание 21. Редактор текста
- •Задание 22. Приветствие
- •Задача 23. Олимпийский флаг
- •Задание 24. Диаграмма
- •Задача 26. Круговая диаграмма.
- •Задача 27. Просмотр иллюстраций.
- •Задача 28 .Часы
- •Задача 29. Пинг понг.
- •Задача 30. Полет в облаках
- •Задача 31.Баннер
- •Задача 32. Фоновый рисунок
- •Задача 33. Wav
- •Задача 34. Mp3 Player
- •Задача 35.Воспроизведение midi
- •Задача 36.Compact Disk Player (версия 1)
- •Задача 37.Compact Disk Player (версия 2)
- •Задача 38.VideoPlayer
- •Задача 39. Анимация
- •Задача 40. Записная книжка
- •Задача 41 Магазин
- •Задача 42. Ежедневник
- •Задача 43. Сапер
- •Часть 1. Примеры и задачи
- •Часть 1. Примеры и задачи
- •Задача 44 Игра 15
- •Часть 1. Примеры и задачи
- •Задача 45. Игра "Собери картинку" (Puzzle)
- •Задача 46 Игра "Парные картинки"
- •Задача 47. Экзаменатор
- •Задача 48. Экзаменатор-2
- •Задача 49. Календарь
- •Задача 50. Будильник
- •Задача 51. Очистка диска
- •Задача 52.Печать
- •Задачи для самостоятельного решения Задача 1. Скидка
- •Задача 2.Доход по вкладу
- •Задача 3. Таблица умножения
- •Задача 4.Поездка на автомобиле
- •Задача 5.Стоимость разговора
- •Задача 6. Стеклопакет
- •Задача7. Калькулятор
- •Задача 8. Электроэнергия
- •Задача 9. Добрый день
- •Задача 10. Часы
- •Задача 11. Узоры
- •Задача 12. Курс доллара
- •Задача 13. Диаграмма
- •Задача 14. Домашние животные
- •Задача 15. Кораблик
- •Задача 16. Сапер
- •Задача 17 .Экзаменатор
- •Задача 18. База данных "Расходы"
Задача 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;
}
//---------------------------------------------------------------------------
