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

📄 main.pas

📁 基于delphi7.0
💻 PAS
字号:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, Menus, ExtCtrls, StdCtrls;

type
  TForm_Main = class(TForm)
    Panel_ChessBoard: TPanel;
    MainMenu: TMainMenu;
    TCPClient: TClientSocket;
    TCPServer: TServerSocket;
    Item_Options: TMenuItem;
    Item_NewGame: TMenuItem;
    Item_JoinGame: TMenuItem;
    Item_QuitGame: TMenuItem;
    N1: TMenuItem;
    Item_Exit: TMenuItem;
    btnQuitGame: TButton;
    btnExit: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    lblLocal: TLabel;
    lblRemote: TLabel;
    lblCurrent: TLabel;
    procedure MenuItemClick(Sender: TObject);
    procedure btnExitClick(Sender: TObject);
    procedure btnQuitGameClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TCPServerAccept(Sender: TObject; Socket: TCustomWinSocket);
    procedure TCPServerClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure TCPClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure TCPClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure SetChessBoard();        //放置棋盘函数
  end;

const
  ShowFlag :array[0..1] of string = ('红方','黑方');
  ShowColor:array[0..1] of TColor =  (clRed,clBlack);

var
  Form_Main: TForm_Main;
  IsServer:Boolean;         //判断是服务器还是客户端
  Over:Boolean;             //判断游戏是否结束
  LocalFlag,RemoteFlag,CurrentFlag:Integer;     //本方,对方,当前下子方 (0:红方;1:黑方);
  CommSocket:TCustomWinSocket;                  //收发数据,负责通信的SOCKET;
  TxBuff,RxBuff:array[0..8] of Byte;            //发送,接受缓冲区
  TxLen,RxLen:Integer;                          //发送,接受长度


procedure SendData(Socket:TCustomWinSocket;var Buf;BufLen:Integer);

implementation

uses NewGame, ChessBoard, JoinGame;

{$R *.dfm}

procedure TForm_Main.MenuItemClick(Sender: TObject);               //主菜单
begin
  case TMenuItem(Sender).Tag of
    0:          //新建游戏
    begin
      Application.CreateForm(TForm_NewGame,Form_NewGame);
      Form_NewGame.ShowModal;
      if Form_NewGame.ModalResult = mrOK then
      begin
        TCPServer.Port := StrToInt(Form_NewGame.edtServerPort.Text);
        TCPServer.Open;
        Item_NewGame.Enabled:=FALSE;
        Item_JoinGame.Enabled:=FALSE;
        Item_QuitGame.Enabled:=TRUE;
        btnQuitGame.Enabled:=TRUE;
        SetChessBoard();
        IsServer:=TRUE;
      end;
      Form_NewGame.Free;
      Form_NewGame:=nil;
    end;
    1:         //加入游戏
    begin
      Application.CreateForm(TForm_JoinGame,Form_JoinGame);
      Form_JoinGame.ShowModal;
      if Form_JoinGame.ModalResult = mrOK then
      begin
        //
      end;
      Form_JoinGame.Free;
      Form_JoinGame:=nil;
    end;
    2:         //断开游戏
    begin
      if Assigned(Form_ChessBoard) then
        Form_ChessBoard.Free;
      if TCPServer.Active then
        TCPServer.Active:=FALSE;
      if TCPClient.Active then
        TCPClient.Active:=FALSE;
      Item_NewGame.Enabled:=TRUE;
      Item_JoinGame.Enabled:=TRUE;
      Item_QuitGame.Enabled:=FALSE;
      btnQuitGame.Enabled:=FALSE;
      
      Label1.Visible := FALSE;
      Label2.Visible := FALSE;
      Label3.Visible := FALSE;
      lblLocal.Caption := '';
      lblRemote.Caption := '';
      lblCurrent.Caption := '';

      Over := TRUE;
    end;
    3:         //退出
    begin
      if TCPServer.Active then
        TCPServer.Active:=FALSE;
      if TCPClient.Active then
        TCPClient.Active:=FALSE;
        
      Over:=TRUE;
      Close;
    end;
  end;
end;

procedure TForm_Main.SetChessBoard;                                    //放置棋盘
begin
  Application.CreateForm(TForm_ChessBoard,Form_ChessBoard);
  Form_ChessBoard.Parent := Panel_ChessBoard;
  Form_ChessBoard.Align :=alTop;
  Form_ChessBoard.Show;
end;

procedure TForm_Main.btnExitClick(Sender: TObject);
begin
  if TCPServer.Active then
    TCPServer.Active:=FALSE;
  if TCPClient.Active then
    TCPClient.Active:=FALSE;
  Over:=TRUE;
  Close;
end;

procedure TForm_Main.btnQuitGameClick(Sender: TObject);
begin
  if Assigned(Form_ChessBoard) then
    Form_ChessBoard.Free;
  if TCPServer.Active then
    TCPServer.Active:=FALSE;
  if TCPClient.Active then
    TCPClient.Active:=FALSE;
  Item_NewGame.Enabled:=TRUE;
  Item_JoinGame.Enabled:=TRUE;
  Item_QuitGame.Enabled:=FALSE;
  btnQuitGame.Enabled:=FALSE;
  Label1.Visible := FALSE;
  Label2.Visible := FALSE;
  Label3.Visible := FALSE;
  lblLocal.Caption := '';
  lblRemote.Caption := '';
  lblCurrent.Caption := '';
  Over := TRUE;
end;

procedure TForm_Main.FormCreate(Sender: TObject);
begin
  Item_NewGame.Enabled:=TRUE;
  Item_JoinGame.Enabled:=TRUE;
  Item_QuitGame.Enabled:=FALSE;
  btnQuitGame.Enabled:=FALSE;
end;

procedure TForm_Main.TCPServerAccept(Sender: TObject;           //服务器接受客户端连接请求
  Socket: TCustomWinSocket);
begin
  Randomize();
  LocalFlag := Random(2);
  RemoteFlag := 1-LocalFlag;
  CurrentFlag := Random(2);

  CommSocket:=Socket;
  TxLen := 3;
  TxBuff[0] := $01;
  TxBuff[1] := RemoteFlag;
  TxBuff[2] := CurrentFlag;
  SendData(CommSocket,TxBuff,TxLen);

  Form_ChessBoard.InitChess();

  lblLocal.Caption := ShowFlag[LocalFlag];
  lblLocal.Font.Color := ShowColor[LocalFlag];
  lblRemote.Caption := ShowFlag[RemoteFlag];
  lblRemote.Font.Color := ShowColor[RemoteFlag];

  if CurrentFlag = LocalFlag then
  begin
    lblCurrent.Caption := '本方';
    ShowMessage('本方先手');
  end
  else
    lblCurrent.Caption := '对方';

end;

procedure TForm_Main.TCPServerClientRead(Sender: TObject;      //服务器端读取数据
  Socket: TCustomWinSocket);
var
  X1,X2,Y1,Y2:Integer;
begin
  RxLen:=Socket.ReceiveBuf(RxBuff,8);
  case RxBuff[0] of
    $02:
    begin
      X1:=RxBuff[1];
      Y1:=RxBuff[2];
      X2:=RxBuff[3];
      Y2:=RxBuff[4];

      FirstChess:=TImage(Form_ChessBoard.FindComponent('Chess_'+IntToStr(ChessData[X1,Y1])));
      if ChessData[X2,Y2]<>0 then
      begin
        SecondChess:=TImage(Form_ChessBoard.FindComponent('Chess_'+IntToStr(ChessData[X2,Y2])));
        SecondChess.Enabled:=False;
        SecondChess.Visible:=FALSE;
      end;

      FirstChess.Top:= 494-51*(Y2-1)-25;
      FirstChess.Left:= 35+51*(X2-1)-25;

      ChessData[X2,Y2]:=ChessData[X1,Y1];
      ChessData[X1,Y1]:=0;
      with Form_ChessBoard do
      begin
        FirstSelected.Visible:=TRUE;
        FirstSelected.Top:=494-51*(Y1-1)-25;
        FirstSelected.Left:=35+51*(X1-1)-25;
        SecondSelected.Visible:=TRUE;
        SecondSelected.Top:=494-51*(Y2-1)-25;
        SecondSelected.Left:=35+51*(X2-1)-25;
      end;
      CurrentFlag:=LocalFlag;
      lblCurrent.Caption := '本方';
    end;
  end;
end;

procedure TForm_Main.TCPClientRead(Sender: TObject;            //客户端读取数据
  Socket: TCustomWinSocket);
var
  X1,X2,Y1,Y2:Integer;
begin
  RxLen:=Socket.ReceiveBuf(RxBuff,8);
  case RxBuff[0] of
    $01:
    begin
      LocalFlag := RxBuff[1];
      RemoteFlag := 1-localFlag;
      CurrentFlag := RxBuff[2];
      Form_ChessBoard.InitChess();

      lblLocal.Caption := ShowFlag[LocalFlag];
      lblLocal.Font.Color := ShowColor[LocalFlag];
      lblRemote.Caption := ShowFlag[RemoteFlag];
      lblRemote.Font.Color := ShowColor[RemoteFlag];


      if CurrentFlag = LocalFlag then
      begin
        lblCurrent.Caption := '本方';
        ShowMessage('本方先手');
      end
      else
        lblCurrent.Caption := '对方';
    end;
    $02:
    begin
      X1:=RxBuff[1];
      Y1:=RxBuff[2];
      X2:=RxBuff[3];
      Y2:=RxBuff[4];

      FirstChess:=TImage(Form_ChessBoard.FindComponent('Chess_'+IntToStr(ChessData[X1,Y1])));
      if ChessData[X2,Y2]<>0 then
      begin
        SecondChess:=TImage(Form_ChessBoard.FindComponent('Chess_'+IntToStr(ChessData[X2,Y2])));
        SecondChess.Enabled:=False;
        SecondChess.Visible:=FALSE;
      end;

      FirstChess.Top:= 494-51*(Y2-1)-25;
      FirstChess.Left:= 35+51*(X2-1)-25;

      if (ChessData[X2,Y2]=LocalFlag*16+1) then
        Over:=True;                    //判断主帅是否被吃掉

      ChessData[X2,Y2]:=ChessData[X1,Y1];
      ChessData[X1,Y1]:=0;
      with Form_ChessBoard do
      begin
        FirstSelected.Visible:=TRUE;
        FirstSelected.Top:=494-51*(Y1-1)-25;
        FirstSelected.Left:=35+51*(X1-1)-25;
        SecondSelected.Visible:=TRUE;
        SecondSelected.Top:=494-51*(Y2-1)-25;
        SecondSelected.Left:=35+51*(X2-1)-25;
      end;
      CurrentFlag:=LocalFlag;
      lblCurrent.Caption := '本方';

      if Over then
        Application.MessageBox('你输掉了这场比赛','可惜');
    end;
  end;
end;


procedure SendData(Socket:TCustomWinSocket;var Buf;BufLen:Integer);    //游戏双方发送数据
begin
  Socket.SendBuf(Buf,bufLen);
end;

// 连接上服务器
procedure TForm_Main.TCPClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Item_NewGame.Enabled:=FALSE;
  Item_JoinGame.Enabled:=FALSE;
  Item_QuitGame.Enabled:=TRUE;
  btnQuitGame.Enabled:=TRUE;
  CommSocket :=TCPClient.Socket;
  SetChessBoard();
  IsServer:=FALSE;
end;

end.

⌨️ 快捷键说明

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