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)
Sat Jul 11 05:06:38 2015 UTC (8 years, 9 months ago) by yamat0jp
File MIME type: text/x-pascal
File size: 20631 byte(s)


1 unit Unit1;
2
3 interface
4
5 uses
6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 Dialogs, Menus, ExtCtrls, Math;
8
9 const
10 Count = 8;
11
12 type
13 TStoneType = (stNone, stWhite, stBlack, stError);
14
15 TGridData = array [0..Count-1] of array [0..Count-1] of TStoneType;
16
17 TPlayer = class
18 private
19 FAuto: Boolean;
20 public
21 property Auto: Boolean read FAuto write FAuto;
22 end;
23
24 TStoneGrid = class
25 private
26 FStrings: TGridData;
27 FBuffer: array [1..Count*Count-4] of TGridData;
28 FTurnNumber: integer;
29 FTurnIndex: integer;
30 function GetStrings(X, Y: integer): TStoneType;
31 procedure SetStrings(X, Y: integer; const Value: TStoneType);
32 procedure SetTurnNumber(const Value: integer);
33 public
34 procedure Clear;
35 procedure BackUp;
36 function CalScore(Player: TPlayer; X, Y: integer): integer;
37 function CanSetStone(Player: TPlayer; X, Y: integer; Reverse: Boolean): Boolean;
38 function NextStone(Player: TPlayer): TPoint;
39 property Strings[X,Y: integer]: TStoneType read GetStrings write SetStrings; default;
40 property TurnNumber: integer read FTurnNumber write SetTurnNumber;
41 end;
42
43 TForm1 = class(TForm)
44 Timer1: TTimer;
45 MainMenu1: TMainMenu;
46 Game1: TMenuItem;
47 Start1: TMenuItem;
48 N1: TMenuItem;
49 End1: TMenuItem;
50 Com1: TMenuItem;
51 Player11: TMenuItem;
52 Player21: TMenuItem;
53 procedure FormCreate(Sender: TObject);
54 procedure FormDestroy(Sender: TObject);
55 procedure FormPaint(Sender: TObject);
56 procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
57 Shift: TShiftState; X, Y: Integer);
58 procedure Timer1Timer(Sender: TObject);
59 procedure FormResize(Sender: TObject);
60 procedure Player(Sender: TObject);
61 procedure Start1Click(Sender: TObject);
62 procedure End1Click(Sender: TObject);
63 private
64 { Private ���� }
65 StoneGrid: TStoneGrid;
66 Index: TPlayer;
67 Active: Boolean;
68 Size: integer;
69 procedure CompStone;
70 procedure GameStart;
71 procedure ChangePlayer;
72 procedure CheckGame;
73 public
74 { Public ���� }
75 end;
76
77 var
78 Player1: TPlayer;
79 Player2: TPlayer;
80
81 Form1: TForm1;
82
83 implementation
84
85 {$R *.dfm}
86
87 { TStoneGrid }
88
89 procedure TStoneGrid.BackUp;
90 begin
91 FBuffer[FTurnNumber]:=FStrings;
92 if FTurnNumber < Count*Count-4 then
93 begin
94 inc(FTurnNumber);
95 FTurnIndex:=FTurnNumber;
96 FBuffer[FTurnNumber]:=FStrings;
97 end;
98 end;
99
100 function TStoneGrid.CalScore(Player: TPlayer; X, Y: integer): integer;
101 var
102 i, j: integer;
103 begin
104 if CanSetStone(Player,X,Y,true) = true then
105 begin
106 if Player = Player1 then
107 begin
108 Player:=Player2;
109 end else
110 begin
111 Player:=Player1;
112 end;
113 result:=0;
114 for i:=0 to Count-1 do
115 begin
116 for j:=0 to Count-1 do
117 begin
118 if CanSetStone(Player,i,j,false) = true then
119 begin
120 inc(result);
121 end;
122 end;
123 end;
124 FStrings:=FBuffer[FTurnNumber];
125 end else
126 begin
127 FStrings:=FBuffer[FTurnNumber];
128 result:=-1;
129 end;
130 end;
131
132 function TStoneGrid.CanSetStone(Player: TPlayer;
133 X, Y: integer; Reverse: Boolean): Boolean;
134 var
135 i, j: integer;
136 begin
137 result:=false;
138 if GetStrings(X,Y) = stNone then
139 begin
140 if Player = Player1 then
141 begin
142 i:=1;
143 while true do
144 begin
145 case GetStrings(X-i,Y) of
146 stBlack:
147 if i > 1 then
148 begin
149 result:=true;
150 if Reverse = true then
151 begin
152 for j:=1 to i-1 do
153 begin
154 SetStrings(X-j,Y,stBlack);
155 end;
156 break;
157 end else
158 begin
159 Exit;
160 end;
161 end else
162 begin
163 break;
164 end;
165 stWhite:
166 inc(i);
167 else
168 break;
169 end;
170 end;
171 i:=1;
172 while true do
173 begin
174 case GetStrings(X-i,Y+i) of
175 stBlack:
176 if i > 1 then
177 begin
178 result:=true;
179 if Reverse = true then
180 begin
181 for j:=1 to i-1 do
182 begin
183 SetStrings(X-j,Y+j,stBlack);
184 end;
185 break;
186 end else
187 begin
188 Exit;
189 end;
190 end else
191 begin
192 break;
193 end;
194 stWhite:
195 inc(i);
196 else
197 break;
198 end;
199 end;
200 i:=1;
201 while true do
202 begin
203 case GetStrings(X,Y+i) of
204 stBlack:
205 if i > 1 then
206 begin
207 result:=true;
208 if Reverse = true then
209 begin
210 for j:=1 to i-1 do
211 begin
212 SetStrings(X,Y+j,stBlack);
213 end;
214 break;
215 end else
216 begin
217 Exit;
218 end;
219 end else
220 begin
221 break;
222 end;
223 stWhite:
224 inc(i);
225 else
226 break;
227 end;
228 end;
229 i:=1;
230 while true do
231 begin
232 case GetStrings(X+i,Y+i) of
233 stBlack:
234 if i > 1 then
235 begin
236 result:=true;
237 if Reverse = true then
238 begin
239 for j:=1 to i-1 do
240 begin
241 SetStrings(X+j,Y+j,stBlack);
242 end;
243 break;
244 end else
245 begin
246 Exit;
247 end;
248 end else
249 begin
250 break;
251 end;
252 stWhite:
253 inc(i);
254 else
255 break;
256 end;
257 end;
258 i:=1;
259 while true do
260 begin
261 case GetStrings(X+i,Y) of
262 stBlack:
263 if i > 1 then
264 begin
265 result:=true;
266 if Reverse = true then
267 begin
268 for j:=1 to i-1 do
269 begin
270 SetStrings(X+j,Y,stBlack);
271 end;
272 break;
273 end else
274 begin
275 Exit;
276 end;
277 end else
278 begin
279 break;
280 end;
281 stWhite:
282 inc(i);
283 else
284 break;
285 end;
286 end;
287 i:=1;
288 while true do
289 begin
290 case GetStrings(X+i,Y-i) of
291 stBlack:
292 if i > 1 then
293 begin
294 result:=true;
295 if Reverse = true then
296 begin
297 for j:=1 to i-1 do
298 begin
299 SetStrings(X+j,Y-j,stBlack);
300 end;
301 break;
302 end else
303 begin
304 Exit;
305 end;
306 end else
307 begin
308 break;
309 end;
310 stWhite:
311 inc(i);
312 else
313 break;
314 end;
315 end;
316 i:=1;
317 while true do
318 begin
319 case GetStrings(X,Y-i) of
320 stBlack:
321 if i > 1 then
322 begin
323 result:=true;
324 if Reverse = true then
325 begin
326 for j:=1 to i-1 do
327 begin
328 SetStrings(X,Y-j,stBlack);
329 end;
330 break;
331 end else
332 begin
333 Exit;
334 end;
335 end else
336 begin
337 break;
338 end;
339 stWhite:
340 inc(i);
341 else
342 break;
343 end;
344 end;
345 i:=1;
346 while true do
347 begin
348 case GetStrings(X-i,Y-i) of
349 stBlack:
350 if i > 1 then
351 begin
352 result:=true;
353 if Reverse = true then
354 begin
355 for j:=1 to i-1 do
356 begin
357 SetStrings(X-j,Y-j,stBlack);
358 end;
359 break;
360 end else
361 begin
362 Exit;
363 end;
364 end else
365 begin
366 break;
367 end;
368 stWhite:
369 inc(i);
370 else
371 break;
372 end;
373 end;
374 if (Reverse = true)and(result = true) then
375 begin
376 SetStrings(X,Y,stBlack);
377 end;
378 end else
379 begin
380 i:=1;
381 while true do
382 begin
383 case GetStrings(X-i,Y) of
384 stBlack:
385 inc(i);
386 stWhite:
387 if i > 1 then
388 begin
389 result:=true;
390 if Reverse = true then
391 begin
392 for j:=1 to i-1 do
393 begin
394 SetStrings(X-j,Y,stWhite);
395 end;
396 break;
397 end else
398 begin
399 Exit;
400 end;
401 end else
402 begin
403 break;
404 end;
405 else
406 break;
407 end;
408 end;
409 i:=1;
410 while true do
411 begin
412 case GetStrings(X+i,Y) of
413 stBlack:
414 inc(i);
415 stWhite:
416 if i > 1 then
417 begin
418 result:=true;
419 if Reverse = true then
420 begin
421 for j:=1 to i-1 do
422 begin
423 SetStrings(X+j,Y,stWhite);
424 end;
425 break;
426 end else
427 begin
428 Exit;
429 end;
430 end else
431 begin
432 break;
433 end;
434 else
435 break;
436 end;
437 end;
438 i:=1;
439 while true do
440 begin
441 case GetStrings(X-i,Y-i) of
442 stBlack:
443 inc(i);
444 stWhite:
445 if i > 1 then
446 begin
447 result:=true;
448 if Reverse = true then
449 begin
450 for j:=1 to i-1 do
451 begin
452 SetStrings(X-j,Y-j,stWhite);
453 end;
454 break;
455 end else
456 begin
457 Exit;
458 end;
459 end else
460 begin
461 break;
462 end;
463 else
464 break;
465 end;
466 end;
467 i:=1;
468 while true do
469 begin
470 case GetStrings(X,Y-i) of
471 stBlack:
472 inc(i);
473 stWhite:
474 if i > 1 then
475 begin
476 result:=true;
477 if Reverse = true then
478 begin
479 for j:=1 to i-1 do
480 begin
481 SetStrings(X,Y-j,stWhite);
482 end;
483 break;
484 end else
485 begin
486 Exit;
487 end;
488 end else
489 begin
490 break;
491 end;
492 else
493 break;
494 end;
495 end;
496 i:=1;
497 while true do
498 begin
499 case GetStrings(X+i,Y-i) of
500 stBlack:
501 inc(i);
502 stWhite:
503 if i > 1 then
504 begin
505 result:=true;
506 if Reverse = true then
507 begin
508 for j:=1 to i-1 do
509 begin
510 SetStrings(X+j,Y-j,stWhite);
511 end;
512 break;
513 end else
514 begin
515 Exit;
516 end;
517 end else
518 begin
519 break;
520 end;
521 else
522 break;
523 end;
524 end;
525 i:=1;
526 while true do
527 begin
528 case GetStrings(X-i,Y+i) of
529 stBlack:
530 inc(i);
531 stWhite:
532 if i > 1 then
533 begin
534 result:=true;
535 if Reverse = true then
536 begin
537 for j:=1 to i-1 do
538 begin
539 SetStrings(X-j,Y+j,stWhite);
540 end;
541 break;
542 end else
543 begin
544 Exit;
545 end;
546 end else
547 begin
548 break;
549 end;
550 else
551 break;
552 end;
553 end;
554 i:=1;
555 while true do
556 begin
557 case GetStrings(X,Y+i) of
558 stBlack:
559 inc(i);
560 stWhite:
561 if i > 1 then
562 begin
563 result:=true;
564 if Reverse = true then
565 begin
566 for j:= 1 to i-1 do
567 begin
568 SetStrings(X,Y+j,stWhite);
569 end;
570 break;
571 end else
572 begin
573 Exit;
574 end;
575 end else
576 begin
577 break;
578 end;
579 else
580 break;
581 end;
582 end;
583 i:=1;
584 while true do
585 begin
586 case GetStrings(X+i,Y+i) of
587 stBlack:
588 inc(i);
589 stWhite:
590 if i > 1 then
591 begin
592 result:=true;
593 if Reverse = true then
594 begin
595 for j:= 1 to i-1 do
596 begin
597 SetStrings(X+j,Y+j,stWhite);
598 end;
599 break;
600 end else
601 begin
602 Exit;
603 end;
604 end else
605 begin
606 break;
607 end;
608 else
609 break;
610 end;
611 end;
612 if (Reverse = true)and(result = true) then
613 begin
614 Strings[X,Y]:=stWhite;
615 end;
616 end;
617 end;
618 end;
619
620 procedure TStoneGrid.Clear;
621 var
622 i, j: integer;
623 begin
624 for i:=0 to Count-1 do
625 begin
626 for j:=0 to Count-1 do
627 begin
628 Strings[i,j]:=stNone;
629 end;
630 end;
631 Strings[3,3]:=stBlack;
632 Strings[4,4]:=stBlack;
633 Strings[4,3]:=stWhite;
634 Strings[3,4]:=stWhite;
635 FTurnNumber:=1;
636 FTurnIndex:=1;
637 end;
638
639 function TStoneGrid.GetStrings(X, Y: integer): TStoneType;
640 begin
641 if (X >= 0)and(X < Count)and(Y >= 0)and(Y < Count) then
642 begin
643 result:=FStrings[X,Y];
644 end else
645 begin
646 result:=stError;
647 end;
648 end;
649
650 function TStoneGrid.NextStone(Player: TPlayer): TPoint;
651 var
652 i, j, m, n: integer;
653 begin
654 n:=-1;
655 for i:=0 to Count-1 do
656 begin
657 for j:=0 to Count-1 do
658 begin
659 m:=CalScore(Player,i,j);
660 if (n = -1)or((m > -1)and(n > m)) then
661 begin
662 n:=m;
663 result:=Point(i,j);
664 end;
665 end;
666 end;
667 if n = -1 then
668 begin
669 result:=Point(-1,-1);
670 end;
671 end;
672
673 procedure TStoneGrid.SetStrings(X, Y: integer; const Value: TStoneType);
674 begin
675 if (X >= 0)and(X < Count)and(Y >= 0)and(Y < Count) then
676 begin
677 FStrings[X,Y]:=Value;
678 end;
679 end;
680
681 procedure TStoneGrid.SetTurnNumber(const Value: integer);
682 begin
683 if Value > FTurnIndex then
684 begin
685 FTurnNumber:=FTurnIndex;
686 end else
687 begin
688 FTurnNumber:=Value;
689 end;
690 FStrings:=FBuffer[FTurnNumber];
691 end;
692
693 { TForm1 }
694
695 procedure TForm1.ChangePlayer;
696 var
697 i, j, m, n: integer;
698 s: string;
699 procedure Main;
700 begin
701 if Index = Player1 then
702 begin
703 Index:=Player2;
704 end else
705 begin
706 Index:=Player1;
707 end;
708 end;
709 function Execute: Boolean;
710 var
711 i, j: integer;
712 begin
713 result:=false;
714 for i:=0 to Count-1 do
715 begin
716 for j:=0 to Count-1 do
717 begin
718 if StoneGrid.CanSetStone(Index,i,j,false) = true then
719 begin
720 result:=true;
721 break;
722 end;
723 end;
724 if result = true then
725 begin
726 break;
727 end;
728 end;
729 end;
730 begin
731 StoneGrid.BackUp;
732 Main;
733 if Execute = false then
734 begin
735 Main;
736 if Execute = false then
737 begin
738 Timer1.Enabled:=false;
739 Active:=false;
740 m:=0;
741 n:=0;
742 for i:=0 to Count-1 do
743 begin
744 for j:=0 to Count-1 do
745 begin
746 case StoneGrid[i,j] of
747 stBlack:
748 inc(m);
749 stWhite:
750 inc(n);
751 end;
752 end;
753 end;
754 if m > n then
755 begin
756 s:='Player1 Win:'+#13#10;
757 end else
758 if m < n then
759 begin
760 s:='Player2 Win:'+#13#10;
761 end else
762 begin
763 s:='Draw:'+#13#10;
764 end;
765 Showmessage(s+'(Player1) '+IntToStr(m)+'(Player2) '+IntToStr(n));
766 end;
767 end;
768 end;
769
770 procedure TForm1.CheckGame;
771 var
772 i, j, m, n: integer;
773 s: string;
774 begin
775 m:=0;
776 n:=0;
777 for i:=0 to Count-1 do
778 begin
779 for j:=0 to Count-1 do
780 begin
781 case StoneGrid.Strings[i,j] of
782 stWhite:
783 inc(m);
784 stBlack:
785 inc(n);
786 end;
787 end;
788 end;
789 if (m = 0)or(n = 0)or(m+n = Count*Count) then
790 begin
791 if n > m then
792 begin
793 s:='Player1 Win'+#13#10;
794 end else
795 if n < m then
796 begin
797 s:='Player2 Win'+#13#10;
798 end else
799 begin
800 s:='draw'+#13#10;
801 end;
802 Timer1.Enabled:=false;
803 Active:=false;
804 Showmessage(s+'(Player1) '+IntToStr(n)+#13#10+'(Player2) '+IntToStr(m));
805 end else
806 begin
807 ChangePlayer;
808 end;
809 end;
810
811 procedure TForm1.CompStone;
812 var
813 s: TPoint;
814 begin
815 s:=StoneGrid.NextStone(Index);
816 StoneGrid.CanSetStone(Index,s.X,s.Y,true);
817 FormPaint(nil);
818 CheckGame;
819 end;
820
821 procedure TForm1.GameStart;
822 begin
823 StoneGrid.Clear;
824 StoneGrid.BackUp;
825 FormPaint(nil);
826 Index:=Player1;
827 Active:=true;
828 Timer1.Enabled:=true;
829 end;
830
831 procedure TForm1.FormCreate(Sender: TObject);
832 begin
833 StoneGrid:=TStoneGrid.Create;
834 Player1:=TPlayer.Create;
835 Player2:=TPlayer.Create;
836 Player2.Auto:=true;
837 GameStart;
838 end;
839
840 procedure TForm1.FormDestroy(Sender: TObject);
841 begin
842 StoneGrid.Free;
843 Player1.Free;
844 Player2.Free;
845 end;
846
847 procedure TForm1.FormPaint(Sender: TObject);
848 var
849 i, j: integer;
850 begin
851 Canvas.Brush.Color:=clWhite;
852 Canvas.Rectangle(0,0,Count*Size,Count*Size);
853 for i:=0 to Count-1 do
854 begin
855 Canvas.MoveTo(i*Size,0);
856 Canvas.LineTo(i*Size,Size*Count);
857 for j:=0 to Count-1 do
858 begin
859 Canvas.MoveTo(0,j*Size);
860 Canvas.LineTo(Count*Size,j*Size);
861 case StoneGrid.Strings[i,j] of
862 stWhite:
863 begin
864 Canvas.Brush.Color:=clWhite;
865 Canvas.Ellipse(i*Size,j*Size,(i+1)*Size,(j+1)*Size);
866 end;
867 stBlack:
868 begin
869 Canvas.Brush.Color:=clBlack;
870 Canvas.Ellipse(i*Size,j*Size,(i+1)*Size,(j+1)*Size);
871 end;
872 end;
873 end;
874 end;
875 end;
876
877 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
878 Shift: TShiftState; X, Y: Integer);
879 begin
880 if (Active = true)and(Index.Auto = false)and(X <= Count*Size)and(Y <= Count*Size) then
881 begin
882 X:=X div Size;
883 Y:=Y div Size;
884 if StoneGrid.CanSetStone(Index,X,Y,true) = true then
885 begin
886 FormPaint(Sender);
887 CheckGame;
888 end;
889 end;
890 end;
891
892 procedure TForm1.Timer1Timer(Sender: TObject);
893 begin
894 if (Active = true)and(Index.Auto = true) then
895 begin
896 Timer1.Enabled:=false;
897 CompStone;
898 Timer1.Enabled:=true;
899 end;
900 end;
901
902 procedure TForm1.FormResize(Sender: TObject);
903 begin
904 Size:=Min(ClientWidth,ClientHeight) div Count;
905 FormPaint(Sender);
906 end;
907
908 procedure TForm1.Player(Sender: TObject);
909 begin
910 (Sender as TMenuItem).Checked:=not (Sender as TMenuItem).Checked;
911 if Sender = Player11 then
912 begin
913 Player1.Auto:=Player11.Checked;
914 end else
915 begin
916 Player2.Auto:=Player21.Checked;
917 end;
918 end;
919
920 procedure TForm1.Start1Click(Sender: TObject);
921 begin
922 GameStart;
923 end;
924
925 procedure TForm1.End1Click(Sender: TObject);
926 begin
927 Close;
928 end;
929
930 end.
931

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