📄 game.pas
字号:
end;
end;
if j = 1 then
Break;
if (FnCountNumber = FnCurrentNumber[1]) or (FnCountNumber = FnCurrentNumber[2]) or (FnCountNumber = FnCurrentNumber[3]) then
begin
if FnCountNumber <> 1 then
begin //FnCountNumber = 1 Lose
for i := 1 to 3 do
if FnCurrentNumber[i] <> 0 then
FnLineNumber := i;
FnNumber := FnCountNumber - 1;
end;
Break;
end;
if (FnCurrentNumber[1] = 0) or (FnCurrentNumber[2] = 0) or (FnCurrentNumber[3] = 0) then
begin
if FnCountNumber = 2 then
begin
for i := 1 to 2 do
if FnCurrentNumber[i] = 1 then
FnLineNumber := FnLineNumber + i;
if FnLineNumber = 3 then
FnLineNumber := trunc(Int(random * 2)) + 1;
FnNumber := 1;
Break;
end;
if (FnCurrentNumber[1] = 1) or (FnCurrentNumber[2] = 1) or (FnCurrentNumber[3] = 1) then
begin
for i := 1 to 3 do
if FnCurrentNumber[i]>1 then
FnLineNumber := i;
FnNumber := FnCountNumber-1;
Break;
end;
if (FnCurrentNumber[1] <> FnCurrentNumber[2]) and (FnCurrentNumber[2] <> FnCurrentNumber[3]) and (FnCurrentNumber[3] <> FnCurrentNumber[1]) then
begin
for i := 1 to 3 do
if FnCurrentNumber[i] > FnCountNumber / 2 then
FnLineNumber := i;
if FnCurrentNumber[1] = 0 then
FnNumber := abs(FnCurrentNumber[2] - FnCurrentNumber[3]);
if FnCurrentNumber[2]=0 then
FnNumber := abs(FnCurrentNumber[1] - FnCurrentNumber[3]);
if FnCurrentNumber[3]=0 then
FnNumber := abs(FnCurrentNumber[1] - FnCurrentNumber[2]);
Break;
end
else
begin
for i := 1 to 2 do
if FnCurrentNumber[i] <> 0 then
FnLineNumber := FnLineNumber + i;
if FnLineNumber = 3 then
FnLineNumber := trunc(Int(random * 2)) + 1;
FnNumber := 1;
Break;
end;
end;
if (FnCurrentNumber[1] = FnCurrentNumber[2]) and (FnCurrentNumber[2] = FnCurrentNumber[3]) then
begin
FnLineNumber := trunc(Int(random * 3)) + 1;
FnNumber := FnCurrentNumber[1];
Break;
end;
if (FnCountNumber - FnCurrentNumber[1] = 2) or (FnCountNumber - FnCurrentNumber[2] = 2) or (FnCountNumber - FnCurrentNumber[3] = 2) then
begin
for i := 1 to 3 do
if FnCurrentNumber[i] <> 1 then
FnLineNumber := i;
FnNumber := FnCountNumber - 3;
Break;
end;
if (FnCurrentNumber[1] = FnCurrentNumber[2]) or (FnCurrentNumber[2] = FnCurrentNumber[3]) or (FnCurrentNumber[3] = FnCurrentNumber[1]) then
begin
if FnCurrentNumber[1] = FnCurrentNumber[2] then
FnLineNumber := 3;
if FnCurrentNumber[2] = FnCurrentNumber[3] then
FnLineNumber := 1;
if FnCurrentNumber[1] = FnCurrentNumber[3] then
FnLineNumber := 2;
FnNumber := FnCurrentNumber[FnLineNumber];
Break;
end;
if (FnCountNumber - FnCurrentNumber[1] = 3) or (FnCountNumber - FnCurrentNumber[2] = 3) or (FnCountNumber - FnCurrentNumber[3] = 3) or (FnCountNumber - FnCurrentNumber[1] = 4) or (FnCountNumber - FnCurrentNumber[2]= 4)
or (FnCountNumber - FnCurrentNumber[3] = 4) or ((FnCountNumber - FnCurrentNumber[1] = 5) and (abs(FnCurrentNumber[2] - FnCurrentNumber[3]) = 1))
or ((FnCountNumber - FnCurrentNumber[2] = 5) and (abs(FnCurrentNumber[1] - FnCurrentNumber[3]) = 1))
or ((FnCountNumber - FnCurrentNumber[3] = 5) and (abs(FnCurrentNumber[1] - FnCurrentNumber[2]) = 1)) then
begin
for i := 1 to 3 do
if FnCurrentNumber[i] > 3 then
FnLineNumber := i;
FnNumber := FnCountNumber-6;
Break;
end;
if (FnCountNumber - FnCurrentNumber[1] = 5) or (FnCountNumber - FnCurrentNumber[2] = 5) or (FnCountNumber - FnCurrentNumber[3] = 5) or ((FnCountNumber - FnCurrentNumber[1] = 6) and (abs(FnCurrentNumber[2] - FnCurrentNumber[3]) = 4))
or ((FnCountNumber - FnCurrentNumber[2] = 6) and (abs(FnCurrentNumber[1] - FnCurrentNumber[3]) = 4))
or ((FnCountNumber - FnCurrentNumber[3] = 6) and (abs(FnCurrentNumber[1] - FnCurrentNumber[2]) = 4)) then
begin
for i := 1 to 3 do
if FnCurrentNumber[i] > 5 then
FnLineNumber := i;
FnNumber := FnCountNumber - 10;
Break;
end;
if (FnCountNumber - FnCurrentNumber[1] = 9) and (abs(FnCurrentNumber[2] - FnCurrentNumber[3]) = 1) then
begin
FnLineNumber := 1;
FnNumber := FnCountNumber-10;
Break;
end;
for i := 1 to 3 do
if FnCountNumber - FnCurrentNumber[i] = 12 - 2 * i then
FnLineNumber := i;
FnNumber := FnCountNumber - 12;
Break;
end;
if FnCountNumber <= 1 then
begin
if FnCountNumber = 0 then //Lose
case trunc(int(random * 4)) + 1 of
1: Application.MessageBox('你输了!', '隐藏游戏 - 你输了', MB_ICONINFORMATION or mb_OK);
2: Application.MessageBox('笨蛋!', '隐藏游戏 - 你输了', MB_ICONINFORMATION or mb_OK);
3: Application.MessageBox('弱智!', '隐藏游戏 - 你输了', MB_ICONINFORMATION or mb_OK);
4: Application.MessageBox('白痴!', '隐藏游戏 - 你输了', MB_ICONINFORMATION or mb_OK);
end
else //Win
case trunc(Int(random * 4)) + 1 of
1: Application.MessageBox('你赢了!', '隐藏游戏 - 你赢了', MB_ICONINFORMATION or mb_OK);
2: Application.MessageBox('厉害!', '隐藏游戏 - 你赢了', MB_ICONINFORMATION or mb_OK);
3: Application.MessageBox('了不得', '隐藏游戏 - 你赢了', MB_ICONINFORMATION or mb_OK);
4: Application.MessageBox('我要砍了你!', '隐藏游戏 - 你赢了', MB_ICONINFORMATION or mb_OK);
end;
ItemNewGame.Enabled := True;
FboolPCThink := False;
Exit;
end
else
begin
Timer1.Interval := 1000;
Timer1.Enabled := True;
end;
end;
procedure TFormGame.ItemExitClick(Sender: TObject);
begin
Close;
end;
procedure TFormGame.ItemAboutClick(Sender: TObject);
begin
with TFormGameAbout.Create(nil) do
begin
ShowModal;
Free;
end;
end;
procedure TFormGame.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
LabelPCLine.Caption := IntToStr(FnLineNumber);
LabelPCNumber.Caption := IntToStr(FnNumber);
DrawDogsSelected;
Timer2.Interval := 500;
Timer2.Enabled := True;
end;
procedure TFormGame.Timer2Timer(Sender: TObject);
begin
Timer2.Enabled := False;
BtnChange.Enabled := True;
ItemChange.Enabled := True;
FboolClickFlag := True;
EditManLine.Text := '';
EditManNumber.Text := '';
EditManLine.SetFocus;
EditManLine.SelectAll;
FboolClickFlag := False;
DrawDogs;
FboolPCThink := False;
end;
procedure TFormGame.EditManLineKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (key = 40) or (key = 13) then
EditManNumber.SetFocus;
end;
procedure TFormGame.EditManNumberKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (key = 38) or (key = 40) then
EditManLine.SetFocus;
if key = 13 then
BtnChange.Click;
end;
procedure TFormGame.OnEditManChange(Sender: TObject);
var strManNumer : string;
i, j : integer;
begin
if FboolClickFlag then Exit;
with TEdit(Sender) do
begin
SetFocus;
SelectAll;
end;
for i := 1 to 3 do
for j := FnInitNumber[i] - FnCurrentNumber[i] + FnFirstNumber[i] to FnLastNumber[i] do
begin
FImageDogs[j].Picture := ImagePic.Picture;
FnImageFlag[j] := 1;
end;
FnLineNumber := 0;
FnNumber := 0;
strManNumer := '0' + EditManLine.Text;
if (Length(strManNumer) = 2) and (strManNumer > '00') and (strManNumer < '04') then
FnLineNumber := StrToInt(strManNumer);
strManNumer := '0' + EditManNumber.Text;
if (Length(strManNumer) = 2) and (strManNumer > '00') and (strManNumer < '08') then
FnNumber := StrToInt(strManNumer);
if ((FnLineNumber < 1) or (FnLineNumber > 3)) or (FnCurrentNumber[FnLineNumber] = 0) or ((FnNumber < 1) or (FnNumber > FnCurrentNumber[FnLineNumber])) then
Exit;
DrawDogsSelected;
end;
procedure TFormGame.OnImageDogsClick(Sender: TObject);
var i, nIndex : integer;
begin
if FboolPCThink then
Exit;
FboolClickFlag := True;
nindex := StrToInt((Sender as TImage).Hint);
if FnImageFlag[nIndex] <> 0 then
begin
for i := 1 to 3 do
if (nIndex >= FnFirstNumber[i]) and (nIndex <= FnLastNumber[i]) then
FnLineNumber := i;
FnNumber := nIndex-(FnInitNumber[FnLineNumber] - FnCurrentNumber[FnLineNumber] + FnFirstNumber[FnLineNumber]) + 1;
EditManLine.Text := IntToStr(FnLineNumber);
EditManNumber.Text := IntToStr(FnNumber);
DrawDogsSelected;
end;
FboolClickFlag := False;
end;
procedure TFormGame.OnImageDogsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var nIndex : integer;
begin
if (FboolPCThink) or (Button <> mbRight) then
Exit;
nIndex := StrToInt((Sender as TImage).Hint);
if FnImageFlag[nIndex] = 2 then
BtnChange.Click;
end;
procedure TFormGame.DrawDogs();
var i : integer;
begin
for i := FnFirstNumber[FnLineNumber] to FnLastNumber[FnLineNumber] do
if FnImageFlag[i] = 2 then
begin
FImageDogs[i].Picture := ImageNone.Picture;
FnImageFlag[i] := 0;
end;
FnCurrentNumber[FnLineNumber] := FnCurrentNumber[FnLineNumber] - FnNumber;
end;
procedure TFormGame.DrawDogsSelected();
var i, j : integer;
begin
for i := 1 to 3 do
for j := FnInitNumber[i] - FnCurrentNumber[i] + FnFirstNumber[i] to FnLastNumber[i] do
begin
FImageDogs[j].Picture := ImagePic.Picture;
FnImageFlag[j] := 1;
end;
for j := FnInitNumber[FnLineNumber] - FnCurrentNumber[FnLineNumber] + FnFirstNumber[FnLineNumber] to FnInitNumber[FnLineNumber] - FnCurrentNumber[FnLineNumber] + FnFirstNumber[FnLineNumber] + FnNumber - 1 do
begin
FImageDogs[j].Picture := ImageSelected.Picture;
FnImageFlag[j] := 2;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -