Autor Beitrag
speck12
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 21.07.08 21:10 
Hallo allerseits!

ich versuche zur Zeit einen Tetrisklon zu schreiben. Jetzt habe ich allerdings ein Problem.
Die Steine werden in einem Array[1..4,1..4] dargestellt. Das Spielfeld in einem Array[1..24,1..32]. Jetzt meine ich allerdings einen Denkfehler bei der Verknüpfung beider zu haben, da

{1. Die Steine gepiegelt und gedreht gezeigt werden} hat sich erledigt !
2. Nicht bis nach unten fallen, sondern nur bis zum 24. Kästchen und dann um eins nach rechts wandern, obwohl
nur der y-Wert erhöht wird


Außerdem scheint irgendwas mit dem Intervall des Timers nicht zu stimmen, denn anfangs macht es keinen unterschied, ob ich ihn auf 1000ms oder 200ms stelle. Erst wenn ich einmal auf 10ms und dann auf 200ms stelle, zeigt sich ein Unterschied.

hier der Code der Tetris_unit :

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
unit tetris_unit;

interface

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


type
    TTetris = class(TObject)
               color : TColor;
               typ   : integer;
               position : integer;
               a : Array[1..4,1..4of Boolean;  {darstellung}
               constructor Create(Farben : TColor);
               procedure Rotate; virtual ;
               Destructor Destroy(); override;
              end;

    TTetris1 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris2 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris3 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris4 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;
    TTetris5 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris6 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris7 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;



implementation

constructor TTetris.Create(Farben : TColor);
 begin
  Inherited Create;
  color := Farben ;
  typ := 0;
  position := 0;

 end;

procedure TTetris.Rotate;
 begin
  //
 end;

destructor TTetris.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris1.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 1;

     a[1,1] := false; a[2,1] := false; a[3,1] := false; a[4,1] := false;    {oooo}
     a[1,2] := TRUE ; a[2,2] := TRUE ; a[3,2] := false; a[4,2] := false;    {xxoo}
     a[1,3] := TRUE ; a[2,3] := TRUE ; a[3,3] := false; a[4,3] := false;    {xxoo}
     a[1,4] := false; a[2,4] := false; a[3,4] := false; a[4,4] := false;    {oooo}

 end;

procedure TTetris1.Rotate;
 begin
  //
 end;

destructor TTetris1.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris2.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 2;

    a[1,1] := false; a[1,2] := false; a[1,3] := false; a[1,4] := false;    {oooo}
    a[2,1] := false; a[2,2] := TRUE ; a[2,3] := false; a[2,4] := false;    {oxoo}
    a[3,1] := TRUE ; a[3,2] := TRUE ; a[3,3] := TRUE ; a[3,4] := false;    {xxxo}
    a[4,1] := false; a[4,2] := false; a[4,3] := false; a[4,4] := false;    {oooo}

 end;

procedure TTetris2.Rotate;
 begin
  //
 end;

destructor TTetris2.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris3.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 3 ;

    a[1,1] := false; a[1,2] := TRUE ; a[1,3] := false; a[1,4] := false;    {oxoo}
    a[2,1] := false; a[2,2] := TRUE ; a[2,3] := false; a[2,4] := false;    {oxoo}
    a[3,1] := TRUE ; a[3,2] := TRUE ; a[3,3] := false; a[3,4] := false;    {xxoo}
    a[4,1] := false; a[4,2] := false; a[4,3] := false; a[4,4] := false;    {oooo}
 end;

procedure TTetris3.Rotate;
 begin
  //
 end;

destructor TTetris3.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris4.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 4;

    a[1,1] := false; a[1,2] := TRUE ; a[1,3] := false; a[1,4] := false;    {oxoo}
    a[2,1] := false; a[2,2] := TRUE ; a[2,3] := false; a[2,4] := false;    {oxoo}
    a[3,1] := false; a[3,2] := TRUE ; a[3,3] := TRUE ; a[3,4] := false;    {oxxo}
    a[4,1] := false; a[4,2] := false; a[4,3] := false; a[4,4] := false;    {oooo}
 end;

procedure TTetris4.Rotate;
 begin
  //
 end;

destructor TTetris4.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris5.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 5;

    a[1,1] := false; a[1,2] := TRUE ; a[1,3] := false; a[1,4] := false;    {oxoo}
    a[2,1] := false; a[2,2] := TRUE ; a[2,3] := false; a[2,4] := false;    {oxoo}
    a[3,1] := false; a[3,2] := TRUE ; a[3,3] := false; a[3,4] := false;    {oxoo}
    a[4,1] := false; a[4,2] := TRUE ; a[4,3] := false; a[4,4] := false;    {oxoo}
 end;

procedure TTetris5.Rotate;
 begin
  //
 end;

destructor TTetris5.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris6.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 6;

    a[1,1] := false; a[1,2] := false; a[1,3] := false; a[1,4] := false;    {oooo}
    a[2,1] := false; a[2,2] := TRUE ; a[2,3] := TRUE ; a[2,4] := false;    {oxxo}
    a[3,1] := TRUE ; a[3,2] := TRUE ; a[3,3] := false; a[3,4] := false;    {xxoo}
    a[4,1] := false; a[4,2] := false; a[4,3] := false; a[4,4] := false;    {oooo}
 end;

procedure TTetris6.Rotate;
 begin
  //
 end;

destructor TTetris6.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris7.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 7;

    a[1,1] := false; a[1,2] := false; a[1,3] := false; a[1,4] := false;    {oooo}
    a[2,1] := TRUE ; a[2,2] := TRUE ; a[2,3] := false; a[2,4] := false;    {xxoo}
    a[3,1] := false; a[3,2] := TRUE ; a[3,3] := TRUE ; a[3,4] := false;    {oxxo}
    a[4,1] := false; a[4,2] := false; a[4,3] := false; a[4,4] := false;    {oooo}
 end;

procedure TTetris7.Rotate;
 begin
  //
 end;

destructor TTetris7.Destroy;
 begin
  Inherited Destroy;
 end;

end.


und hier der main unit:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    feld: TImage;
    Timer1: TTimer;
    Button1: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
   Steinliste : TList;
   Spielfeld : Array[1..32,1..24]  of integer;
   y : integer;
   buffer : TBitmap;
   procedure zeichne_spielfeld;
   procedure buffering;
   procedure zufall;
   procedure bewegen;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.zeichne_spielfeld;
 begin
  feld.Canvas.Draw(0,0,buffer);
 end;

procedure TForm1.zufall;
 var n,i : integer;
    farbe : TColor;
  begin

   randomize;
   n := random(7) + 1;
   farbe := random($ffffff);

    case n of
     1: Steinliste.Add(TTetris1.Create(farbe));
     2: Steinliste.Add(TTetris2.Create(farbe));
     3: Steinliste.Add(TTetris3.Create(farbe));
     4: Steinliste.Add(TTetris4.Create(farbe));
     5: Steinliste.Add(TTetris5.Create(farbe));
     6: Steinliste.Add(TTetris6.Create(farbe));
     7: Steinliste.Add(TTetris7.Create(farbe));
    end;

   for i := 0 to Steinliste.Count -1 do
    TTetris(Steinliste.Items[i]).position := random(21) +1;

  end;


procedure TForm1.buffering;
var m,n : integer;
 begin
  with buffer do
   begin
    Height := 640;
    Width  := 480;

    Canvas.Brush.Color := clCream;

    Canvas.Pen.Color := clBlack;

    for n := 1 to 32 do
     for m := 1 to 24 do
      begin
       Canvas.Rectangle((m-1)*20,(n-1)*20,m*20,n*20);
      end;
   end;
 end;


procedure TForm1.bewegen;
 var i,m,n : integer;
  begin
    with TTetris(Steinliste.Items[0]) do
     begin

      if a[1,1then spielfeld[TTetris(Steinliste.Items[0]).position,y] := 1;
      if a[1,2then spielfeld[TTetris(Steinliste.Items[0]).position,y+1] := 1;
      if a[1,3then spielfeld[TTetris(Steinliste.Items[0]).position,y+2] := 1;
      if a[1,4then spielfeld[TTetris(Steinliste.Items[0]).position,y+3] := 1;

      if a[2,1then spielfeld[TTetris(Steinliste.Items[0]).position+1,y] := 1;
      if a[2,2then spielfeld[TTetris(Steinliste.Items[0]).position+1,y+1] := 1;
      if a[2,3then spielfeld[TTetris(Steinliste.Items[0]).position+1,y+2] := 1;
      if a[2,4then spielfeld[TTetris(Steinliste.Items[0]).position+1,y+3] := 1;

      if a[3,1then spielfeld[TTetris(Steinliste.Items[0]).position+2,y] := 1;
      if a[3,2then spielfeld[TTetris(Steinliste.Items[0]).position+2,y+1] := 1;
      if a[3,3then spielfeld[TTetris(Steinliste.Items[0]).position+2,y+2] := 1;
      if a[3,4then spielfeld[TTetris(Steinliste.Items[0]).position+2,y+3] := 1;

      if a[4,1then spielfeld[TTetris(Steinliste.Items[0]).position+3,y] := 1;
      if a[4,2then spielfeld[TTetris(Steinliste.Items[0]).position+3,y+1] := 1;
      if a[4,3then spielfeld[TTetris(Steinliste.Items[0]).position+3,y+2] := 1;
      if a[4,4then spielfeld[TTetris(Steinliste.Items[0]).position+3,y+3] := 1;

     end;

    buffering;

    with buffer do
     begin
      Canvas.Brush.Color := TTetris(Steinliste.Items[0]).color;
      Canvas.Pen.Color := clBlack;

      for n := 1 to 32 do
       for m := 1 to 24 do
        begin
         if spielfeld[m,n] = 1 then
          begin
           Canvas.Rectangle((m-1)*20,(n-1)*20,m*20,n*20);
           spielfeld[m,n] := 0;
          end;
        end;
     end;
  end;





procedure TForm1.FormCreate(Sender: TObject);
 begin
  y := 0;
  Steinliste := TList.Create;
  buffer := TBitmap.Create;
  buffering;
  zeichne_spielfeld;
  zufall;
 end;

procedure TForm1.Timer1Timer(Sender: TObject);
 begin
  Inc(y);
  bewegen;
  zeichne_spielfeld;
 end;

procedure TForm1.Button1Click(Sender: TObject);
 begin
  timer1.Enabled := true;
 end;

end.


evlt liegt das Problem aber auch an etwas komplett anderem.

habe hier noch die exe angefügt, damit ihr seht, was ich meine.
Veilleicht sieht jemand den Fehler..
Danke im Vorraus

--- EDIT: ---

mittlerweilte habe ich das Problem mit den verdrehten Steinen in den Griff bekommen.
Ein Beispiel:

ich habe diesen Stein: 0000
0x00
xxx0
0000

und möchte ihn in einem Array[1..4,1..4] of Boolean darstellen, so muss ich es folgenderweise machen:

a[1,1] := false; a[2,1] := false; a[3,1] := false; a[4,1] := false;
a[1,2] := false; a[2,2] := TRUE ; a[3,2] := false; a[4,2] := false;
a[1,3] := TRUE ; a[2,3] := TRUE ; a[3,3] := true ; a[4,3] := false;
a[1,4] := false; a[2,4] := false; a[3,4] := false; a[4,4] := false;

hier nun die neuen codes zum Vergleich

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    feld: TImage;
    Timer1: TTimer;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    StringGrid1: TStringGrid;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
   Steinliste : TList;
   Spielfeld : Array[1..32,1..24]  of integer;
   y : integer;
   buffer : TBitmap;
   procedure zeichne_spielfeld;
   procedure buffering;

   procedure zufall;
   procedure bewegen;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.zeichne_spielfeld;
 begin
  feld.Canvas.Draw(0,0,buffer);
 end;

procedure TForm1.zufall;
 var n,i : integer;
    farbe : TColor;
  begin

   randomize;
   n := random(7) + 1;
   //n := 2;

   farbe := random($ffffff);

    case n of
     1: Steinliste.Add(TTetris1.Create(farbe));
     2: Steinliste.Add(TTetris2.Create(farbe));
     3: Steinliste.Add(TTetris3.Create(farbe));
     4: Steinliste.Add(TTetris4.Create(farbe));
     5: Steinliste.Add(TTetris5.Create(farbe));
     6: Steinliste.Add(TTetris6.Create(farbe));
     7: Steinliste.Add(TTetris7.Create(farbe));
    end;

   for i := 0 to Steinliste.Count -1 do
    TTetris(Steinliste.Items[i]).position := random(21) +1;

  end;


procedure TForm1.buffering;
var m,n : integer;
 begin
  with buffer do
   begin
    Height := 640;
    Width  := 480;

    Canvas.Brush.Color := clCream;
    Canvas.Pen.Color := clBlack;

    for n := 1 to 32 do
     for m := 1 to 24 do
      begin
       Canvas.Rectangle((m-1)*20,(n-1)*20,m*20,n*20);
      end;
   end;
 end;


procedure TForm1.bewegen;
 var m,n : integer;
  begin
    with TTetris(Steinliste.Items[0]) do
     begin

      if a[1,1then spielfeld[TTetris(Steinliste.Items[0]).position,y] := 1;
      if a[1,2then spielfeld[TTetris(Steinliste.Items[0]).position,y+1] := 1;
      if a[1,3then spielfeld[TTetris(Steinliste.Items[0]).position,y+2] := 1;
      if a[1,4then spielfeld[TTetris(Steinliste.Items[0]).position,y+3] := 1;

      if a[2,1then spielfeld[TTetris(Steinliste.Items[0]).position+1,y] := 1;
      if a[2,2then spielfeld[TTetris(Steinliste.Items[0]).position+1,y+1] := 1;
      if a[2,3then spielfeld[TTetris(Steinliste.Items[0]).position+1,y+2] := 1;
      if a[2,4then spielfeld[TTetris(Steinliste.Items[0]).position+1,y+3] := 1;

      if a[3,1then spielfeld[TTetris(Steinliste.Items[0]).position+2,y] := 1;
      if a[3,2then spielfeld[TTetris(Steinliste.Items[0]).position+2,y+1] := 1;
      if a[3,3then spielfeld[TTetris(Steinliste.Items[0]).position+2,y+2] := 1;
      if a[3,4then spielfeld[TTetris(Steinliste.Items[0]).position+2,y+3] := 1;

      if a[4,1then spielfeld[TTetris(Steinliste.Items[0]).position+3,y] := 1;
      if a[4,2then spielfeld[TTetris(Steinliste.Items[0]).position+3,y+1] := 1;
      if a[4,3then spielfeld[TTetris(Steinliste.Items[0]).position+3,y+2] := 1;
      if a[4,4then spielfeld[TTetris(Steinliste.Items[0]).position+3,y+3] := 1;

     end;

    buffering;

    with buffer do
     begin
      Canvas.Brush.Color := TTetris(Steinliste.Items[0]).color;
      Canvas.Pen.Color := clBlack;

      for n := 1 to 32 do
       for m := 1 to 24 do
        begin
         if spielfeld[m,n] = 1 then
          begin
           Canvas.Rectangle((m-1)*20,(n-1)*20,m*20,n*20);
           Edit2.Text := IntToStr(m);
           Edit1.Text := IntToStr(y);
           spielfeld[m,n] := 0;
          end;
        end;
     end;
  end;





procedure TForm1.FormCreate(Sender: TObject);
 begin
  y := 0;
  Steinliste := TList.Create;
  buffer := TBitmap.Create;
  buffering;
  zeichne_spielfeld;
  zufall;
 end;

procedure TForm1.Timer1Timer(Sender: TObject);
 begin
  Inc(y);
  bewegen;
  zeichne_spielfeld;
 end;

procedure TForm1.Button1Click(Sender: TObject);
 begin
  timer1.Enabled := true;
 end;

procedure TForm1.Button2Click(Sender: TObject);
var m,n : integer;
 begin
  Edit1.Text := IntToStr(TTetris(Steinliste.Items[0]).typ);
  for m := 1 to 4 do
   for n := 1 to 4 do
    if TTetris(Steinliste.Items[0]).a[m,n] then Stringgrid1.Cells[m-1,n-1] := 'x';

 end;

end.


und

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
unit tetris_unit;

interface

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


type
    TTetris = class(TObject)
               color : TColor;
               typ   : integer;
               position : integer;
               a : Array[1..4,1..4of Boolean;  {darstellung}
               constructor Create(Farben : TColor);
               procedure Rotate; virtual ;
               Destructor Destroy(); override;
              end;

    TTetris1 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris2 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris3 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris4 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;
    TTetris5 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris6 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;

    TTetris7 = class(TTetris)
                constructor Create(Farbe : TColor);
                procedure Rotate; override ;
                Destructor Destroy(); override;
               end;



implementation

constructor TTetris.Create(Farben : TColor);
 begin
  Inherited Create;
  color := Farben ;
  typ := 0;
  position := 0;

 end;

procedure TTetris.Rotate;
 begin
  //
 end;

destructor TTetris.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris1.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 1;

     a[1,1] := false; a[2,1] := false; a[3,1] := false; a[4,1] := false;    {oooo}
     a[1,2] := TRUE ; a[2,2] := TRUE ; a[3,2] := false; a[4,2] := false;    {xxoo}
     a[1,3] := TRUE ; a[2,3] := TRUE ; a[3,3] := false; a[4,3] := false;    {xxoo}
     a[1,4] := false; a[2,4] := false; a[3,4] := false; a[4,4] := false;    {oooo}

 end;

procedure TTetris1.Rotate;
 begin
  //
 end;

destructor TTetris1.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris2.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 2;

    a[1,1] := false; a[2,1] := false; a[3,1] := false; a[4,1] := false;    {oooo}
    a[1,2] := false; a[2,2] := TRUE ; a[3,2] := false; a[4,2] := false;    {oxoo}
    a[1,3] := TRUE ; a[2,3] := TRUE ; a[3,3] := TRUE ; a[4,3] := false;    {xxxo}
    a[1,4] := false; a[2,4] := false; a[3,4] := false; a[4,4] := false;    {oooo}

 end;

procedure TTetris2.Rotate;
 begin
  //
 end;

destructor TTetris2.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris3.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 3 ;

    a[1,1] := false; a[2,1] := TRUE ; a[3,1] := false; a[4,1] := false;    {oxoo}
    a[1,2] := false; a[2,2] := TRUE ; a[3,2] := false; a[4,2] := false;    {oxoo}
    a[1,3] := TRUE ; a[2,3] := TRUE ; a[3,3] := false; a[4,3] := false;    {xxoo}
    a[1,4] := false; a[2,4] := false; a[3,4] := false; a[4,4] := false;    {oooo}
 end;

procedure TTetris3.Rotate;
 begin
  //
 end;

destructor TTetris3.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris4.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 4;

    a[1,1] := false; a[2,1] := TRUE ; a[3,1] := false; a[4,1] := false;    {oxoo}
    a[1,2] := false; a[2,2] := TRUE ; a[3,2] := false; a[4,2] := false;    {oxoo}
    a[1,3] := false; a[2,3] := TRUE ; a[3,3] := TRUE ; a[4,3] := false;    {oxxo}
    a[1,4] := false; a[2,4] := false; a[3,4] := false; a[4,4] := false;    {oooo}
 end;

procedure TTetris4.Rotate;
 begin
  //
 end;

destructor TTetris4.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris5.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 5;

    a[1,1] := false; a[2,1] := TRUE ; a[3,1] := false; a[4,1] := false;    {oxoo}
    a[1,2] := false; a[2,2] := TRUE ; a[3,2] := false; a[4,2] := false;    {oxoo}
    a[1,3] := false; a[2,3] := TRUE ; a[3,3] := false; a[4,3] := false;    {oxoo}
    a[1,4] := false; a[2,4] := TRUE ; a[3,4] := false; a[4,4] := false;    {oxoo}
 end;

procedure TTetris5.Rotate;
 begin
  //
 end;

destructor TTetris5.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris6.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 6;

    a[1,1] := false; a[2,1] := false; a[3,1] := false; a[4,1] := false;    {oooo}
    a[1,2] := false; a[2,2] := TRUE ; a[3,2] := TRUE ; a[4,2] := false;    {oxxo}
    a[1,3] := TRUE ; a[2,3] := TRUE ; a[3,3] := false; a[4,3] := false;    {xxoo}
    a[1,4] := false; a[2,4] := false; a[3,4] := false; a[4,4] := false;    {oooo}
 end;

procedure TTetris6.Rotate;
 begin
  //
 end;

destructor TTetris6.Destroy;
 begin
  Inherited Destroy;
 end;

constructor TTetris7.Create(Farbe : TColor);
 begin
  Inherited Create(Farbe);
  typ := 7;

    a[1,1] := false; a[2,1] := false; a[3,1] := false; a[4,1] := false;    {oooo}
    a[1,2] := TRUE ; a[2,2] := TRUE ; a[3,2] := false; a[4,2] := false;    {xxoo}
    a[1,3] := false; a[2,3] := TRUE ; a[3,3] := TRUE ; a[4,3] := false;    {oxxo}
    a[1,4] := false; a[2,4] := false; a[3,4] := false; a[4,4] := false;    {oooo}
 end;

procedure TTetris7.Rotate;
 begin
  //
 end;

destructor TTetris7.Destroy;
 begin
  Inherited Destroy;
 end;

end.


die zwei anderen Probleme bestehen allerdings noch immer... :(

mfg

Moderiert von user profile iconNarses: Trennzeile aus Underscores entfernt
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 22.07.08 10:41 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
with TTetris(Steinliste.Items[0]) do  
     begin  
       if a[1,1then spielfeld[TTetris(Steinliste.Items[0]).position,y] := 1;
       ...
     end

Erstens solltest du dafür eine Schleife verwenden und zweitens solltest du die y-Position überprüfen, bevor du darein schreibst. (Ich hoffe, du weißt, wie intern Arrays im Speicher abgelegt werden und kannst darauf schließen, warum deine Steine nach rechts rücken!)

und drittens:
wenn du schon "with ... do" benutzt, dann solltest du dies auch nutzen...

Du solltest auch noch mal deine Spielfeld-Logik überdenken, denn es ist schlecht, wenn nach jeder Bewegung das Spielfeld wieder gelöscht wird (weil dann keine Steine unten liegen bleiben...)

Und der Hauptfehler bei deinem Programm:
Du solltest GUI und Logik strikt voneinander trennen... (also keine Mischmasch-Funktionen bzw. -Prozeduren wie z.B. bewegen. Erzeuge dir lieber eine eigene Klasse für die Tetris-Logik).
speck12 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Di 22.07.08 13:08 
hi
vielen Dank für deine Antwort! :)

Zweitens und drittens werd ich auf jeden Fall mal berücksichtigen.

Zitat:
(Ich hoffe, du weißt, wie intern Arrays im Speicher abgelegt werden und kannst darauf schließen, warum deine Steine nach rechts rücken!)


Hier liegt wohl mein Problem, da ich leider nicht weiß, wie diese im Speicher abgelegt werden...
Kann mir das evtl jemand erklären oder kennt jemand ein gutes Tutorial zu diesem Thema?

danke und mfg
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 22.07.08 17:27 
Kannst du mal bei Projekt --> Optionen --> Compiler die "Bereichsüberpfüfung" einschalten? (hoffe die ist dort; bei Delphi 7 jednefallsch schon ;) ). Das von dir beschriebene Verhalten tritt eigentlich meistens auf wenn man den Bereich eines Arrays verletzt.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
speck12 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Di 22.07.08 18:34 
Hi

also ich habe die Bereichsüberprüfung eingeschaltet (habe auch delphi 7), jedoch kommt da keine meldung. Oder muss ich dann noch wo anders nachschauen?

mfg
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 22.07.08 22:06 
evetuell irgtendwas am code ändern und dann neucompilieren, bei mir wirken sich schalter oft erst aus wenn ich was am code geändert habe - delphi ist da manchmal estwas langsam. wenn dann nix kommt lags halt an was anderem ^^

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)