Uses
Crt,Graph;
Const
RecordFileName='PoorGo.';
TempRecordFileName='PoorGo.Tmp';
TempFileName='PoorGo.$$$';
Size=19;
DX:Array [1..4] Of Integer=(-1,0,1,0);
DY:Array [1..4] Of Integer=(0,-1,0,1);
Style=20;
Type
BoardType=Array [0..Size-1,0..Size-1] Of Integer;
Var
Board:BoardType;
BoardGraph:Array [0..Size-1,0..Size-1] Of Pointer;
Step,NowX,NowY,MemSize:Integer;
Pattern:FillPatternType;
BOrW:Boolean;
TempFile,TempRecordFile:Text;
Function ActualXY(xy:Integer):Integer;
Function InKey:Char;
Procedure EatChess(x,y:Integer);
Procedure EndGame;
Procedure GoChess(x,y:Integer);
Procedure InitGame;
Procedure KeyManage(Key:Char);
Procedure MoveCursor(Direction:Integer);
Procedure PutChess(x,y,ChessType:Integer);
Procedure PutCursor(x,y:Integer);
Procedure UndoChess;
Implementation
Function ActualXY(xy:Integer):Integer;
Begin
ActualXY:=13+xy*Style;
End;
Procedure EatChess;
Var
i,j,d,ti,tj:Integer;
More:Boolean;
Begin
If (x<0) Or (x>=Size) Or (y<0) Or (y>=Size) Or (Board[x,y]=0)
Then Exit;
Board[x,y]:=-Board[x,y];
Repeat
More:=False;
For i:=0 To Size-1 Do
For j:=0 To Size-1 Do
If Board[i,j]<0
Then For d:=1 To 4 Do
Begin
ti:=i+DX[d];
tj:=j+DY[d];
If (ti>=0) And (ti<Size) And (tj>=0) And (tj<Size)
Then If Board[ti,tj]=-Board[i,j]
Then Begin
Board[ti,tj]:=-Board[ti,tj];
More:=True;
End
Else If Board[ti,tj]=0
Then Begin
For ti:=0 To Size-1 Do
For tj:=0 To Size-1 Do
Board[ti,tj]:=Abs(Board[ti,tj]);
Exit;
End;
End;
Until Not More;
For i:=0 To Size-1 Do
For j:=0 To Size-1 Do
If Board[i,j]<0
Then Begin
PutChess(i,j,0);
Board[i,j]:=0;
Write(TempRecordFile,i,' ',j,' ');
End;
PutCursor(NowX,NowY);
End;
Function InKey;
Var
ch:Char;
Begin
ch:=Readkey;
While ch=#0 Do
ch:=Readkey;
InKey:=ch;
End;
Procedure EndGame;
Begin
CloseGraph;
Close(TempRecordFile);
End;
Procedure GoChess;
Var
i:Integer;
Begin
If Board[x,y]>0
Then Exit;
Inc(Step);
If BOrW
Then Begin
PutChess(x,y,1);
Board[x,y]:=1;
End
Else Begin
PutChess(x,y,2);
Board[x,y]:=2;
End;
PutCursor(x,y);
Write(TempRecordFile,x,' ',y,' ');
For i:=1 To 4 Do
EatChess(x+DX[i],y+DY[i]);
EatChess(x,y);
Writeln(TempRecordFile);
BOrW:=Not BOrW;
SetFillPattern(Pattern,Black);
Bar(450,150,550,200);
SetTextStyle(DefaultFont,HorizDir,2);
SetColor(White);
If BOrW
Then OutTextXY(450,150,'Black')
Else OutTextXY(450,150,'White');
End;
Procedure InitGame;
Var
Gd,Gm,i,j:Integer;
Begin
Step:=0;
Assign(TempRecordFile,TempRecordFileName);
ReWrite(TempRecordFile);
FillChar(Board,SizeOf(Board),0);
Gd:=Detect;
InitGraph(Gd,Gm,'D:\Euler\Tp\Bgi');
ClearViewPort;
GetFillPattern(Pattern);
SetFillPattern(Pattern,Blue);
Bar(3,3,Style*(Size-1)+23,Style*(Size-1)+23);
SetColor(Black);
For i:=0 To Size-1 Do
Begin
Line(13+i*Style,13,13+i*Style,Style*(Size-1)+13);
Line(13,13+i*Style,Style*(Size-1)+13,13+i*Style);
End;
Rectangle(10,10,Style*(Size-1)+16,Style*(Size-1)+16);
Rectangle(11,11,Style*(Size-1)+15,Style*(Size-1)+15);
SetFillPattern(Pattern,Black);
For i:=0 To 2 Do
For j:=0 To 2 Do
PieSlice(ActualXY(3+i*6),ActualXY(3+j*6),0,360,2);
BOrW:=True;
MemSize:=ImageSize(13-Style Div 2,13-Style Div 2,
13+Style Div 2,13+Style Div 2);
For i:=0 To Size-1 Do
For j:=0 To Size-1 Do
Begin
GetMem(BoardGraph[i,j],MemSize);
GetImage(ActualXY(i)-Style Div 2,ActualXY(j)-Style Div 2,
ActualXY(i)+Style Div 2,ActualXY(j)+Style Div 2,BoardGraph[i,j]^);
End;
NowX:=9;
NowY:=9;
PutCursor(NowX,NowY);
SetColor(White);
SetTextStyle(GothicFont,HorizDir,10);
OutTextXY(400,0,'Go!');
SetTextStyle(DefaultFont,HorizDir,2);
OutTextXY(450,150,'Black');
End;
Procedure KeyManage;
Begin
Case Key Of
#72:MoveCursor(2);
#75:MoveCursor(1);
#77:MoveCursor(3);
#80:MoveCursor(4);
#13:GoChess(NowX,NowY);
#8:UndoChess;
#27:Exit;
End;
End;
Procedure MoveCursor;
Begin
PutChess(NowX,NowY,Board[NowX,NowY]);
NowX:=(NowX+DX[Direction]+Size) Mod Size;
NowY:=(NowY+DY[Direction]+Size) Mod Size;
PutCursor(NowX,NowY);
End;
Procedure PutChess;
Begin
Case ChessType Of
0:PutImage(ActualXY(x)-Style Div 2,ActualXY(y)-Style Div 2,
BoardGraph[x,y]^,NormalPut);
1:Begin
SetColor(Black);
SetFillPattern(Pattern,Black);
PieSlice(ActualXY(x),ActualXY(y),0,360,Style Div 2-2);
End;
2:Begin
SetColor(White);
SetFillPattern(Pattern,White);
PieSlice(ActualXY(x),ActualXY(y),0,360,Style Div 2-2);
End;
End;
End;
Procedure PutCursor;
Begin
SetColor(Red);
Rectangle(ActualXY(x)-Style Div 4,ActualXY(y)-Style Div 4,
ActualXY(x)+Style Div 4,ActualXY(y)+Style Div 4);
End;
Procedure UndoChess;
Var
i,x,y:Integer;
ch:Char;
Begin
If Step=0
Then Exit;
Close(TempRecordFile);
ReSet(TempRecordFile);
Assign(TempFile,TempFileName);
Rewrite(TempFile);
For i:=1 To Step-1 Do
Begin
Read(TempRecordFile,x,y);
Write(TempFile,x,' ',y,' ');
While Not SeekEoln(TempRecordFile) Do
Begin
Read(TempRecordFile,x,y);
Write(TempFile,x,' ',y,' ');
End;
Writeln(TempFile);
End;
Read(TempRecordFile,x,y);
BOrW:=Not BOrW;
PutChess(x,y,0);
Board[x,y]:=0;
While Not SeekEoln(TempRecordFile) Do
Begin
Read(TempRecordFile,x,y);
PutChess(x,y,Ord(BOrW)+1);
Board[x,y]:=Ord(BOrW)+1;
End;
PutCursor(NowX,NowY);
Close(TempRecordFile);
Erase(TempRecordFile);
Close(TempFile);
Rename(TempFile,TempRecordFileName);
Assign(TempRecordFile,TempRecordFileName);
Append(TempRecordFile);
Dec(Step);
SetFillPattern(Pattern,Black);
Bar(450,150,550,200);
SetTextStyle(DefaultFont,HorizDir,2);
SetColor(White);
If BOrW
Then OutTextXY(450,150,'Black')
Else OutTextXY(450,150,'White');
End;
End.
文件PoorGo.pas
Uses
Crt,UPoorGo;
Var
ch:Char;
Begin
InitGame;
Repeat
ch:=InKey;
KeyManage(ch);
Until ch=#27;
EndGame;
End.