Консультация № 131843
12.04.2008, 15:18
0.00 руб.
0 2 2
Здраствуйте,вот недавно озадачился,как написать пример где шарик будет отскакивать от краев формы...как я не парился с рандомом и условиями,несмогвидимо плохо парился,так вот о чем я?Ах да...обьясните мне тупому как сделать такое? только пожалуйста непишите готовый код...я хочу понять как самому это сделать...

Обсуждение

Неизвестный
12.04.2008, 20:02
общий
это ответ
Здравствуйте, Melixion!
см. пример в приложении
п.с.: за основу взял Ваш код
п.п.с.: пример не проверял - "писал на лету", но должно работать, т.к. подобные штуки делал сам не раз - хоть это и упрощенный вариант

Приложение:
var dx,dy:integer; // глобальные переменные...procedure TForm1.FormCreate(Sender: TObject); begin Image1.Left:=(Form1.Width-Image1.Width) div 2; Image1.Top:=(Form1.Height-Image1.Height) div 2; randomize; if random(100)>50 dx:=1 else dx:=-1; if random(100)>50 dy:=1 else dy:=-1; Timer1.Enabled:=true;end;...procedure TForm1.Timer1Timer(Sender: TObject); begin if (Image1.Left+dx<0)or (Image1.Left+dx>Form1.Width-Image1.Width) then dx:=-dx; if (Image1.Top+dy<0)or (Image1.Top+dy>Form1.Height-Image1.Height) then dy:=-dy; Image1.Left:=Image1.left+dx; Image1.Top:=Image1.Top+dy; end;
давно
Профессионал
153662
1070
14.04.2008, 14:04
общий
это ответ
Здравствуйте, Melixion!
У меня получилась такая вот программка, код в приложении, имитирует игру пинг - понг, когда - то были такие приставки для телевизоров.

Приложение:
Модуль .dfmobject Form1: TForm1 Left = 195 Top = 104 Width = 544 Height = 375 BorderIcons = [biSystemMenu, biMinimize] Caption = #1087#1080#1085#1075‘ - ‘#1087#1086#1085#1075 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = ‘MS Sans Serif‘ Font.Style = [] KeyPreview = True OldCreateOrder = False OnCreate = FormCreate OnKeyDown = FormKeyDown OnKeyUp = FormKeyUp OnPaint = FormPaint PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 24 Top = 312 Width = 75 Height = 25 Caption = #1053#1086#1074#1072#1103‘ ‘#1080#1075#1088#1072 TabOrder = 0 OnClick = Button1Click end object Panel1: TPanel Left = 40 Top = 40 Width = 457 Height = 241 BevelInner = bvLowered BevelOuter = bvNone BevelWidth = 5 BorderWidth = 5 BorderStyle = bsSingle TabOrder = 1 object PaintBox1: TPaintBox Left = 10 Top = 10 Width = 433 Height = 217 Align = alClient Color = clGreen ParentColor = False end end object Timer2: TTimer Enabled = False Interval = 100 OnTimer = Timer2Timer Left = 56 Top = 16 end object Timer1: TTimer Enabled = False Interval = 25 OnTimer = Timer1Timer Left = 96 Top = 16 end object Timer3: TTimer Enabled = False Interval = 500 OnTimer = Timer3Timer Left = 136 Top = 16 end object Timer4: TTimer Enabled = False Interval = 100 OnTimer = Timer4Timer Left = 168 Top = 16 end object Timer5: TTimer Enabled = False Interval = 250 OnTimer = Timer5Timer Left = 216 Top = 16 end object Timer6: TTimer Enabled = False Interval = 250 OnTimer = Timer6Timer Left = 256 Top = 16 endendМодуль .pasunit Pong;interfaceuses Windows, SysUtils, Variants, Classes, Controls, ExtCtrls, Graphics, Forms, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; PaintBox1: TPaintBox; Timer2: TTimer; Timer1: TTimer; Timer3: TTimer; Timer4: TTimer; Timer5: TTimer; Timer6: TTimer; procedure Button1Click(Sender: TObject); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormPaint(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Timer3Timer(Sender: TObject); procedure Timer4Timer(Sender: TObject); procedure Timer5Timer(Sender: TObject); procedure Timer6Timer(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; xe,ye,yr,xr,a1,rez,i_rez:SmallInt; //xe,ye - координаты мяча, yr,xr - координата ракетки y1,a:byte;y2:ShortInt; az:array[1..100] of byte;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin beep; xe:=1; ye:=random(215); if ye<25 then ye:=112; yr:=145; xr:=250; y2:=random(10); if y2<2 then y2:=5; timer2.Enabled:=true; form1.Canvas.Font.Height:=24; form1.Canvas.Font.Color:=clsilver; form1.Canvas.TextOut(144,312,‘Игра закончена.‘); form1.Canvas.TextOut(344,312,inttostr(rez)+‘ очков!‘); form1.Canvas.Font.Color:=clblack; form1.Canvas.TextOut(144,312,‘Вперёд!‘);// form1.Canvas.TextOut(344,312,‘0 очков!‘);// paintbox1.Refresh; paintbox1.Canvas.Pen.Color:=clgreen; paintbox1.Canvas.Rectangle(0,0,433,217); paintbox1.Canvas.Pen.Color:=clpurple; paintbox1.Canvas.Brush.Color:=clpurple; paintbox1.Canvas.Rectangle(xr,yr,xr-10,yr-60); timer3.Enabled:=true; rez:=0;end;procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);begin case key of 88 : timer1.Enabled:=false;// Если нажата клавиша x останавливаем таймер движения ракетки 87 : timer1.Enabled:=false;// Если нажата клавиша w останавливаем таймер движения ракетки 65 : timer1.Enabled:=false; 68 : timer1.Enabled:=false; end;end;procedure TForm1.FormCreate(Sender: TObject);begin paintbox1.Canvas.MoveTo(0,210);// Перемещаем перо в заданную точку экрана paintbox1.Canvas.Pen.Width:=2;// Назначаем толщину пера y1:=0; ye:=215; a1:=409; randomize;end;procedure TForm1.Timer2Timer(Sender: TObject);begin paintbox1.Canvas.Pen.Color:=clgreen;// Рисуем прямоугольник в нужном месте экрана paintbox1.Canvas.Brush.Color:=clgreen;// Назначаем цвет кисти paintbox1.Canvas.Ellipse(xe,ye,xe+24,ye-24);// Рисуем круг в нужном месте экрана if xe=1 then begin beep; y1:=0; end else if xe=a1 then y1:=1; case y1 of // 0 : begin xe:=xe+12; ye:=ye-(y2); if ye<25 then begin beep;y2:=-y2; end; if ye>214 then begin beep; y2:=-y2; end; end; 1 : begin xe:=xe-12; ye:=ye-(y2); if ye<25 then begin beep; y2:=-y2; end; if ye>214 then begin beep; y2:=-y2; end; end; end; paintbox1.Canvas.Pen.Color:=clyellow; // Рисуем прямоугольник в нужном месте экрана paintbox1.Canvas.Brush.Color:=clyellow;// Назначаем цвет кисти paintbox1.Canvas.Ellipse(xe,ye,xe+24,ye-24);// Рисуем круг в нужном месте экрана if (xe=xr-33) and (ye<=yr+23) and (ye>=yr-59) then begin a1:= xr-33; rez:=rez+1; beep; form1.Canvas.TextOut(344,312,inttostr(rez)+‘ очков!‘);// i_rez:=0; timer5.Enabled:=true; exit; end else a1:=409; if (xe>xr-34) and ((ye>=yr+23) or (ye<=yr-59)) then begin form1.Canvas.TextOut(144,312,‘Игра закончена.‘);// Проверка пропуска мяча if xe>=385 then timer2.Enabled:=false; end;end;procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);begin case key of // Выбор направления движения ракетки 88 : begin a:=1; // Индентификатор запуска ракетки вниз timer1.Enabled:=true;// Запустить ракетку end; 87 : begin a:=0; // Идентификатор запуска ракетки вверх timer1.Enabled:=true;// Запустить ракетку end; 65 : begin a:=2; // Индентификатор запуска ракетки влево timer1.Enabled:=true;// Запустить ракетку end; 68 : begin a:=3; // Индентификатор запуска ракетки вправо timer1.Enabled:=true;// Запустить ракетку end; end;end;procedure TForm1.FormPaint(Sender: TObject);begin form1.Canvas.Font.Style:=[fsBold];// form1.Canvas.TextOut(10,10,‘Вниз - x, Вверх - w, Влево - a, Вправо - d‘);//end;procedure TForm1.Timer1Timer(Sender: TObject);begin paintbox1.Canvas.Pen.Color:=clgreen; paintbox1.Canvas.Brush.Color:=clgreen; paintbox1.Canvas.Rectangle(xr,yr,xr-10,yr-60);// Рисуем прямоугольник в нужном месте экрана case a of // 0 : yr:=yr-12; 1 : yr:=yr+12; 2 : xr:=xr-12; 3 : xr:=xr+12; end; paintbox1.Canvas.Pen.Color:=clpurple; paintbox1.Canvas.Brush.Color:=clpurple; paintbox1.Canvas.Rectangle(xr,yr,xr-10,yr-60);end;procedure TForm1.Timer3Timer(Sender: TObject);var i:byte;begin for i:=1 to 100 do begin paintbox1.Canvas.Pixels[az[i],az[i+1]]:=clgreen; end; for i:=1 to 100 do begin az[i]:=random(433); end; timer3.Enabled:=false; timer4.Enabled:=true;end;procedure TForm1.Timer4Timer(Sender: TObject);var i:byte;begin for i:=1 to 100 do paintbox1.Canvas.Pixels[az[i],az[i+1]]:=clsilver; timer3.Enabled:=true; timer4.Enabled:=false;end;procedure TForm1.Timer5Timer(Sender: TObject);begin form1.Canvas.Font.Color:=clred; form1.Canvas.TextOut(344,312,inttostr(rez)); i_rez:=i_rez+1; timer5.Enabled:=false; timer6.Enabled:=true;end;procedure TForm1.Timer6Timer(Sender: TObject);begin form1.Canvas.Font.Color:=clyellow; form1.Canvas.TextOut(344,312,inttostr(rez)); timer6.Enabled:=false; if i_rez<4 then timer5.Enabled:=true else begin form1.Canvas.Font.Color:=clblack; form1.Canvas.TextOut(344,312,inttostr(rez)); end;end;end.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа