pomocy w dokonczeniu gry

0

prosze o pomoc. Mam do napisania gre ktorapolega na lapaniu spadajacych pileczek przy pomocy ruchomej belki. Napisalem program do tego ale n ie wiem jak zrobic zeby spadalo wiecej niz jedna pilka na innych poziomach????? PROSZE O POMOC na pewno sie dogadamy ponizej przedstawiam caly kod tego programu

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    zegar: TTimer;
    MainMenu1: TMainMenu;
    Opcje1: TMenuItem;
    Nowagra1: TMenuItem;
    Koniec1: TMenuItem;
    N1: TMenuItem;
    Panel1: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    zycie1: TShape;
    zycie2: TShape;
    zycie3: TShape;
    Shape1: TShape;
    belka: TShape;
    pilka3: TShape;
    pilka2: TShape;
    pilka5: TShape;
    pilka4: TShape;
    pilka6: TShape;
    pilka7: TShape;
    pilka9: TShape;
    pilka8: TShape;
    pilka1: TShape;
    pilka10: TShape;
    Panel2: TPanel;
    procedure fromcreate(sender: tobject);
    procedure Koniec1Click(Sender: TObject);
    procedure Nowagra1Click(Sender: TObject);
    procedure fromkeydown(sender:tobject; var key:word; shift: tshiftstate);
    procedure zegarTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var punkty,
  poziom,
zycia,
p,
iloscpilek:integer;
gra:boolean;
pilki: array [1..10] of tshape;
szanse:array [1..3] of tshape;
{$R *.dfm}

{ TForm1 }

procedure TForm1.fromcreate(sender: tobject);
begin
punkty:=0;
poziom:=0;

zycia:=3;
iloscpilek:=0;
gra:=false;
szanse[1]:=zycie1;
szanse[2]:=zycie2;
szanse[3]:=zycie3;
pilki[1]:=pilka1;
pilki[2]:=pilka2;
pilki[3]:=pilka3;
pilki[4]:=pilka4;
pilki[5]:=pilka5;
pilki[6]:=pilka6;
pilki[7]:=pilka7;
pilki[8]:=pilka8;
pilki[9]:=pilka9;
pilki[10]:=pilka10;

end;

procedure TForm1.fromkeydown(sender: tobject; var key: word; shift: tshiftstate);
begin
if gra=true then
begin
 if (word(key)=vk_left) then
 begin
 if (belka.Left-5>=8)then
 belka.left:=belka.Left-15
 else belka.Left:=8;
 end;
 if (word(key)=vk_right) then
 begin
 if (belka.Left+5<233) then
 belka.left:=belka.Left+15
 else belka.left:=235;
end;
end;
end;

procedure TForm1.Koniec1Click(Sender: TObject);
begin
close();
end;

procedure TForm1.Nowagra1Click(Sender: TObject);
begin
 punkty:=0;
poziom:=1;
zycia:=3;
iloscpilek:=0;
gra:=true;
szanse[1]:=zycie1;
szanse[2]:=zycie2;
szanse[3]:=zycie3;
zycie1.Brush.Color:=clfuchsia;
zycie2.Brush.Color:=clfuchsia;
zycie3.Brush.Color:=clfuchsia;
edit1.Text:='0';
edit2.Text:='1';
pilki[1]:=pilka1;
pilki[2]:=pilka2;
pilki[3]:=pilka3;
pilki[4]:=pilka4;
pilki[5]:=pilka5;
pilki[6]:=pilka6;
pilki[7]:=pilka7;
pilki[8]:=pilka8;
pilki[9]:=pilka9;
pilki[10]:=pilka10;
form1.SetFocus;
panel2.caption:='Grasz';
end;

procedure TForm1.zegarTimer(Sender: TObject);
var i,j,k:integer;

  begin
if (zycia>0) and (gra=true) then
 if iloscpilek<poziom then

 begin
   poziom:=1;
   p:=4;
   iloscpilek:=iloscpilek+1;

   pilki[iloscpilek].Visible:=true;

   pilki[iloscpilek].top:=80;
   pilki[iloscpilek].left:=(pilki[iloscpilek].Left+random(285)) mod 285+10;

   end;
 for i:=1 to iloscpilek do
 begin

   pilki[i].Top:=pilki[i].Top +p div 4 ;

    if punkty>9 then p:=6;
   if punkty>19 then p:=7;
     if punkty>29 then p:=9;
      if punkty>39 then p:=11;
       if punkty>49 then p:=13;
       if punkty>59 then p:=16;
        if punkty>69 then p:=18;
         if punkty>79 then p:=20;
          if punkty>89 then p:=22;

 end;

 k:=iloscpilek;

 for i:=1 to k do
   begin
   if pilki[i].top>402 then
   if (pilki[i].left>=belka.left) and
   (pilki[i].left<=belka.left+70) then
   begin
   punkty:=punkty+1;
   edit1.Text:=inttostr(punkty);
   poziom:=(punkty div 10) +1;




   edit2.Text:=inttostr(poziom);
   pilki[i].Visible:=false;
   iloscpilek:=iloscpilek-1;
  if poziom=11 then
   begin
   edit2.text:='koniec';
   panel2.Caption:='wynik = '+(edit1.Text);
   gra:=false;
      end;

   end
   else
   begin
   for j:=3 downto zycia do
   szanse[j].Brush.Color:=clmedgray;
   zycia:=zycia-1;
   if zycia=0 then
   begin gra:=false ;
    panel2.Caption:='przegrales';
   end;
   pilki[i].visible:=false;
   iloscpilek:=iloscpilek-1;

     end;
    end;
   end;

end.


0

Twój kod ma dość chaotyczny styl.

Poprawiłem ten kod i zoptymalizowałem, ale Twój problem może być nadal nie rozwiązany gdyż nie wnikałem w strukturę działania.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    zegar: TTimer;
    MainMenu1: TMainMenu;
    Opcje1: TMenuItem;
    Nowagra1: TMenuItem;
    Koniec1: TMenuItem;
    N1: TMenuItem;
    Panel1: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    zycie1: TShape;
    zycie2: TShape;
    zycie3: TShape;
    Shape1: TShape;
    belka: TShape;
    pilka3: TShape;
    pilka2: TShape;
    pilka5: TShape;
    pilka4: TShape;
    pilka6: TShape;
    pilka7: TShape;
    pilka9: TShape;
    pilka8: TShape;
    pilka1: TShape;
    pilka10: TShape;
    Panel2: TPanel;
    procedure fromcreate(sender: tobject);
    procedure Koniec1Click(Sender: TObject);
    procedure Nowagra1Click(Sender: TObject);
    procedure fromkeydown(sender:tobject; var key:word; shift: tshiftstate);
    procedure zegarTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  punkty, poziom, zycia, p: Integer;
  iloscpilek: SmallInt = 0;
  gra: Boolean = False;
  pilki: array [1..10] of tshape;
  szanse:array [1..3] of tshape;

implementation

{$R *.dfm}

procedure TForm1.FromCreate(Sender: TObject);
begin
 punkty := 0;
 poziom := 0;
 zycia  := 3;

 szanse[1] := zycie1;
 szanse[2] := zycie2;
 szanse[3] := zycie3;

 pilki[1]  := pilka1;
 pilki[2]  := pilka2;
 pilki[3]  := pilka3;
 pilki[4]  := pilka4;
 pilki[5]  := pilka5;
 pilki[6]  := pilka6;
 pilki[7]  := pilka7;
 pilki[8]  := pilka8;
 pilki[9]  := pilka9;
 pilki[10] := pilka10;
end;

procedure TForm1.FromKeydown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if not Gra then Exit;

 if Key = Vk_Left then
   begin
    if Belka.Left - 5 > 7 then Belka.Left := Belka.Left - 15
    else Belka.Left := 8;
   end
 else
 if Key = Vk_Right then
   begin
    if Belka.Left + 5 < 233 then Belka.Left := Belka.Left + 15
    else Belka.Left := 235;
   end;
end;

procedure TForm1.Koniec1Click(Sender: TObject);
begin
 Close();
end;

procedure TForm1.Nowagra1Click(Sender: TObject);
begin
 punkty := 0;
 poziom := 1;
 zycia  := 3;
 iloscpilek := 0;
 gra := True;
 szanse[1] := zycie1;
 szanse[2] := zycie2;
 szanse[3] := zycie3;
 zycie1.Brush.Color := clFuchsia;
 zycie2.Brush.Color := clFuchsia;
 zycie3.Brush.Color := clFuchsia;
 Edit1.Text := '0';
 Edit2.Text := '1';
 pilki[1]  := pilka1;
 pilki[2]  := pilka2;
 pilki[3]  := pilka3;
 pilki[4]  := pilka4;
 pilki[5]  := pilka5;
 pilki[6]  := pilka6;
 pilki[7]  := pilka7;
 pilki[8]  := pilka8;
 pilki[9]  := pilka9;
 pilki[10] := pilka10;
 Form1.SetFocus;
 Panel2.Caption := 'Grasz';
end;

procedure TForm1.zegarTimer(Sender: TObject);
var
 i, j, k: Integer;
begin
 if (zycia > 0) and (gra) then
   if iloscpilek < poziom then
     begin
      poziom := 1;
      p := 4;

      Inc(iloscpilek);
      pilki[iloscpilek].Visible := True;
      pilki[iloscpilek].Top  := 80;
      pilki[iloscpilek].Left := (pilki[iloscpilek].Left + Random(285)) mod 285 + 10;

      end;

 for i := 1 to iloscpilek do
   begin
    pilki[i].Top := pilki[i].Top + p shr 2; //div 4;

    case punkty of
     10..19: p := 6;
     20..29: p := 7;
     30..39: p := 9;
     40..49: p := 11;
     50..59: p := 13;
     60..69: p := 16;
     70..79: p := 18;
     80..89: p := 20;
     else
     if punkty > 89 then p := 22;
    end;
    
    (*
    {stara forma poprawiona}
    if punkty >  9 then p := 6
    else
    if punkty > 19 then p := 7
    else
    if punkty > 29 then p := 9
    else
    if punkty > 39 then p := 11
    else
    if punkty > 49 then p := 13
    else
    if punkty > 59 then p := 16
    else
    if punkty > 69 then p := 18
    else
    if punkty > 79 then p := 20
    else
    if punkty > 89 then p := 22;
    *) 
  end;
 

 k := iloscpilek;
 for i := 1 to k do
   begin
    if pilki[i].Top > 402 then
      if (pilki[i].Left >= Belka.Left) and (pilki[i].Left <= Belka.Left + 70) then
        begin
         Inc(punkty);
         Edit1.Text := IntToStr(punkty);
         poziom := (punkty div 10) + 1;

         Edit2.Text := IntToStr(poziom);
         pilki[i].Visible := False;
         Dec(iloscpilek);

         if poziom = 11 then
           begin
            Edit2.Text := 'koniec';
            Panel2.Caption := 'wynik = ' + Edit1.Text;
            gra := False;
           end;
        end
      else
        begin
         for j := 3 downto zycia do szanse[j].Brush.Color := clMedGray;

         Dec(zycia);
         if zycia = 0 then
           begin
            gra := False;
            Panel2.Caption := 'przegrales';
           end;

         pilki[i].Visible := False;
         Dec(iloscpilek);
        end;
   end;
end;

end.
0

DZIĘKI WIELKIE ZA TA POMOC program dziala, ale dalej nie leca naprzyklad dwie pilki na 3 poziomie lub 3 na 6 poziomie, a glownie o to mi chodzilo bo nie wiem jak to zrobic zeby lecialy wiecej niz jedna na raz i byly zliczane punkty osobno jesli ktos wie jak to zrobic to prosze o dalsza pomoc:)

0

kod z objasnieniami przepraszam ze wczesniej ich nie podalem:/

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    zegar: TTimer;
    MainMenu1: TMainMenu;
    Opcje1: TMenuItem;
    Nowagra1: TMenuItem;
    Koniec1: TMenuItem;
    N1: TMenuItem;
    Panel1: TPanel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    zycie1: TShape;
    zycie2: TShape;
    zycie3: TShape;
    Shape1: TShape;
    belka: TShape;
    pilka3: TShape;
    pilka2: TShape;
    pilka5: TShape;
    pilka4: TShape;
    pilka6: TShape;
    pilka7: TShape;
    pilka9: TShape;
    pilka8: TShape;
    pilka1: TShape;
    pilka10: TShape;
    Panel2: TPanel;
    procedure fromcreate(sender: tobject);
    procedure Koniec1Click(Sender: TObject);
    procedure Nowagra1Click(Sender: TObject);
    procedure fromkeydown(sender:tobject; var key:word; shift: tshiftstate);
    procedure zegarTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  punkty, poziom, zycia, p: Integer;
  iloscpilek: SmallInt = 0;    //przdzial od -30000 do 30000
  gra: Boolean = False;
  pilki: array [1..10] of tshape;
  szanse:array [1..3] of tshape;

implementation

{$R *.dfm}

procedure TForm1.FromCreate(Sender: TObject);
begin
 punkty := 0;
 poziom := 0;
 zycia  := 3;

 szanse[1] := zycie1;
 szanse[2] := zycie2;
 szanse[3] := zycie3;

 pilki[1]  := pilka1;
 pilki[2]  := pilka2;
 pilki[3]  := pilka3;
 pilki[4]  := pilka4;
 pilki[5]  := pilka5;
 pilki[6]  := pilka6;
 pilki[7]  := pilka7;
 pilki[8]  := pilka8;
 pilki[9]  := pilka9;
 pilki[10] := pilka10;
end;

procedure TForm1.FromKeydown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if not Gra then Exit;

 if Key = Vk_Left then
   begin
    if Belka.Left - 5 > 7 then Belka.Left := Belka.Left - 15
    else Belka.Left := 8;
   end
 else
 if Key = Vk_Right then
   begin
    if Belka.Left + 5 < 233 then Belka.Left := Belka.Left + 15
    else Belka.Left := 235;
   end;
end;

procedure TForm1.Koniec1Click(Sender: TObject);
begin
 Close();
end;

procedure TForm1.Nowagra1Click(Sender: TObject);
begin
 punkty := 0;
 poziom := 1;
 zycia  := 3;
 iloscpilek := 0;
 gra := True;
 szanse[1] := zycie1;
 szanse[2] := zycie2;
 szanse[3] := zycie3;
 zycie1.Brush.Color := clFuchsia;
 zycie2.Brush.Color := clFuchsia;
 zycie3.Brush.Color := clFuchsia;
 Edit1.Text := '0';
 Edit2.Text := '1';
 pilki[1]  := pilka1;
 pilki[2]  := pilka2;
 pilki[3]  := pilka3;
 pilki[4]  := pilka4;
 pilki[5]  := pilka5;
 pilki[6]  := pilka6;
 pilki[7]  := pilka7;
 pilki[8]  := pilka8;
 pilki[9]  := pilka9;
 pilki[10] := pilka10;
 Form1.SetFocus;
 Panel2.Caption := 'Grasz';
end;

procedure TForm1.zegarTimer(Sender: TObject);
var
 i, j, k: Integer;
begin
//dodanie nowej piłki – ilość piłek rowna jest aktualnemu poziomowi

 if (zycia > 0) and (gra) then

   if iloscpilek < poziom then
     begin
      poziom := 1;
      p := 4;
//wyświetlenie piłki

      Inc(iloscpilek);
      pilki[iloscpilek].Visible := True;
//ustawienie jej pozycji początkowej – gorna krawędź okna gry

      pilki[iloscpilek].Top  := 80;
//wylosowanie pozycji startowej

      pilki[iloscpilek].Left := (pilki[iloscpilek].Left + Random(285)) mod 285 + 10;

      end;

 for i := 1 to iloscpilek do
   begin
//poruszanie (opadanie) piłek – prędkość poruszania


    pilki[i].Top := pilki[i].Top + p shr 2; //div 4;

    case punkty of
     10..19: p := 6;
     20..29: p := 7;
     30..39: p := 9;
     40..49: p := 11;
     50..59: p := 13;
     60..69: p := 16;
     70..79: p := 18;
     80..89: p := 20;
     else
     if punkty > 89 then p := 22;
    end;

//sprawdzanie pozycji piłek i obliczanie punktow

 k := iloscpilek;
 for i := 1 to k do
   begin
    if pilki[i].Top > 402 then
//badanie czy piłka przekroczyła granicę naliczania punktow

      if (pilki[i].Left >= Belka.Left) and (pilki[i].Left <= Belka.Left + 70) then
        begin
//trafiono w belkę - zdobyto punkt

         Inc(punkty);
         Edit1.Text := IntToStr(punkty);
         poziom := (punkty div 10) + 1;

         Edit2.Text := IntToStr(poziom);
         pilki[i].Visible := False;
         Dec(iloscpilek);              // odejmowanie -1

         if poziom = 11 then
           begin
            Edit2.Text := 'koniec';
            Panel2.Caption := 'wynik = ' + Edit1.Text;
            gra := False;
           end;
        end
      else
//nie trafiono w piłkę - strata szansy

        begin
         for j := 3 downto zycia do szanse[j].Brush.Color := clMedGray;

         Dec(zycia);
         if zycia = 0 then
           begin
            gra := False;
            Panel2.Caption := 'przegrales';
           end;

         pilki[i].Visible := False;
         Dec(iloscpilek);
        end;
   end;
end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1