Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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