Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide 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 yamat0jp 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