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

📄 mainunit.pas

📁 game ve co tuong moi ca ban don xem
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    end;
	begin
		If Depth=0 then
			AlphaBeta:=Eval
		else
		begin
			//Gen;
			Best:=-INFINITY;
		    i:=1;
            While (Best<Beta) and (i<=BOARD_SIZE) do
            begin
                if Best>Alpha then ALpha:=Best;
        //        For i:=1 to BOARD_SIZE do
                if (PieceColor[i])=Side then
                begin
				    p:=Piece[i];
                    j:=1;
                    while (j<=8) and (Best<Beta) do
				    //for j:=1 to 8 do
				    begin
					    if offset[p,j]=0 then break;
					    x:=mailbox90[i];
					    fcannon:=0;
					    if p in [ROOK,CANNON] then n:=9
					    else n:=1;
					    For k:=1 to n do
					    begin
					    	if (p=PAWN) and (side=RED) then
					    		x:=x-offset[p,j]
				    		else
				    			x:=x+offset[p,j];
				    		y:=mailbox182[x];
				    		if side=DARK then t:=y
				    		else t:=91-y;
				    		if (y=-1) or ((legalposition[t] and maskpiece[p])=0) then break;
                            if fcannon=0 then
                            begin
                                if (PieceColor[y])<>Side then
                                begin
                                    case p of
                                        KNIGHT:If PieceColor[i+knightcheck[j]]=EMPTY then common(i,y);
                                        ELEPHANT:if PieceColor[i+elephantCheck[j]]=EMPTY then common(i,y);
                                        CANNON:begin
                                                If PieceColor[y]=EMPTY then common(i,y);
                                               end;
                                        else common(i,y);
                                    end;
                                end;
                                if PieceColor[y]<>EMPTY then
                                    if p=CANNON then fCannon:=1
                                    else break;
                            end
                            else
                            begin
                                if PieceColor[y]<>EMPTY then
                                begin
                                    if (PieceColor[y])=3-Side then common(i,y);
                                    break;
                                end;
                            end
				    	end;
                        j:=j+1;
                    end{While}
				end;{If}
                i:=i+1;
            end;{While}
            AlphaBeta:=Best;
        end;
      //  Application.ProcessMessages;
	end;
	Procedure TMainForm.ComputerThink;
    var Best:Integer;
        x,y,x1,y1:integer;
        Lost:boolean;
	begin
        ComputerThinking:=true;
        Lost:=false;
        Side:=DARK;
        EvalCount:=0;
        Best:=AlphaBeta(-Infinity,Infinity,Max_Fly);
        x:=(NewMove.Source mod 9);
       // if x=0 then x:=9;
        y:=(NewMove.Source div 9) + 1;
        if x=0 then
        begin
            x:=9;
            y:=y-1;
        end;
        x1:=(NewMove.Dest mod 9);
        //if x1=0 then x1:=9;
        y1:=(NewMove.Dest div 9) + 1;
        if x1=0 then
        begin
            x1:=9;
            y1:=y1-1;
        end;
        if Piece[NewMove.Dest]=KING then Lost:=true;
        Piece[NewMove.Dest]:=Piece[NewMove.Source];
        Piece[NewMove.Source]:=EMPTY;
        PieceColor[NewMove.Dest]:=PieceColor[NewMove.Source];
        PieceColor[NewMove.Source]:=EMPTY;
        If Piece_Pointer[y1,x1]<>nil then
            Piece_Pointer[y1,x1].visible:=false
        else
            New(Piece_Pointer[y1,x1]);
        OrinPiece_Coor.X:=Piece_Pointer[y,x].Left;
    	OrinPiece_Coor.Y:=Piece_Pointer[y,x].Top;
        Piece_Pointer[y1,x1]^:=Piece_Pointer[y,x]^;
        Piece_Pointer[y,x]:=nil;
        Piece_Pointer[y1,x1].Left:=OrinPiece_Coor.X+(x1-x)*CrossPiece_Size.X;
        Piece_Pointer[y1,x1].Top:=OrinPiece_Coor.y+(y1-y)*CrossPiece_Size.y;
        Piece_Pointer[y1,x1].Visible:=true;
        //Mainform.close;
//        Edit1.text:=IntToStr(Best);
        computerThinking:=false;
        if lost then
        begin
            ShowMessage('Bạn tâm phục khẩu phục chưa.Về nhà giở vở học thêm nhé');
            NewGame;
        end;
;
	end;



{$R *.dfm}
Procedure TMainForm.NewGame;

var i,j:integer;
begin
    for i:=1 to BOARD_SIZE do
        Piece[i]:=NewPiece[i];
    for i:=1 to BOARD_SIZE do
        PieceColor[i]:=NewPieceColor[i];
    for i:=1 to 10 do
        for j:=1 to 9 do
            if Piece_Pointer[i,j]<>nil then
                Piece_Pointer[i,j]:=nil;
    for i:=0 to 1 do
	begin
		for j:=1 to 9 do
			new(Piece_Pointer[1+9*i,j]);
		for j:=0 to 4 do
			new(Piece_Pointer[4+3*i,1+2*j]);
		for j:=0 to 1 do
			new(Piece_Pointer[3+5*i,2+6*j]);
	end;
	//edit1.Enabled:=(Piece_Pointer[3,1]=nil);
	Piece_Pointer[1,1]^:=imgXeDen1;
	Piece_Pointer[1,9]^:=imgXeDen2;
	Piece_Pointer[1,2]^:=imgMaDen1;
	Piece_Pointer[1,8]^:=imgmaDen2;
	Piece_Pointer[1,3]^:=imgTinhDen1;
	Piece_Pointer[1,7]^:=imgTinhDen2;
	Piece_Pointer[1,4]^:=imgSiDen1;
	Piece_Pointer[1,6]^:=imgSiDen2;
	Piece_Pointer[1,5]^:=imgTuongDen;
	Piece_Pointer[10,1]^:=imgXeRed1;
	Piece_Pointer[10,9]^:=imgXeRed2;
	Piece_Pointer[10,2]^:=imgMaRed1;
	Piece_Pointer[10,8]^:=imgMaRed2;
	Piece_Pointer[10,3]^:=imgTinhRed1;
	Piece_Pointer[10,7]^:=imgTinhRed2;
	Piece_Pointer[10,4]^:=imgSiRed1;
	Piece_Pointer[10,6]^:=imgSiRed2;
	Piece_Pointer[10,5]^:=imgTuongRed;
	Piece_Pointer[3,2]^:=imgPhaoDen1;
	Piece_Pointer[3,8]^:=imgPhaoDen2;
	Piece_Pointer[8,2]^:=imgPhaoRed1;
	Piece_Pointer[8,8]^:=imgPhaoRed2;
	Piece_Pointer[4,1]^:=imgTotDen1;
	Piece_Pointer[4,3]^:=imgTotDen2;
	Piece_Pointer[4,5]^:=imgTotDen3;
	Piece_Pointer[4,7]^:=imgTotDen4;
	Piece_Pointer[4,9]^:=imgTotDen5;
	Piece_Pointer[7,1]^:=imgTotRed1;
	Piece_Pointer[7,3]^:=imgTotRed2;
	Piece_Pointer[7,5]^:=imgTotRed3;
	Piece_Pointer[7,7]^:=imgTotRed4;
	Piece_Pointer[7,9]^:=imgTotRed5;
    for i:=1 to 10 do
        for j:=1 to 9 do
            if Piece_Pointer[i,j]<>nil then
            begin
                Piece_Pointer[i,j].visible:=true;
                Piece_Pointer[i,j].left:=Board_Left+(j-1)*CrossPiece_Size.X;
                Piece_Pointer[i,j].top:=Board_Top+(i-1)*CrossPiece_Size.Y;
            end;
    if Not HumanGo then ComputerThink;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin

	Board_Left:=ImgBoard.Left;
	Board_Top:=ImgBoard.Top;
	CrossPiece_Size.X:=(imgXeDen2.Left-imgXeDen1.Left) div 8;
	CrossPiece_Size.Y:=(imgBoard.height) div 10;
	FirstPiece_Coor.X:=Board_Left+CrossPiece_Size.X div 2;
	FirstPiece_Coor.Y:=Board_Top+CrossPiece_size.Y div 2;
        NewGame;

end;
procedure TMainForm.imgRedPieceMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
	var OK:boolean;
		a:TPoint;
begin
	RedPieceMouseDown:=true;
	RedMouseX:=X;
	RedMouseY:=Y;
	OrinPiece_Coor.X:=(Sender as TImage).Left;
	OrinPiece_Coor.Y:=(Sender as TImage).Top;
	a.x:=(sender as TImage).Left+(sender as TImage).Width div 2;//x;//OrinPiece_Coor.X + CrossPiece_Size.X div 2;
	a.y:=(sender as TImage).top+(sender as TImage).height div 2;//y;//OrinPiece_Coor.y + CrossPiece_Size.y div 2;
	GetInBoardCoor(a,OrinInBoard_Coor,OK);
	(Sender as TImage).BringToFront;
end;

procedure TMainForm.imgRedPieceMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
    if not ComputerThinking then
	if RedPieceMouseDown then
	begin
		if (ABS(x-RedMouseX)>=10) or (ABS(y-RedMouseY)>=10) then
		begin
			(Sender as TImage).Left:=(Sender as TImage).Left+X-RedMouseX;
			(Sender as TImage).Top:=(Sender as TImage).Top+Y-RedMouseY;
		end;
	end;
	//
end;

procedure TMainForm.imgRedPieceMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
	var Mouse_Coor,InBoard_Coor:TPoint;
		OK:boolean;
        HumanMove:Move;
        Won:boolean;
begin
    Won:=false;
    if ComputerThinking then
    begin
        (Sender as TImage).Left:=OrinPiece_Coor.x;
		(Sender as TImage).Top:=OrinPiece_Coor.Y;
        exit;
    end;
	RedPieceMouseDown:=false;
	Mouse_Coor.x:=(sender as TImage).Left+(sender as TImage).Width div 2;
	Mouse_Coor.y:=(sender as TImage).Top+(sender as TImage).Height div 2;
	GetInBoardCoor(Mouse_Coor,InBoard_Coor,OK);
	if OK and (Mouse_Coor.x<>InBoard_Coor.x) and (Mouse_Coor.y<>InBoard_Coor.y) then
	begin
		OK:=CheckHumanMove(OrinInBoard_Coor,InBoard_Coor);
		if OK then
		begin
            HumanMove.Source:=(OrinInBoard_Coor.Y-1)*SIZE_X+OrinInBoard_Coor.X;
            HumanMove.Dest:=(InBoard_Coor.Y-1)*SIZE_X+InBoard_Coor.x;
			if Piece_Pointer[InBoard_Coor.y,InBoard_Coor.x]<>nil then
			begin
				Piece_Pointer[InBoard_Coor.Y,InBoard_Coor.x].Visible:=false;
			end
			else
				new(Piece_Pointer[InBoard_Coor.Y,InBoard_Coor.x]);

			Piece_Pointer[InBoard_Coor.Y,InBoard_Coor.x]^:=(Sender as TImage);
			(Sender as TImage).Left:=OrinPiece_Coor.X+(InBoard_Coor.X-OrinInBoard_Coor.X)*CrossPiece_Size.X;
			(Sender as TImage).top:=OrinPiece_Coor.y+(InBoard_Coor.y-OrinInBoard_Coor.y)*CrossPiece_Size.y;
            (Sender as TImage).visible:=true;
            if Piece[HumanMove.Dest]=KING then Won:=true;
			Piece[HumanMove.Dest]:=Piece[HumanMove.Source];
			Piece[HumanMove.Source]:=0;
            PieceColor[HumanMove.Dest]:=PieceColor[HumanMove.Source];
			PieceColor[HumanMove.Source]:=0;
			Piece_Pointer[OrinInBoard_Coor.Y,OrinInBoard_Coor.X]:=nil;
            if Won then
            begin
                ShowMessage('Tha ván này thui!Ván sau đánh cho te tua!');
                NewGame;
            end
            else
            begin
                ComputerThink;
            end;
		end;
	end;
	if not OK then
	begin
		(Sender as TImage).Left:=OrinPiece_Coor.x;
		(Sender as TImage).Top:=OrinPiece_Coor.Y;
	end;
end;
procedure TMainForm.imgTuongRedClick(Sender: TObject);
begin
ShowMessage(' Ha ha bạn phải chạy tướng rùi à.Giỏi thì đứng lại chọi nhau!');
end;

procedure TMainForm.M1Click(Sender: TObject);
 var
  openDialog : TOpenDialog;
begin
  openDialog := TOpenDialog.Create(Application);
  openDialog.InitialDir := GetCurrentDir;
  openDialog.Options := [ofFileMustExist];
  openDialog.Filter :=
    'Delphi project files|*.dpr|Delphi pascal files|*.pas';
  openDialog.FilterIndex := 2;

  if openDialog.Execute
  then ShowMessage('Trong thời gian tới tôi sẽ hỗ tợ chức năng này ')
  else ShowMessage('Bạn chưa chọn file');
  openDialog.Free;
end;

procedure TMainForm.MainFormMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
	if RedPieceMouseDown then
	begin
		if ABS(x-RedMouseX)>=10 then
		begin

			showMessage('Bạn thử đi hơn 10 nước mà vẵn chưa hiệu quả');
		end;
	end;
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -