📄 game.pas
字号:
{
模块名称:隐藏游戏
使用方法:1、Show
返回值: 无
}
unit Game;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus, ExtCtrls, Buttons;
type
TFormGame = class(TForm)
MainMenu: TMainMenu;
ItemGame: TMenuItem;
ItemNewGame: TMenuItem;
ItemPCFirst: TMenuItem;
ItemManFirst: TMenuItem;
ItemChange: TMenuItem;
fg3: TMenuItem;
ItemExit: TMenuItem;
ItemHelp: TMenuItem;
ItemHelpReadme: TMenuItem;
ItemReadme1: TMenuItem;
ItemReadme2: TMenuItem;
ItemReadme3: TMenuItem;
ItemReadme4: TMenuItem;
ItemReadme5: TMenuItem;
ItemReadme6: TMenuItem;
ItemReadme7: TMenuItem;
fg4: TMenuItem;
ItemAbout: TMenuItem;
Item_fg: TBevel;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Image5: TImage;
Image6: TImage;
Image7: TImage;
Image8: TImage;
Image9: TImage;
Image10: TImage;
Image11: TImage;
Image12: TImage;
Image13: TImage;
Image14: TImage;
Image15: TImage;
ImagePic: TImage;
ImageSelected: TImage;
ImageNone: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
LabelPCLine: TLabel;
LabelPCNumber: TLabel;
EditManLine: TEdit;
EditManNumber: TEdit;
BtnChange: TButton;
Timer1: TTimer;
Timer2: TTimer;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ItemPCFirstClick(Sender: TObject);
procedure ItemManFirstClick(Sender: TObject);
procedure BtnChangeClick(Sender: TObject);
procedure ItemExitClick(Sender: TObject);
procedure ItemAboutClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure EditManLineKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure EditManNumberKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure OnEditManChange(Sender: TObject);
procedure OnImageDogsClick(Sender: TObject);
procedure OnImageDogsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure DrawDogs;
procedure DrawDogsSelected;
private
{ Private declarations }
FImageDogs : array [1 .. 15] of TImage; //图片数组
FnCurrentNumber, FnInitNumber : array [1 .. 3] of integer; //棋子的个数和原始状态
FnFirstNumber, FnLastNumber : array[1 .. 3] of integer; //每行棋子的开始、结束数目
FnLineNumber, FnNumber, FnCountNumber : integer; //所拿旗子的行数、个数、总和
FboolPC : boolean; //人或电脑先走
FboolPCThink : boolean; //电脑考虑标志
FboolClickFlag : boolean; //单击判断
FnLoseModal : array [1 .. 3, 1 .. 12] of integer; //输棋的形式
FnImageFlag : array [1 .. 15] of integer; //棋子状态 0:无 1:有 2:删除
public
{ Public declarations }
end;
var
FormGame : TFormGame;
implementation
uses GameAbout;
{$R *.DFM}
procedure TFormGame.FormShow(Sender: TObject);
var i : integer;
begin
//初始化图片数组
for i := 1 to 15 do
FImageDogs[i] := (FindComponent('Image' + IntToStr(i)) as TImage);
//初始化"换手"按钮和菜单
BtnChange.Enabled := True;
ItemChange.Enabled := True;
//棋子的个数和原始状态
FnInitNumber[1] := 3;
FnInitNumber[2] := 5;
FnInitNumber[3] := 7;
FnCurrentNumber[1] := FnInitNumber[1];
FnCurrentNumber[2] := FnInitNumber[2];
FnCurrentNumber[3] := FnInitNumber[3];
FnFirstNumber[1] := 1;
FnFirstNumber[2] := 4;
FnFirstNumber[3] := 9;
FnLastNumber[1] := 3;
FnLastNumber[2] := 8;
FnLastNumber[3] := 15;
//参数初始化
FnLineNumber := 0;
FnNumber := 0;
FboolPC := False;
FboolPCThink := False;
FboolClickFlag := False;
EditManLine.Text := '';
EditManNumber.Text := '';
LabelPCLine.Caption := '';
LabelPCNumber.Caption := '';
FnLoseModal[1, 1] := 1; FnLoseModal[2, 1] := 2; FnLoseModal[3, 1] := 3;
FnLoseModal[1, 2] := 1; FnLoseModal[2, 2] := 3; FnLoseModal[3, 2] := 2;
FnLoseModal[1, 3] := 2; FnLoseModal[2, 3] := 1; FnLoseModal[3, 3] := 3;
FnLoseModal[1, 4] := 2; FnLoseModal[2, 4] := 3; FnLoseModal[3, 4] := 1;
FnLoseModal[1, 5] := 3; FnLoseModal[2, 5] := 1; FnLoseModal[3, 5] := 2;
FnLoseModal[1, 6] := 3; FnLoseModal[2, 6] := 2; FnLoseModal[3, 6] := 1;
FnLoseModal[1, 7] := 1; FnLoseModal[2, 7] := 4; FnLoseModal[3, 7] := 5;
FnLoseModal[1, 8] := 1; FnLoseModal[2, 8] := 5; FnLoseModal[3, 8] := 4;
FnLoseModal[1, 9] := 2; FnLoseModal[2, 9] := 4; FnLoseModal[3, 9] := 6;
FnLoseModal[1, 10] := 2; FnLoseModal[2, 10] := 5; FnLoseModal[3, 10] := 7;
FnLoseModal[1, 11] := 3; FnLoseModal[2, 11] := 4; FnLoseModal[3, 11] := 7;
FnLoseModal[1, 12] := 3; FnLoseModal[2, 12] := 5; FnLoseModal[3, 12] := 6;
//初始化Image框
for i := 1 to 15 do
begin
with FImageDogs[i] do
begin
OnClick := OnImageDogsClick;
OnMouseDown := OnImageDogsMouseDown;
Picture := ImagePic.Picture;
end;
FnImageFlag[i] := 1;
end;
end;
procedure TFormGame.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if FboolPCThink then
begin
Timer1.Enabled := False;
Timer2.Enabled := False;
end;
end;
procedure TFormGame.ItemPCFirstClick(Sender: TObject);
begin
ItemNewGame.Enabled := False;
if FboolPCThink then
begin
Timer1.Enabled := False;
Timer2.Enabled := False;
end;
FormShow(Self);
FboolPC := True;
BtnChange.Click;
end;
procedure TFormGame.ItemManFirstClick(Sender: TObject);
begin
ItemNewGame.Enabled := False;
if FboolPCThink then
begin
Timer1.Enabled := False;
Timer2.Enabled := False;
end;
FormShow(Self);
FboolPC := False;
EditManLine.SetFocus;
EditManLine.SelectAll;
end;
procedure TFormGame.BtnChangeClick(Sender: TObject);
var strManNumer : string;
i, j, k : integer;
begin
if not BtnChange.Enabled then Exit;
if FboolPC then
FboolPC := False
else
begin
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) then
begin
with EditManLine do
begin
SetFocus;
SelectAll;
Exit;
end;
end;
if FnCurrentNumber[FnLineNumber] = 0 then
begin
with EditManLine do
begin
SetFocus;
SelectAll;
Exit;
end;
end;
if (FnNumber < 1) or (FnNumber > FnCurrentNumber[FnLineNumber]) then
begin
with EditManNumber do
begin
SetFocus;
SelectAll;
Exit;
end;
end;
DrawDogs;
end;
while True do
begin
FboolPCThink := True;
BtnChange.Enabled := False;
ItemChange.Enabled := False;
FnCountNumber := FnCurrentNumber[1] + FnCurrentNumber[2] + FnCurrentNumber[3];
FnLineNumber := 0;
FnNumber := 0;
if FnCountNumber = 15 then
begin
FnLineNumber := trunc(Int(Random * 3)) + 1;
FnNumber := 1;
Break;
end;
if FnCountNumber=0 then //Win
Break;
j := 0;
for i := 1 To 12 do
begin
if (FnCurrentNumber[1] = FnLoseModal[1, i]) and (FnCurrentNumber[2] = FnLoseModal[2, i]) and (FnCurrentNumber[3] = FnLoseModal[3, i]) then
begin
while (j = 0) do
begin
FnLineNumber := trunc(Int(random * 3)) + 1;
FnNumber := 1;
if FnCurrentNumber[FnLineNumber] >= 3 then
FnNumber := trunc(Int(random * 2)) + 1;
for k := 1 to FnLineNumber do
if (k <> FnLineNumber) and (FnCurrentNumber[k] = FnCurrentNumber[FnLineNumber] - FnNumber) then
j := 1;
j := 1 - j;
end;
j := 1;
Break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -