| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- uses CRT;
- Const
- n = 20;
- NameX = 'Rod2';
- NameO = 'Rod';
- ColorX = LightBlue;
- ColorO = LightRed;
- PoleY1 = 110;
- PoleL = 460-PoleY1;
- Cell = PoleL / n;
- PoleX1 = round(320 - (Cell*n) / 2);
- PoleX2 = round(320 + (Cell*n) / 2);
- PoleY2 = round(PoleY1+n*cell);
- TimeT = 5*25*2;
- DelX = round(TimeT/Cell/2);
- DelO = round(TimeT/360);
- Type TPole = array [-4..n+4,-4..n+4] of byte;
- TurnProc = procedure(cx:byte;var x,y:byte);
- PointType = record
- x,y : byte;
- end;
- Var
- Pole : TPole;
- TP : Tpole;
- Ex : boolean;
- Win : byte;
- xc,yc : byte;
- count : 0..n*n+1;
- WinX,WinO,Games,i,j : word;
- ENDS : array [1..5] of pointtype;
- TurnX : TurnProc;
- TurnO : TurnProc;
- TurnT : turnProc;
- {$I Rod.inc}
- {$I GRISHA1.inc}
- {---------------------------}
- Function IsWin(x,y:byte):byte;
- var
- x1,y1 : byte;
- k1,k2,l1,l2 : byte;
- res : byte;
- begin
- res := 0;
- if x-4<1 then k1 := 1 else k1 := x - 4;
- if x+4>n then k2 := n else k2 := x + 4;
- if y-4<1 then l1 := 1 else l1 := y - 4;
- if y+4>n then l2 := n else l2 := y + 4;
- for x1 := k1 to k2 do
- for y1 := l1 to l2 do
- if (pole[x1,y1]<>0) then begin
- if ((pole[x1,y1]=pole[x1,y1-2]) and
- (pole[x1,y1]=pole[x1,y1-1]) and
- (pole[x1,y1]=pole[x1,y1+1]) and
- (pole[x1,y1]=pole[x1,y1+2])) then res := pole[x1,y1];
- if ((pole[x1,y1]=pole[x1-2,y1]) and
- (pole[x1,y1]=pole[x1-1,y1]) and
- (pole[x1,y1]=pole[x1+1,y1]) and
- (pole[x1,y1]=pole[x1+2,y1])) then res := pole[x1,y1];
- if ((pole[x1,y1]=pole[x1-2,y1-2]) and
- (pole[x1,y1]=pole[x1-1,y1-1]) and
- (pole[x1,y1]=pole[x1+1,y1+1]) and
- (pole[x1,y1]=pole[x1+2,y1+2])) then res := pole[x1,y1];
- if ((pole[x1,y1]=pole[x1+2,y1-2]) and
- (pole[x1,y1]=pole[x1+1,y1-1]) and
- (pole[x1,y1]=pole[x1-1,y1+1]) and
- (pole[x1,y1]=pole[x1-2,y1+2])) then res := pole[x1,y1];
- end;
- IsWin := Res;
- end;{IsWin}
- {---------------------------}
- Function IsLeg(x,y:byte):boolean;
- var res:boolean; i,j : byte;
- begin
- res := true;
- if not (x in [1..n]) then
- res := false;
- if not (y in [1..n]) then
- res := false;
- for i := 1 to n do for j := 1 to n do if pole[i,j] <> tp[i,j] then
- res := false;
- if tp[x,y] <> 0 then
- res := false;
- pole := tp;
- IsLeg:=res;
- end;{IsLeg}
- {-------------------------}
- Procedure GameOver(c : byte);
- Var
- sc,s1 : string;
- Begin
- Case c of
- 1: inc(Winx);
- 2: inc(WinO);
- 3: inc(WinO);
- 4: inc(Winx);
- end;
- Ex := true;
- End;{GameOver}
- {------------------------}
- const
- GA = 1000;
- BEGIN
- TurnX:=GRISHA1;
- TurnO:=RodNewTurn;
- ClrScr;
- Write('WinX:');
- for games := 1 to ga do begin
- for i := 1 to n do for j:= 1 to n do pole[i,j] :=0;
- ex := false;
- count := 0;
- repeat
- tp := pole;
- TurnX(1,xc,yc);
- if not isLeg(xc,yc) then GameOver(3)
- else begin
- inc(count);
- Pole[xc,yc] := 1;
- win := iswin(xc,yc);
- if (count=n*n) then GameOver(5) else begin
- if Win <> 0 then GameOver(1) else
- begin
- tp := pole;
- TurnO(2,xc,yc);
- if not isLeg(xc,yc) then gameover(4)
- else
- begin
- Pole[xc,yc] := 2;
- Inc(count);
- win := iswin(xc,yc);
- if (count=n*n) then GameOver(5) else begin
- if Win <> 0 then GameOver(2);
- end;
- end;
- end;
- end;
- end;
- until Ex;
- TurnT := TurnX;
- TurnX := TurnO;
- TurnO := TurnT;
- WinX := WinX xor WinO;
- WinO := WinX xor WinO;
- WinX := WinX xor WinO;
- end;
- Write(WinX:4,' WinO: ',WinO:4);
- WriteLn;
- WriteLn(WinX / ga * 100:2:0,'%');
- ReadKey;
- END.
|