Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (hide annotations) (download) (as text)
Fri Jul 10 23:55:37 2015 UTC (8 years, 7 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 26484 byte(s)
現在のところ原因不明で動作が停止するエラーが確認されています

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

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