Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show 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 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 FOnTextMessage: TNotifyEvent;
87 FText: string;
88 function Check(aItem: TItem): Boolean;
89 procedure SetText(const Value: string);
90 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 TextColor: TColor;
102 Name: string;
103 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 property Text: string read FText write SetText;
119 property OnTextMessage: TNotifyEvent read FOnTextMessage
120 write FOnTextMessage;
121 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 Limit: TTime;
146 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 procedure PlayerMessage(Sender: TObject);
154 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 Player1.OnTextMessage := PlayerMessage;
376 Player2.OnTextMessage := PlayerMessage;
377 Player1.Name := 'Player1';
378 Player2.Name := 'Player2';
379 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 Limit := 0;
412 Exit;
413 end;
414 if (Player1.Com = false) and (Player1.State = Down) then
415 begin
416 case Key of
417 VK_DOWN:
418 Player1.State := Shoot;
419 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 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 a = Size div 8;
442 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 else if Sender = Player2 then
521 begin
522 s := Player1.Ground;
523 Main;
524 ItemDraw(Player1.Item);
525 OjamaDraw(Player1);
526 end
527 else
528 begin
529 s := Player1.Ground;
530 Main;
531 ItemDraw(Player1.Item);
532 OjamaDraw(Player1);
533 Buffer.Canvas.Brush.Color := clWhite;
534 s := Player2.Ground;
535 Main;
536 ItemDraw(Player2.Item);
537 OjamaDraw(Player2);
538 end;
539 if Limit > 0 then
540 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 if Time > Limit then
545 begin
546 Limit := 0;
547 FormPaint(Sender);
548 end;
549 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 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 procedure TForm1.PlayerScore(Sender: TObject; const GameParam: TGameParam;
579 var Score: integer);
580 begin
581 with GameParam do
582 Score := Rensa * Rensa * 10 + Group * Group * 15;
583 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 if GameParam.Rensa >= 2 then
860 Text := Name + Format(' %d �A��', [GameParam.Rensa]);
861 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 for i := 1 to 100 do
923 begin
924 Sleep(3);
925 Application.ProcessMessages;
926 if State <> Down then
927 break;
928 end;
929 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 procedure TPlayer.SetText(const Value: string);
1005 begin
1006 FText := Value;
1007 if Assigned(FOnTextMessage) = true then
1008 FOnTextMessage(Self);
1009 end;
1010
1011 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 begin
1024 State := TState.Stop;
1025 Text := Name + 'Game Over';
1026 end
1027 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