Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations) (download) (as text)
Fri Jul 10 00:31:32 2015 UTC (8 years, 9 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 25385 byte(s)
ぷよぷよでは2つ一組で落下してくるところを4つにしました

斜めの連鎖判定も出しています

おかげで面白く無いかもしれません

AIの部分はまだ詰めていませんがイベント化しました
1 yamat0jp 1 unit Unit1;
2    
3     interface
4    
5     uses
6     Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
7     System.Classes, Vcl.Graphics,
8     Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.AppEvnts, Vcl.Menus;
9    
10     const
11     Count = 4;
12     Size = 16;
13     Wid = 10;
14     Hei = 15;
15    
16     pos_X = Wid div 2;
17     pos_Y = 0;
18    
19     type
20     TBall = class(TObject)
21     public
22     X, Y: integer;
23     Color: TColor;
24     Index: integer;
25     constructor Craete;
26     end;
27    
28     TItem = class(TObject)
29     private
30     function GetColors(X: integer): TBall;
31     procedure SetColors(X: integer; const Value: TBall);
32     procedure SetLeft(const Value: integer);
33     procedure SetTop(const Value: integer);
34     function GetLeft: integer;
35     protected
36     FColors: array [0 .. Count - 1] of TBall;
37     public
38     Horizontal: Boolean;
39     Visible: Boolean;
40     constructor Create;
41     destructor Destroy; override;
42     procedure Clean;
43     procedure Assign(Source: TItem);
44     property Colors[X: integer]: TBall read GetColors write SetColors;
45     property Left: integer read GetLeft write SetLeft;
46     property Top: integer write SetTop;
47     end;
48    
49     TGround = class(TObject)
50     private
51     function GetStrings(X, Y: integer): TBall;
52     procedure SetStrings(X, Y: integer; const Value: TBall);
53     protected
54     FStrings: array [0 .. Wid - 1, 0 .. Hei - 1] of TBall;
55     public
56     Left, Top: integer;
57     constructor Create;
58     destructor Destroy; override;
59     procedure Clean;
60     procedure Assign(Source: TGround);
61     property Strings[X, Y: integer]: TBall read GetStrings
62     write SetStrings; default;
63     end;
64    
65     TState = (Down, Shoot, Sys, Stop, Ojama, Effect);
66    
67     TDirector = (Under, Left, Right);
68    
69     TOjamaEvent = procedure(Sender: TObject; Count: integer) of object;
70    
71     TGameParam = record
72     Rensa: integer;
73     Kazu: integer;
74     Group: integer;
75     end;
76    
77     TScoreEvent = procedure(Sender: TObject; const GameParam: TGameParam;
78     var Score: integer) of object;
79    
80     TPlayer = class(TObject)
81     private
82     Test: TItem;
83     FOnCreateOjama: TOjamaEvent;
84     BackGround: Boolean;
85     FOnScoreEvent: TScoreEvent;
86     function Check(aItem: TItem): Boolean;
87     public
88     Temp: TItem;
89     Item: TItem;
90     Ground: TGround;
91     State: TState;
92     Com: Boolean;
93     Score: integer;
94     OjamaList: TList;
95     OjamaColor: TColor;
96     EffectCount: integer;
97     GameParam: TGameParam;
98     constructor Create;
99     destructor Destroy; override;
100     procedure Start(const Resume: Boolean = false);
101     procedure Execute;
102     procedure Think;
103     procedure Make(aCount: integer);
104     procedure OjamaClean;
105     function Remove: Boolean;
106     function Move(Dir: TDirector): Boolean;
107     function Turn(const Right: Boolean = true): Boolean;
108     function Drop: Boolean;
109     function Zenkesi: Boolean;
110     property OnCreateOjama: TOjamaEvent read FOnCreateOjama
111     write FOnCreateOjama;
112     property OnScore: TScoreEvent read FOnScoreEvent write FOnScoreEvent;
113     end;
114    
115     TForm1 = class(TForm)
116     ApplicationEvents1: TApplicationEvents;
117     MainMenu1: TMainMenu;
118     Game1: TMenuItem;
119     Start1: TMenuItem;
120     N1: TMenuItem;
121     Close1: TMenuItem;
122     Com1: TMenuItem;
123     Player11: TMenuItem;
124     Player21: TMenuItem;
125     procedure FormCreate(Sender: TObject);
126     procedure FormDestroy(Sender: TObject);
127     procedure FormPaint(Sender: TObject);
128     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
129     procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
130     procedure Player11Click(Sender: TObject);
131     procedure Start1Click(Sender: TObject);
132     procedure Close1Click(Sender: TObject);
133     private
134     { Private ���� }
135     Buffer: TBitmap;
136     TextMessage: string;
137     public
138     { Public ���� }
139     Player1, Player2: TPlayer;
140     Rensa: TThread;
141     procedure CreateOjama(Sender: TObject; aCount: integer);
142     procedure PlayerScore(Sender: TObject; const GameParam: TGameParam;
143     var Score: integer);
144     end;
145    
146     var
147     Form1: TForm1;
148    
149     implementation
150    
151     {$R *.dfm}
152    
153     uses Unit2;
154    
155     { TBall }
156    
157     constructor TBall.Craete;
158     begin
159     inherited;
160     Color := clWhite;
161     end;
162    
163     { TItem }
164    
165     procedure TItem.Assign(Source: TItem);
166     var
167     i: integer;
168     begin
169     Horizontal := Source.Horizontal;
170     for i := 0 to Count - 1 do
171     begin
172     FColors[i].Color := Source.Colors[i].Color;
173     FColors[i].X := Source.Colors[i].X;
174     FColors[i].Y := Source.Colors[i].Y;
175     end;
176     end;
177    
178     procedure TItem.Clean;
179     var
180     i, j: integer;
181     begin
182     Horizontal := false;
183     Randomize;
184     for i := 0 to Count - 1 do
185     begin
186     FColors[i].X := pos_X;
187     FColors[i].Y := pos_Y + i;
188     j := Random(5);
189     case j of
190     0:
191     FColors[i].Color := clRed;
192     1:
193     FColors[i].Color := clBlue;
194     2:
195     FColors[i].Color := clYellow;
196     3:
197     FColors[i].Color := clGreen;
198     4:
199     FColors[i].Color := clPurple;
200     end;
201     end;
202     end;
203    
204     constructor TItem.Create;
205     var
206     i: integer;
207     begin
208     inherited;
209     for i := 0 to Count - 1 do
210     FColors[i] := TBall.Craete;
211     Clean;
212     end;
213    
214     destructor TItem.Destroy;
215     var
216     i: integer;
217     begin
218     for i := 0 to Count - 1 do
219     FColors[i].Free;
220     inherited;
221     end;
222    
223     function TItem.GetColors(X: integer): TBall;
224     begin
225     result := FColors[X];
226     end;
227    
228     function TItem.GetLeft: integer;
229     begin
230     if Horizontal = true then
231     result := Colors[0].X
232     else
233     result := Colors[Count - 1].X;
234     end;
235    
236     procedure TItem.SetColors(X: integer; const Value: TBall);
237     begin
238     FColors[X] := Value;
239     end;
240    
241     procedure TItem.SetLeft(const Value: integer);
242     var
243     i: integer;
244     j: integer;
245     begin
246     j := Value - Colors[0].X;
247     for i := 0 to Count - 1 do
248     Colors[i].X := Colors[i].X + j;
249     end;
250    
251     procedure TItem.SetTop(const Value: integer);
252     var
253     i: integer;
254     j: integer;
255     begin
256     j := Value - Colors[0].Y;
257     for i := 0 to Count - 1 do
258     Colors[i].Y := Colors[i].Y + j;
259     end;
260    
261     { TGround }
262    
263     procedure TGround.Assign(Source: TGround);
264     var
265     i: integer;
266     j: integer;
267     begin
268     for i := 0 to Wid - 1 do
269     for j := 0 to Hei - 1 do
270     begin
271     Strings[i, j].Color := Source[i, j].Color;
272     Strings[i, j].Index := Source[i, j].Index;
273     end;
274     end;
275    
276     procedure TGround.Clean;
277     var
278     i: integer;
279     j: integer;
280     begin
281     for i := 0 to Wid - 1 do
282     for j := 0 to Hei - 1 do
283     FStrings[i, j].Color := clWhite;
284     end;
285    
286     constructor TGround.Create;
287     var
288     i: integer;
289     j: integer;
290     begin
291     inherited;
292     for i := 0 to Wid - 1 do
293     for j := 0 to Hei - 1 do
294     FStrings[i, j] := TBall.Craete;
295     Clean;
296     end;
297    
298     destructor TGround.Destroy;
299     var
300     i: integer;
301     j: integer;
302     begin
303     for i := 0 to Wid - 1 do
304     for j := 0 to Hei - 1 do
305     FStrings[i, j].Free;
306     inherited;
307     end;
308    
309     function TGround.GetStrings(X, Y: integer): TBall;
310     begin
311     if (X < 0) or (Wid - 1 < X) or (Y < 0) or (Hei - 1 < Y) then
312     result := nil
313     else
314     result := FStrings[X, Y];
315     end;
316    
317     procedure TGround.SetStrings(X, Y: integer; const Value: TBall);
318     begin
319     FStrings[X, Y] := Value;
320     end;
321    
322     procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
323     begin
324     if Player1.State <> Stop then
325     begin
326     if Player2.State = Stop then
327     begin
328     TextMessage := 'Player1 WIN !!';
329     Player1.State := Stop;
330     end;
331     Player1.Execute;
332     Paint;
333     Done := false;
334     end
335     else if Player2.State <> Stop then
336     begin
337     TextMessage := 'Player2 WIN !!';
338     Player2.State := Stop;
339     end;
340     end;
341    
342     procedure TForm1.Close1Click(Sender: TObject);
343     begin
344     Close;
345     end;
346    
347     procedure TForm1.CreateOjama(Sender: TObject; aCount: integer);
348     begin
349     if Sender = Player1 then
350     Player2.Make(aCount)
351     else
352     Player1.Make(aCount);
353     end;
354    
355     procedure TForm1.FormCreate(Sender: TObject);
356     begin
357     Buffer := TBitmap.Create;
358     Player1 := TPlayer.Create;
359     Player2 := TPlayer.Create;
360     Player2.Ground.Left := Player1.Ground.Left + (Size + 2) * Wid;
361     Player1.OnCreateOjama := CreateOjama;
362     Player2.OnCreateOjama := CreateOjama;
363     Player1.OnScore := PlayerScore;
364     Player2.OnScore := PlayerScore;
365     Rensa := TRensa.Create;
366     Player1.Com := true; { ComPlay }
367     Player11.Checked := Player1.Com;
368     Player1.Start;
369     Buffer.Width := Player2.Ground.Left + Size * Wid;
370     Buffer.Height := Hei * Size;
371     Buffer.Canvas.Brush.Color := Color;
372     Buffer.Canvas.FillRect(Rect(0, 0, Buffer.Width, Buffer.Height));
373     Buffer.Canvas.Font.Style := [fsBold];
374     end;
375    
376     procedure TForm1.FormDestroy(Sender: TObject);
377     begin
378     Rensa.Terminate;
379     Rensa.WaitFor;
380     Rensa.Free;
381     Buffer.Free;
382     Player1.Free;
383     Player2.Free;
384     end;
385    
386     procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
387     Shift: TShiftState);
388     begin
389     if Key = VK_ESCAPE then
390     Close;
391     if (Player1.State = Stop) and (Player2.State = Stop) then
392     begin
393     Player1.Start(true);
394     Player2.Start(true);
395     Buffer.Canvas.Brush.Color := Color;
396     Buffer.Canvas.FillRect(Rect(0, 0, Buffer.Width, Buffer.Height));
397     Exit;
398     end;
399     if (Player1.State = Shoot) or (Player1.State = Ojama) then
400     Exit;
401     case Key of
402     VK_DOWN:
403     if Player1.State = Down then
404     Player1.State := Shoot;
405     VK_UP:
406     Player1.Turn;
407     VK_LEFT:
408     Player1.Move(TDirector.Left);
409     VK_RIGHT:
410     Player1.Move(Right);
411     end;
412     Paint;
413     end;
414    
415     procedure TForm1.FormPaint(Sender: TObject);
416     var
417     i: integer;
418     s: TGround;
419    
420     procedure GroundDraw;
421     var
422     i: integer;
423     j: integer;
424     procedure Small(X, Y: integer);
425     const
426     a = Size div 4;
427     begin
428     Buffer.Canvas.Ellipse(X - a, Y - a, X + a, Y + a);
429     end;
430    
431     begin
432     for i := 0 to Wid - 1 do
433     for j := 0 to Hei - 1 do
434     if s[i, j].Color <> clWhite then
435     begin
436     Buffer.Canvas.Brush.Color := s[i, j].Color;
437     if s[i, j].Index = -1 then
438     begin
439     Small(s.Left + i * Size, s.Top + j * Size);
440     Small(s.Left + (i + 1) * Size, s.Top + j * Size);
441     Small(s.Left + i * Size, s.Top + (j + 1) * Size);
442     Small(s.Left + (i + 1) * Size, s.Top + (j + 1) * Size);
443     Small(s.Left + i * Size + (Size div 2),
444     s.Top + j * Size + (Size div 2));
445     end
446     else
447     Buffer.Canvas.Ellipse(s.Left + i * Size, s.Top + j * Size,
448     s.Left + (i + 1) * Size, s.Top + (j + 1) * Size);
449     end;
450     end;
451    
452     procedure OjamaDraw(aPlayer: TPlayer);
453     var
454     i: integer;
455     t: TBall;
456     begin
457     if aPlayer.State <> Ojama then
458     Exit;
459     Buffer.Canvas.Brush.Color := clGray;
460     for i := 0 to aPlayer.OjamaList.Count - 1 do
461     begin
462     t := aPlayer.OjamaList[i];
463     Buffer.Canvas.Ellipse(s.Left + t.X * Size, s.Top + t.Y * Size,
464     s.Left + (t.X + 1) * Size, s.Top + (t.Y + 1) * Size);
465     end;
466     end;
467    
468     procedure ItemDraw(aItem: TItem);
469     var
470     k: integer;
471     begin
472     with aItem do
473     begin
474     if Visible = false then
475     Exit;
476     for k := 0 to Count - 1 do
477     begin
478     Buffer.Canvas.Brush.Color := Colors[k].Color;
479     Buffer.Canvas.Ellipse(s.Left + Colors[k].X * Size,
480     s.Top + Colors[k].Y * Size, s.Left + (Colors[k].X + 1) * Size,
481     s.Top + (Colors[k].Y + 1) * Size);
482     end;
483     end;
484     end;
485    
486     procedure Main;
487     begin
488     Buffer.Canvas.FillRect(Rect(s.Left, s.Top, s.Left + Wid * Size,
489     s.Top + Hei * Size));
490     GroundDraw;
491     end;
492    
493     begin
494     Buffer.Canvas.Brush.Color := Color;
495     Buffer.Canvas.FillRect(Rect(Player1.Ground.Left + Wid * Size, 0,
496     Player2.Ground.Left, Hei * Size));
497     Buffer.Canvas.Brush.Color := clWhite;
498     if Sender = nil then
499     begin
500     s := Player2.Ground;
501     Main;
502     ItemDraw(Player2.Item);
503     OjamaDraw(Player2);
504     end
505     else
506     begin
507     s := Player1.Ground;
508     Main;
509     ItemDraw(Player1.Item);
510     OjamaDraw(Player1);
511     end;
512     if (Player1.State = Stop) and (Player2.State = Stop) then
513     begin
514     i := (Buffer.Width - Buffer.Canvas.TextWidth(TextMessage)) div 2;
515     Buffer.Canvas.Brush.Color := Color;
516     Buffer.Canvas.TextOut(i, 0, TextMessage);
517     end;
518     Canvas.Draw(100, 50, Buffer);
519     end;
520    
521     procedure TForm1.Player11Click(Sender: TObject);
522     begin
523     Player11.Checked := not Player11.Checked;
524     Player1.Com := Player11.Checked;
525     Start1Click(Sender);
526     end;
527    
528     procedure TForm1.PlayerScore(Sender: TObject; const GameParam: TGameParam;
529     var Score: integer);
530     begin
531     with GameParam do
532     Score:=Rensa*Rensa*10+Group*Group*15;
533     end;
534    
535     procedure TForm1.Start1Click(Sender: TObject);
536     begin
537     Rensa.Terminate;
538     Rensa.WaitFor;
539     Rensa.Free;
540     Rensa := TRensa.Create;
541     Player1.Start(true);
542     end;
543    
544     { TPlayer }
545    
546     constructor TPlayer.Create;
547     begin
548     State := TState.Stop;
549     Item := TItem.Create;
550     Temp := TItem.Create;
551     Test := TItem.Create;
552     Ground := TGround.Create;
553     OjamaList := TList.Create;
554     end;
555    
556     destructor TPlayer.Destroy;
557     begin
558     Item.Free;
559     Temp.Free;
560     Test.Free;
561     Ground.Free;
562     OjamaClean;
563     OjamaList.Free;
564     inherited;
565     end;
566    
567     procedure TPlayer.Make(aCount: integer);
568     var
569     i: integer;
570     s: TBall;
571     j, k, m: integer;
572     t: TStringList;
573     function Full: Boolean;
574     var
575     n: integer;
576     p: integer;
577     begin
578     p := 0;
579     for n := 0 to OjamaList.Count - 1 do
580     begin
581     s := OjamaList[n];
582     if s.Y = m then
583     inc(p);
584     end;
585     result := p = Wid;
586     end;
587    
588     begin
589     if aCount = 0 then
590     Exit;
591     for i := OjamaList.Count - 1 downto 0 do
592     begin
593     s := OjamaList[i];
594     if (s.Y < 0) and (aCount > 0) then
595     begin
596     s.Free;
597     OjamaList.Delete(i);
598     dec(aCount);
599     end
600     else
601     begin
602     m := s.Y - 1;
603     break;
604     end;
605     end;
606     j := 0;
607     while aCount >= Wid do
608     begin
609     for i := 0 to Wid - 1 do
610     begin
611     s := TBall.Craete;
612     s.X := i;
613     s.Y := j;
614     s.Color := clGray;
615     OjamaList.Add(s);
616     end;
617     dec(aCount, Wid);
618     dec(j);
619     end;
620     t := TStringList.Create;
621     try
622     for i := 0 to Wid - 1 do
623     t.Add(IntToStr(i));
624     Randomize;
625     for i := 1 to aCount do
626     begin
627     k := Random(t.Count);
628     s := TBall.Create;
629     s.X := StrToInt(t[k]);
630     s.Y := j;
631     s.Color := clGray;
632     t.Delete(k);
633     OjamaList.Add(s);
634     if Full = true then
635     dec(j);
636     end;
637     finally
638     t.Free;
639     end;
640     end;
641    
642     function TPlayer.Move(Dir: TDirector): Boolean;
643     var
644     i: integer;
645     s: TItem;
646     begin
647     result := true;
648     s := TItem.Create;
649     try
650     s.Assign(Item);
651     case Dir of
652     Under:
653     begin
654     for i := 0 to Count - 1 do
655     s.Colors[i].Y := s.Colors[i].Y + 1;
656     if Check(s) = true then
657     Item.Assign(s)
658     else
659     begin
660     State := Sys;
661     GameParam.Rensa := 0;
662     Item.Visible := false;
663     for i := 0 to Count - 1 do
664     Ground[Item.Colors[i].X, Item.Colors[i].Y].Color :=
665     Item.Colors[i].Color;
666     result := false;
667     end;
668     end;
669     Left:
670     begin
671     for i := 0 to Count - 1 do
672     s.Colors[i].X := s.Colors[i].X - 1;
673     if Check(s) = true then
674     Item.Assign(s)
675     else
676     result := false;
677     end;
678     Right:
679     begin
680     for i := 0 to Count - 1 do
681     s.Colors[i].X := s.Colors[i].X + 1;
682     if Check(s) = true then
683     Item.Assign(s)
684     else
685     result := false;
686     end;
687     end;
688     finally
689     s.Free;
690     end;
691     end;
692    
693     procedure TPlayer.OjamaClean;
694     var
695     i: integer;
696     s: TBall;
697     begin
698     for i := 0 to OjamaList.Count - 1 do
699     begin
700     s := OjamaList[i];
701     s.Free;
702     end;
703     OjamaList.Clear;
704     end;
705    
706     function TPlayer.Remove: Boolean;
707     var
708     Index: integer;
709     s: TColor;
710     i: integer;
711     j: integer;
712     function MapIndex(X, Y: integer): Boolean;
713     var
714     p: TBall;
715     begin
716     result := true;
717     if (Ground[X, Y] = nil) or (Ground[X, Y].Color = clGray) then
718     begin
719     result := false;
720     Exit;
721     end;
722     if Ground[X, Y].Color = s then
723     begin
724     p := Ground[X, Y];
725     if (p.Index = 0) and (p.Color = s) then
726     begin
727     Ground[X, Y].Index := Index;
728     MapIndex(X - 1, Y - 1);
729     MapIndex(X, Y - 1);
730     MapIndex(X + 1, Y - 1);
731     MapIndex(X - 1, Y);
732     MapIndex(X + 1, Y);
733     MapIndex(X - 1, Y + 1);
734     MapIndex(X, Y + 1);
735     MapIndex(X + 1, Y + 1);
736     end
737     else
738     result := false;
739     end;
740     end;
741     function CheckIndex(X: integer): integer;
742     var
743     m, n: integer;
744     begin
745     result := 0;
746     for m := 0 to Wid - 1 do
747     for n := 0 to Hei - 1 do
748     if Ground[m, n].Index = X then
749     inc(result);
750     end;
751     procedure DeleteOjama(const Ojama: array of TBall);
752     var
753     m: integer;
754     begin
755     for m := Low(Ojama) to High(Ojama) do
756     if (Ojama[m] <> nil) and (Ojama[m].Color = clGray) then
757     Ojama[m].Color := clWhite;
758     end;
759     procedure Delete(X: integer);
760     var
761     m, n: integer;
762     begin
763     for m := 0 to Wid - 1 do
764     for n := 0 to Hei - 1 do
765     if Ground[m, n].Index = X then
766     begin
767     if BackGround = true then
768     Ground[m, n].Color := clWhite
769     else
770     Ground[m, n].Index := -1;
771     DeleteOjama([Ground[m - 1, n], Ground[m + 1, n], Ground[m, n - 1],
772     Ground[m, n + 1]]);
773     end;
774     end;
775    
776     begin
777     for i := 0 to Wid - 1 do
778     for j := 0 to Hei - 1 do
779     Ground[i, j].Index := 0;
780     Index := 1;
781     for i := 0 to Wid - 1 do
782     for j := 0 to Hei - 1 do
783     begin
784     s := Ground[i, j].Color;
785     if (s <> clWhite) and (s <> OjamaColor) then
786     if MapIndex(i, j) = true then
787     inc(Index);
788     end;
789     GameParam.Kazu := 0;
790     Score := 0;
791     result := false;
792     for i := 1 to Index do
793     begin
794     j := CheckIndex(i);
795     if j = 3 then
796     inc(GameParam.Group);
797     if j >= 4 then
798     begin
799     inc(GameParam.Kazu, j);
800     inc(GameParam.Rensa);
801     inc(Score, 5 * j);
802     Delete(i);
803     result := true;
804     end;
805     inc(Score, GameParam.Rensa * 10);
806     if Assigned(FOnScoreEvent) = true then
807     FOnScoreEvent(Self, GameParam, Score);
808     end;
809     end;
810    
811     function TPlayer.Drop: Boolean;
812     var
813     i: integer;
814     j: integer;
815     k: integer;
816     begin
817     result := false;
818     for i := 0 to Wid - 1 do
819     for j := Hei - 1 downto 1 do
820     if Ground[i, j].Color = clWhite then
821     begin
822     for k := j downto 1 do
823     begin
824     Ground[i, k].Color := Ground[i, k - 1].Color;
825     Ground[i, k].Index := Ground[i, k - 1].Index;
826     if Ground[i, k].Color <> clWhite then
827     result := true;
828     end;
829     Ground[i, 0].Color := clWhite;
830     Ground[i, 0].Index := 0;
831     end;
832     end;
833    
834     procedure TPlayer.Execute;
835     function Same: Boolean;
836     var
837     k: integer;
838     begin
839     result := true;
840     for k := 0 to Count - 1 do
841     if Item.Colors[k].Color <> Test.Colors[k].Color then
842     begin
843     result := false;
844     break;
845     end;
846     end;
847    
848     var
849     i, j: integer;
850     s: TBall;
851    
852     begin
853     case State of
854     Down:
855     if Com = true then
856     begin
857     if (Item.Horizontal <> Test.Horizontal) or (Same = false) then
858     Turn
859     else if Item.Left = Test.Left then
860     State := Shoot
861     else if Item.Left < Test.Left then
862     Item.Left := Item.Left + 1
863     else
864     Item.Left := Item.Left - 1;
865     Sleep(100);
866     end
867     else
868     begin
869     Move(Under);
870     Sleep(300);
871     end;
872     Shoot:
873     begin
874     Move(Under);
875     Sleep(100);
876     end;
877     Sys:
878     if Drop = true then
879     Sleep(100)
880     else if Remove = true then
881     begin
882     State := Effect;
883     EffectCount := 1;
884     end
885     else
886     begin
887     State := Ojama;
888     if Assigned(FOnCreateOjama) = true then
889     FOnCreateOjama(Self, GameParam.Rensa - 1);
890     if (Zenkesi = true) and (Assigned(FOnCreateOjama) = true) then
891     FOnCreateOjama(Self, 2 * Wid);
892     end;
893     Effect:
894     begin
895     case EffectCount of
896     0:
897     State := Sys;
898     1:
899     for i := 0 to Wid - 1 do
900     for j := 0 to Hei - 1 do
901     if Ground[i, j].Index = -1 then
902     begin
903     Ground[i, j].Color := clWhite;
904     Ground[i, j].Index := 0;
905     end;
906     end;
907     Sleep(100);
908     dec(EffectCount);
909     end;
910     Ojama:
911     if OjamaList.Count = 0 then
912     Start
913     else
914     begin
915     for i := 0 to OjamaList.Count - 1 do
916     begin
917     s := OjamaList[i];
918     if (s.Y < Hei - 1) and
919     ((s.Y < 0) or (Ground[s.X, s.Y + 1].Color = clWhite)) then
920     s.Y := s.Y + 1
921     else if (s.Y = 0) and (Ground[s.X, 0].Color <> clWhite) then
922     begin
923     State := Stop;
924     Exit;
925     end
926     else
927     begin
928     Ground[s.X, s.Y].Color := clGray;
929     s.Color := clWhite;
930     end;
931     end;
932     for i := OjamaList.Count - 1 downto 0 do
933     begin
934     s := OjamaList[i];
935     if s.Color = clWhite then
936     begin
937     s.Free;
938     OjamaList.Delete(i);
939     end;
940     end;
941     Sleep(100);
942     end;
943     end;
944     end;
945    
946     procedure TPlayer.Start(const Resume: Boolean);
947     begin
948     OjamaClean;
949     if Resume = true then
950     begin
951     Temp.Clean;
952     Item.Visible := false;
953     Ground.Clean;
954     end;
955     Item.Assign(Temp);
956     Item.Visible := true;
957     if Check(Item) = false then
958     State := TState.Stop
959     else
960     begin
961     if Com = true then
962     Think;
963     State := Down;
964     end;
965     Temp.Clean;
966     end;
967    
968     function TPlayer.Check(aItem: TItem): Boolean;
969     var
970     i: integer;
971     s: TBall;
972     begin
973     result := true;
974     for i := 0 to Count - 1 do
975     begin
976     s := Ground[aItem.Colors[i].X, aItem.Colors[i].Y];
977     if (s = nil) or (s.Color <> clWhite) then
978     begin
979     result := false;
980     break;
981     end;
982     end;
983     end;
984    
985     procedure TPlayer.Think;
986     const
987     Hei = 100;
988     var
989     s: TGround;
990     i: integer;
991     k, m: integer;
992     procedure Sub;
993     var
994     j: integer;
995     begin
996     k := -1;
997     for j := 0 to Wid - 1 do
998     begin
999     Item.Left := j;
1000     Item.Top := 0;
1001     if Check(Item) = false then
1002     continue;
1003     while true do
1004     if Move(Under) = false then
1005     break;
1006     m := 0;
1007     while true do
1008     if Drop = false then
1009     begin
1010     if Remove = false then
1011     break;
1012     inc(m, Score);
1013     end;
1014     Ground.Assign(s);
1015     if m > k then
1016     begin
1017     k := m;
1018     Test.Assign(Item);
1019     end;
1020     if k >= Hei then
1021     break;
1022     end;
1023     end;
1024    
1025     begin
1026     BackGround := true;
1027     s := TGround.Create;
1028     try
1029     s.Assign(Ground);
1030     for i := 1 to 3 do
1031     begin
1032     Sub;
1033     if k >= Hei then
1034     break;
1035     Turn;
1036     end;
1037     Item.Left := pos_X;
1038     Item.Top := 0;
1039     Item.Visible := true;
1040     finally
1041     BackGround := false;
1042     s.Free;
1043     end;
1044     Item.Assign(Temp);
1045     end;
1046    
1047     function TPlayer.Turn(const Right: Boolean): Boolean;
1048     var
1049     i: integer;
1050     s: TItem;
1051     procedure return(var aItem: TItem);
1052     var
1053     p: array [0 .. Count - 1] of TColor;
1054     j: integer;
1055     begin
1056     for j := 0 to Count - 1 do
1057     p[j] := aItem.Colors[Count - j - 1].Color;
1058     for j := 0 to Count - 1 do
1059     aItem.Colors[j].Color := p[j];
1060     end;
1061    
1062     begin
1063     s := TItem.Create;
1064     try
1065     s.Assign(Item);
1066     s.Horizontal := not s.Horizontal;
1067     if ((not s.Horizontal = true) and (Right = true)) or
1068     ((not s.Horizontal = false) and (Right = false)) then
1069     return(s);
1070     for i := 0 to Count - 1 do
1071     begin
1072     if s.Horizontal = true then
1073     begin
1074     s.Colors[i].X := s.Colors[i].X + s.Colors[0].Y - s.Colors[i].Y;
1075     s.Colors[i].Y := s.Colors[0].Y;
1076     end
1077     else
1078     begin
1079     s.Colors[i].Y := s.Colors[i].Y + s.Colors[0].X - s.Colors[i].X;
1080     s.Colors[i].X := s.Colors[0].X;
1081     end;
1082     end;
1083     result := Check(s);
1084     if result = true then
1085     Item.Assign(s)
1086     else
1087     begin
1088     for i := 0 to Count - 1 do
1089     s.Colors[i].X := s.Colors[i].X + 1;
1090     if Check(s) = true then
1091     begin
1092     Item.Assign(s);
1093     result := true;
1094     end
1095     else
1096     begin
1097     for i := 0 to Count - 1 do
1098     s.Colors[i].X := s.Colors[i].X - 2;
1099     if Check(s) = true then
1100     begin
1101     Item.Assign(s);
1102     result := true;
1103     end
1104     else
1105     result := false;
1106     end;
1107     end;
1108     finally
1109     s.Free;
1110     end;
1111     end;
1112    
1113     function TPlayer.Zenkesi: Boolean;
1114     var
1115     i: integer;
1116     j: integer;
1117     begin
1118     for i := 0 to Wid - 1 do
1119     for j := 0 to Hei - 1 do
1120     if (Ground[i, j].Color <> clWhite) and (Ground[i, j].Color <> clGray) then
1121     begin
1122     result := false;
1123     Exit;
1124     end;
1125     result := true;
1126     end;
1127    
1128     end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26