Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


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

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

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

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

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