⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.pas

📁 电子小说阅读器v2.68可用于阅读pdf.html等各种形式的文档
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{
模块名称:隐藏游戏

使用方法: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 + -