📄 chess.pas
字号:
function KihieuNuoc(r,c:Integer):String;
begin
KihieuNuoc:=RStr(IntToStr(c),2)+':'+RStr(IntToStr(SIZE_Y+1-r),2);
end;
{---------------------------------------------------------}
procedure TMainForm.PrintTurnInfo;
begin
lblMove.Caption:='Turn : '+IntToStr(N div 2 + 1);
if SidePlay=XSide then
begin
lblSide.Color:=clBlue;
lblSide.Caption:='BLUE';
end
else
begin
lblSide.Color:=clRed;
lblSide.Caption:='RED';
end;
end;
{---------------------------------------------------------}
function UpdateNewMove:Integer;
begin
if NewMove.Row=0 then
begin
ShowMessage('Draw');
LuotNguoidi:=False;
MainForm.ComTimer.Enabled:=False;
Result:=1;
Exit;
end;
Piece[NewMove.Row,NewMove.Col]:=SidePlay;
if side=XSide then KukoPiece[NewMove.Row,NewMove.Col]:=KukoX
else KukoPiece[NewMove.Row,NewMove.Col]:=KukoO;
if ((SidePlay=XSide) and (MainForm.cboPlayer1.ItemIndex<>MARS_COM)) or
((SidePlay=OSide) and (MainForm.cboPlayer2.ItemIndex<>MARS_COM)) then
begin
PlayPoint.X:=NewMove.Row-1;
PlayPoint.Y:=NewMove.Col-1;
Update_move;
side := 3-side;
first_side := side;
end;
Inc(SoNuoc);
DrawCell(NewMove.Row,NewMove.Col);
Winner:=FivePointFound(NewMove.Row,NewMove.Col);
GameTime:=GetTickCount-GameStart;
if SidePlay=XSide then
begin
OStart:=GetTickCount;
Inc(XTime,OStart-XStart);
end
else
begin
XStart:=GetTickCount;
Inc(OTime,XStart-OStart);
end;
if SidePlay=XSide then SidePlay:=OSide else SidePlay:=XSide;
UpdateNewMove:=Winner;
with MainForm do
begin
PrintTurnInfo(SoNuoc);
lblGameTime.Caption:=MiliSecToStr(GameTime);
lblXTime.Caption:=MiliSecToStr(XTime);
lblOTime.Caption:=MiliSecToStr(OTime);
if Odd(SoNuoc) then ListBox.Items.Add(RStr(IntToStr((SoNuoc-1) div 2 + 1),2)+' : '+KihieuNuoc(NewMove.Row,NewMove.Col))
else ListBox.Items.Add(RStr('',5)+KihieuNuoc(NewMove.Row,NewMove.Col));
ListBox.ItemIndex:=ListBox.Items.Count - 1;
end;
if Winner<>EMPTY then EndGame;
end;
{---------------------------------------------------------}
procedure NewGame;
var
i,j : Integer;
begin
Init_para;
if MainForm.cboPlayer1.ItemIndex in [MARS_COM,BLACK_ANGEL] then side:=Human
else side:=Computer;
SidePlay:=XSide;
Winner:=0;
SoNuoc:=0;
for i:=1 to SIZE_Y do
for j:=1 to SIZE_X do Piece[i,j]:=EMPTY;
KukoPiece:=Piece;
MainForm.ListBox.Clear;
DrawBoard;
COMvsCOM:=(MainForm.cboPlayer1.ItemIndex<>PLAYER_HUMAN) and (MainForm.cboPlayer2.ItemIndex<>PLAYER_HUMAN);
GameTime:=0;
XTime:=0;
OTime:=0;
GameStart:=GetTickCount;
XStart:=GameStart;
if MainForm.cboPlayer1.ItemIndex<>PLAYER_HUMAN then
begin
NewMove.Row:=10;
NewMove.Col:=10;
if MainForm.cboPlayer1.ItemIndex=MARS_COM then
begin
PlayPoint.X:=9;
PlayPoint.Y:=9;
Update_move;
side := 3-side;
first_side := side;
end;
UpdateNewMove;
LuotNguoidi:=MainForm.cboPlayer2.ItemIndex=PLAYER_HUMAN;
end
else LuotNguoidi:=True;
MayDangnghi:=False;
MainForm.COMTimer.Enabled:=not LuotNguoidi;
end;
{---------------------------------------------------------}
procedure TMainForm.subNewGameClick(Sender: TObject);
begin
NewGame;
end;
{---------------------------------------------------------}
procedure TMainForm.FormCreate(Sender: TObject);
begin
Randomize;
CurrentDir:=ExtractFilePath(Application.ExeName);
InitShashinPattern;
cboPlayer1.ItemIndex:=PLAYER_HUMAN;
cboPlayer2.ItemIndex:=MARS_COM;
NewGame;
end;
{---------------------------------------------------------}
procedure TMainForm.ChessBoardMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
r,c : Integer;
begin
if not LuotNguoidi then Exit;
r:=ChessBoard.Row+1;
c:=ChessBoard.Col+1;
if Piece[r,c]=EMPTY then
begin
NewMove.Row:=r;
NewMove.Col:=c;
if UpdateNewMove>0 then Exit;
if ((SidePlay=XSide) and (cboPlayer1.ItemIndex<>PLAYER_HUMAN)) or
((SidePlay=OSide) and (cboPlayer2.ItemIndex<>PLAYER_HUMAN)) then
begin
LuotNguoidi:=False;
MayDangnghi:=False;
MainForm.COMTimer.Enabled:=True;
end;
end;
end;
{---------------------------------------------------------}
procedure TMainForm.ComTimerTimer(Sender: TObject);
var
m : Move;
begin
if MayDangnghi then Exit;
MayDangnghi:=True;
ChessBoard.Cursor:=crHourGlass;
if SidePlay=XSide then
begin
case cboPlayer1.ItemIndex of
KUKO_COM : Kuko(KukoX,NewMove);
SHASHIN_COM : Shashin(NewMove);
MARS_COM : Mars;
BLACK_ANGEL : begin
Shashin(m);
Computer_think;
if ChuaNghiXong then
begin
NewMove:=m;
ListBox.Items.Add('- Shashin -');
end
else
begin
NewMove.Row:=PlayPoint.X+1;
NewMove.Col:=PlayPoint.Y+1;
end;
end;
end;
end
else
begin
case cboPlayer2.ItemIndex of
KUKO_COM : Kuko(KukoO,NewMove);
SHASHIN_COM : Shashin(NewMove);
MARS_COM : Mars;
BLACK_ANGEL : begin
Shashin(m);
Computer_think;
if ChuaNghiXong then
begin
NewMove:=m;
ListBox.Items.Add('- Shashin -');
end
else
begin
NewMove.Row:=PlayPoint.X+1;
NewMove.Col:=PlayPoint.Y+1;
end;
end;
end;
end;
ChessBoard.Cursor:=crDefault;
if UpdateNewMove>0 then MayDangnghi:=True else MayDangnghi:=False;
if not COMvsCOM then
begin
COMTimer.Enabled:=False;
LuotNguoidi:=True;
end;
end;
{---------------------------------------------------------}
procedure TMainForm.subExitClick(Sender: TObject);
begin
Halt;
end;
{---------------------------------------------------------}
procedure TMainForm.TimeItemCheck;
begin
subT5s.Checked:=False;
subT10s.Checked:=False;
subT15s.Checked:=False;
subT20s.Checked:=False;
subT30s.Checked:=False;
subT60s.Checked:=False;
subMenuItem.Checked:=True;
end;
{---------------------------------------------------------}
procedure TMainForm.DepthItemCheck;
begin
subDepth12.Checked:=False;
subDepth13.Checked:=False;
subDepth14.Checked:=False;
subDepth15.Checked:=False;
subDepth16.Checked:=False;
subDepth17.Checked:=False;
subMenuItem.Checked:=True;
end;
{---------------------------------------------------------}
procedure TMainForm.subT5sClick(Sender: TObject);
begin
Max_Time:=5000;
TimeItemCheck(subT5s);
end;
{---------------------------------------------------------}
procedure TMainForm.subT10sClick(Sender: TObject);
begin
Max_Time:=10000;
TimeItemCheck(subT10s);
end;
{---------------------------------------------------------}
procedure TMainForm.subT15sClick(Sender: TObject);
begin
Max_Time:=15000;
TimeItemCheck(subT15s);
end;
{---------------------------------------------------------}
procedure TMainForm.subT20sClick(Sender: TObject);
begin
Max_Time:=20000;
TimeItemCheck(subT20s);
end;
{---------------------------------------------------------}
procedure TMainForm.subT30sClick(Sender: TObject);
begin
Max_Time:=30000;
TimeItemCheck(subT30s);
end;
{---------------------------------------------------------}
procedure TMainForm.subT60sClick(Sender: TObject);
begin
Max_Time:=60000;
TimeItemCheck(subT60s);
end;
{---------------------------------------------------------}
procedure TMainForm.subDepth12Click(Sender: TObject);
begin
max_nested:=12;
DepthItemCheck(subDepth12);
end;
{---------------------------------------------------------}
procedure TMainForm.subDepth13Click(Sender: TObject);
begin
max_nested:=13;
DepthItemCheck(subDepth13);
end;
{---------------------------------------------------------}
procedure TMainForm.subDepth14Click(Sender: TObject);
begin
max_nested:=14;
DepthItemCheck(subDepth14);
end;
{---------------------------------------------------------}
procedure TMainForm.subDepth15Click(Sender: TObject);
begin
max_nested:=15;
DepthItemCheck(subDepth15);
end;
{---------------------------------------------------------}
procedure TMainForm.subDepth16Click(Sender: TObject);
begin
max_nested:=16;
DepthItemCheck(subDepth16);
end;
{---------------------------------------------------------}
procedure TMainForm.subDepth17Click(Sender: TObject);
begin
max_nested:=17;
DepthItemCheck(subDepth17);
end;
{---------------------------------------------------------}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -