S
Scabby
здравствуйте. Мне требуется разработать программку (визуализация) по типу арканоида. Круги (шарики) должны двигаться по форме в 8 направлениях, сталкиваясь с другими шарами и со стенками формы отталкиваться, не сливаясь сдругими шарами и без разных странных приключений.
Я смогла сделать только для одного шарика.Он движется во все направления и отталкивается от стенок. Программка полностью работает.Нет ни массивов, ни матриц.Но скорее всего как раз как-то нужно с матрицами или массивами оперировать.
надо как-то сделать следущее:
1. в написаннии алгоритма *рисования* n-количества шаров
2.чтобы они все двигались
3.отталкивались друг от друга и стенок.
моя рабочая прога для 1 шарика
[codebox]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TDirection=(dLeft,dUpleft,dupright,dright,
ddownright,ddownleft,ddown,dup);
TBall=record
Button1: TButton;
id:byte;
size:byte;
Direction:TDirection;
Speed:byte;
Color:TColor;
BorderColor:TColor;
end;
TForm1 = class(TForm)
Paint: TButton;
Image1: TImage;
Timer1: TTimer;
Timer2: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure PaintClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
MyBMP:TBitmap;
ball:TBall;
I:integer;
x,y,x1,y1,n,b,k:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
{n:=10; 'число шарок'
r:=10;
'радиус шаров }
x:=120;
y:=120;
x1:=140;
y1:=140;
end;
procedure TForm1.PaintClick(Sender: TObject);
begin
if( Timer1.Enabled ) Then
Timer1.Enabled := false
else
Timer1.Enabled := true;
randomize();
Ball.Direction:= TDirection ( random(8) );
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
MyBMP:=TBitmap.Create;
MyBMP.Width:=500;
MyBMP.Height:=500;
MyBMP.Canvas.Pen.Color:=clRed;
MyBMP.Canvas.Pen.Width:=1;
MyBMP.Canvas.Brush.Color:=clRed;
{ for k:=1 to n do begin
}
case Ball.Direction of
dLeft: begin
x:=x-1;
y:=y;
x1:=x1-1;
y1:=y1;
end;
dUpleft: begin
x:=x-1;
y:=y-1;
x1:=x1-1;
y1:=y1-1;
end;
dupright: begin
x:=x+1;
y:=y-1;
x1:=x1+1;
y1:=y1-1;
end;
dright: begin
x:=x+1;
y:=y;
x1:=x1+1;
y1:=y1;
end;
ddownright: begin
x:=x+1;
y:=y+1;
x1:=x1+1;
y1:=y1+1;
end;
ddownleft: begin
x:=x-1;
y:=y+1;
x1:=x1-1;
y1:=y1+1;
end;
ddown: begin
x:=x;
y:=y+1;
x1:=x1;
y1:=y1+1;
end;
dup: begin
y:=y-1;
x1:=x1;
x:=x;
y1:=y1-1;
end;
end;
if x=0 then
begin
if( Ball.Direction = dLeft ) Then Ball.Direction:= dright;
if( Ball.Direction = dUpleft ) Then Ball.Direction:= dupright;
if( Ball.Direction = ddownleft ) Then Ball.Direction:= ddownright;
end;
if y=0 then
begin
if( Ball.Direction = dUpleft ) Then Ball.Direction:= ddownright;
if( Ball.Direction = dup ) Then Ball.Direction:= ddown;
if( Ball.Direction = dupright ) Then Ball.Direction:= ddownright;
end;
if x1 = Image1.Width then
begin
if( Ball.Direction = dright ) Then Ball.Direction:= dLeft;
if( Ball.Direction = ddownright ) Then Ball.Direction:= ddownleft;
if( Ball.Direction = dupright ) Then Ball.Direction:=dUpleft;
end;
if y1 = Image1.Height then
begin
if( Ball.Direction = ddown ) Then Ball.Direction:= dup;
if( Ball.Direction = ddownleft ) Then Ball.Direction:= dUpleft;
if( Ball.Direction = ddownright ) Then Ball.Direction:= dupright;
end;
MyBMP.Canvas.ellipse(x,y,x1,y1);
Image1.Picture.Bitmap:=MyBMP;
MyBMP.Free;
end;
end.
[/codebox]
Я смогла сделать только для одного шарика.Он движется во все направления и отталкивается от стенок. Программка полностью работает.Нет ни массивов, ни матриц.Но скорее всего как раз как-то нужно с матрицами или массивами оперировать.
надо как-то сделать следущее:
1. в написаннии алгоритма *рисования* n-количества шаров
2.чтобы они все двигались
3.отталкивались друг от друга и стенок.
моя рабочая прога для 1 шарика
[codebox]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TDirection=(dLeft,dUpleft,dupright,dright,
ddownright,ddownleft,ddown,dup);
TBall=record
Button1: TButton;
id:byte;
size:byte;
Direction:TDirection;
Speed:byte;
Color:TColor;
BorderColor:TColor;
end;
TForm1 = class(TForm)
Paint: TButton;
Image1: TImage;
Timer1: TTimer;
Timer2: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure PaintClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
MyBMP:TBitmap;
ball:TBall;
I:integer;
x,y,x1,y1,n,b,k:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
{n:=10; 'число шарок'
r:=10;
'радиус шаров }
x:=120;
y:=120;
x1:=140;
y1:=140;
end;
procedure TForm1.PaintClick(Sender: TObject);
begin
if( Timer1.Enabled ) Then
Timer1.Enabled := false
else
Timer1.Enabled := true;
randomize();
Ball.Direction:= TDirection ( random(8) );
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
MyBMP:=TBitmap.Create;
MyBMP.Width:=500;
MyBMP.Height:=500;
MyBMP.Canvas.Pen.Color:=clRed;
MyBMP.Canvas.Pen.Width:=1;
MyBMP.Canvas.Brush.Color:=clRed;
{ for k:=1 to n do begin
}
case Ball.Direction of
dLeft: begin
x:=x-1;
y:=y;
x1:=x1-1;
y1:=y1;
end;
dUpleft: begin
x:=x-1;
y:=y-1;
x1:=x1-1;
y1:=y1-1;
end;
dupright: begin
x:=x+1;
y:=y-1;
x1:=x1+1;
y1:=y1-1;
end;
dright: begin
x:=x+1;
y:=y;
x1:=x1+1;
y1:=y1;
end;
ddownright: begin
x:=x+1;
y:=y+1;
x1:=x1+1;
y1:=y1+1;
end;
ddownleft: begin
x:=x-1;
y:=y+1;
x1:=x1-1;
y1:=y1+1;
end;
ddown: begin
x:=x;
y:=y+1;
x1:=x1;
y1:=y1+1;
end;
dup: begin
y:=y-1;
x1:=x1;
x:=x;
y1:=y1-1;
end;
end;
if x=0 then
begin
if( Ball.Direction = dLeft ) Then Ball.Direction:= dright;
if( Ball.Direction = dUpleft ) Then Ball.Direction:= dupright;
if( Ball.Direction = ddownleft ) Then Ball.Direction:= ddownright;
end;
if y=0 then
begin
if( Ball.Direction = dUpleft ) Then Ball.Direction:= ddownright;
if( Ball.Direction = dup ) Then Ball.Direction:= ddown;
if( Ball.Direction = dupright ) Then Ball.Direction:= ddownright;
end;
if x1 = Image1.Width then
begin
if( Ball.Direction = dright ) Then Ball.Direction:= dLeft;
if( Ball.Direction = ddownright ) Then Ball.Direction:= ddownleft;
if( Ball.Direction = dupright ) Then Ball.Direction:=dUpleft;
end;
if y1 = Image1.Height then
begin
if( Ball.Direction = ddown ) Then Ball.Direction:= dup;
if( Ball.Direction = ddownleft ) Then Ball.Direction:= dUpleft;
if( Ball.Direction = ddownright ) Then Ball.Direction:= dupright;
end;
MyBMP.Canvas.ellipse(x,y,x1,y1);
Image1.Picture.Bitmap:=MyBMP;
MyBMP.Free;
end;
end.
[/codebox]