Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (hide annotations) (download) (as text)
Fri Jul 10 10:00:49 2015 UTC (8 years, 8 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 25484 byte(s)
マニュアルで対戦する際にPlayer2の動きが遅かった問題を解決しました
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 yamat0jp 2 a = Size div 8;
427 yamat0jp 1 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 yamat0jp 2 for i := 1 to 100 do
871     begin
872     Sleep(3);
873     Application.ProcessMessages;
874     end;
875 yamat0jp 1 end;
876     Shoot:
877     begin
878     Move(Under);
879     Sleep(100);
880     end;
881     Sys:
882     if Drop = true then
883     Sleep(100)
884     else if Remove = true then
885     begin
886     State := Effect;
887     EffectCount := 1;
888     end
889     else
890     begin
891     State := Ojama;
892     if Assigned(FOnCreateOjama) = true then
893     FOnCreateOjama(Self, GameParam.Rensa - 1);
894     if (Zenkesi = true) and (Assigned(FOnCreateOjama) = true) then
895     FOnCreateOjama(Self, 2 * Wid);
896     end;
897     Effect:
898     begin
899     case EffectCount of
900     0:
901     State := Sys;
902     1:
903     for i := 0 to Wid - 1 do
904     for j := 0 to Hei - 1 do
905     if Ground[i, j].Index = -1 then
906     begin
907     Ground[i, j].Color := clWhite;
908     Ground[i, j].Index := 0;
909     end;
910     end;
911     Sleep(100);
912     dec(EffectCount);
913     end;
914     Ojama:
915     if OjamaList.Count = 0 then
916     Start
917     else
918     begin
919     for i := 0 to OjamaList.Count - 1 do
920     begin
921     s := OjamaList[i];
922     if (s.Y < Hei - 1) and
923     ((s.Y < 0) or (Ground[s.X, s.Y + 1].Color = clWhite)) then
924     s.Y := s.Y + 1
925     else if (s.Y = 0) and (Ground[s.X, 0].Color <> clWhite) then
926     begin
927     State := Stop;
928     Exit;
929     end
930     else
931     begin
932     Ground[s.X, s.Y].Color := clGray;
933     s.Color := clWhite;
934     end;
935     end;
936     for i := OjamaList.Count - 1 downto 0 do
937     begin
938     s := OjamaList[i];
939     if s.Color = clWhite then
940     begin
941     s.Free;
942     OjamaList.Delete(i);
943     end;
944     end;
945     Sleep(100);
946     end;
947     end;
948     end;
949    
950     procedure TPlayer.Start(const Resume: Boolean);
951     begin
952     OjamaClean;
953     if Resume = true then
954     begin
955     Temp.Clean;
956     Item.Visible := false;
957     Ground.Clean;
958     end;
959     Item.Assign(Temp);
960     Item.Visible := true;
961     if Check(Item) = false then
962     State := TState.Stop
963     else
964     begin
965     if Com = true then
966     Think;
967     State := Down;
968     end;
969     Temp.Clean;
970     end;
971    
972     function TPlayer.Check(aItem: TItem): Boolean;
973     var
974     i: integer;
975     s: TBall;
976     begin
977     result := true;
978     for i := 0 to Count - 1 do
979     begin
980     s := Ground[aItem.Colors[i].X, aItem.Colors[i].Y];
981     if (s = nil) or (s.Color <> clWhite) then
982     begin
983     result := false;
984     break;
985     end;
986     end;
987     end;
988    
989     procedure TPlayer.Think;
990     const
991     Hei = 100;
992     var
993     s: TGround;
994     i: integer;
995     k, m: integer;
996     procedure Sub;
997     var
998     j: integer;
999     begin
1000     k := -1;
1001     for j := 0 to Wid - 1 do
1002     begin
1003     Item.Left := j;
1004     Item.Top := 0;
1005     if Check(Item) = false then
1006     continue;
1007     while true do
1008     if Move(Under) = false then
1009     break;
1010     m := 0;
1011     while true do
1012     if Drop = false then
1013     begin
1014     if Remove = false then
1015     break;
1016     inc(m, Score);
1017     end;
1018     Ground.Assign(s);
1019     if m > k then
1020     begin
1021     k := m;
1022     Test.Assign(Item);
1023     end;
1024     if k >= Hei then
1025     break;
1026     end;
1027     end;
1028    
1029     begin
1030     BackGround := true;
1031     s := TGround.Create;
1032     try
1033     s.Assign(Ground);
1034     for i := 1 to 3 do
1035     begin
1036     Sub;
1037     if k >= Hei then
1038     break;
1039     Turn;
1040     end;
1041     Item.Left := pos_X;
1042     Item.Top := 0;
1043     Item.Visible := true;
1044     finally
1045     BackGround := false;
1046     s.Free;
1047     end;
1048     Item.Assign(Temp);
1049     end;
1050    
1051     function TPlayer.Turn(const Right: Boolean): Boolean;
1052     var
1053     i: integer;
1054     s: TItem;
1055     procedure return(var aItem: TItem);
1056     var
1057     p: array [0 .. Count - 1] of TColor;
1058     j: integer;
1059     begin
1060     for j := 0 to Count - 1 do
1061     p[j] := aItem.Colors[Count - j - 1].Color;
1062     for j := 0 to Count - 1 do
1063     aItem.Colors[j].Color := p[j];
1064     end;
1065    
1066     begin
1067     s := TItem.Create;
1068     try
1069     s.Assign(Item);
1070     s.Horizontal := not s.Horizontal;
1071     if ((not s.Horizontal = true) and (Right = true)) or
1072     ((not s.Horizontal = false) and (Right = false)) then
1073     return(s);
1074     for i := 0 to Count - 1 do
1075     begin
1076     if s.Horizontal = true then
1077     begin
1078     s.Colors[i].X := s.Colors[i].X + s.Colors[0].Y - s.Colors[i].Y;
1079     s.Colors[i].Y := s.Colors[0].Y;
1080     end
1081     else
1082     begin
1083     s.Colors[i].Y := s.Colors[i].Y + s.Colors[0].X - s.Colors[i].X;
1084     s.Colors[i].X := s.Colors[0].X;
1085     end;
1086     end;
1087     result := Check(s);
1088     if result = true then
1089     Item.Assign(s)
1090     else
1091     begin
1092     for i := 0 to Count - 1 do
1093     s.Colors[i].X := s.Colors[i].X + 1;
1094     if Check(s) = true then
1095     begin
1096     Item.Assign(s);
1097     result := true;
1098     end
1099     else
1100     begin
1101     for i := 0 to Count - 1 do
1102     s.Colors[i].X := s.Colors[i].X - 2;
1103     if Check(s) = true then
1104     begin
1105     Item.Assign(s);
1106     result := true;
1107     end
1108     else
1109     result := false;
1110     end;
1111     end;
1112     finally
1113     s.Free;
1114     end;
1115     end;
1116    
1117     function TPlayer.Zenkesi: Boolean;
1118     var
1119     i: integer;
1120     j: integer;
1121     begin
1122     for i := 0 to Wid - 1 do
1123     for j := 0 to Hei - 1 do
1124     if (Ground[i, j].Color <> clWhite) and (Ground[i, j].Color <> clGray) then
1125     begin
1126     result := false;
1127     Exit;
1128     end;
1129     result := true;
1130     end;
1131    
1132     end.

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