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

📄 main.pas

📁 Delphi7.0平台开发
💻 PAS
字号:
unit Main;

interface

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

type
  TForm_Main = class(TForm)
    Panel_ChessBoard: TPanel;
    MainMenu: TMainMenu;
    Item_Options: TMenuItem;
    Item_NewGame: TMenuItem;
    Item_JoinGame: TMenuItem;
    Item_QuitGame: TMenuItem;
    N1: TMenuItem;
    Item_Exit: TMenuItem;
    Splitter1: TSplitter;
    TCPClient: TClientSocket;
    TCPServer: TServerSocket;
    Label1: TLabel;
    Image_Local: TImage;
    Label2: TLabel;
    Image_Remote: TImage;
    Label3: TLabel;
    lblCurrent: TLabel;
    btnQuitGame: TButton;
    btnExit: TButton;
    procedure MenuItemClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    Procedure SetChessBoard();
    procedure TCPServerAccept(Sender: TObject; Socket: TCustomWinSocket);
    procedure TCPClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure TCPServerClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure btnQuitGameClick(Sender: TObject);
    procedure btnExitClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form_Main: TForm_Main;
  LocalFlag,RemoteFlag,CurrentFlag:Integer;{0:黑方;1:白方}
  IsServer:Boolean;
  TxBuff:array[0..3] of Byte;
  RxBuff:array[0..3] of Byte;
  TxLen :Integer;
  RxLen :Integer;
  LocalSocket: TCustomWinSocket; //本地收发数据的SOCKET

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

implementation

uses JoinGame, ChessBoard;

{$R *.dfm}

procedure TForm_Main.MenuItemClick(Sender: TObject);
begin
  case TMenuItem(Sender).Tag of
    0:
    begin
      TCPServer.Port:=1001;
      TCPServer.Open;
      Item_NewGame.Enabled:=FALSE;
      Item_JoinGame.Enabled:=FALSE;
      Item_QuitGame.Enabled:=TRUE;
      btnQuitGame.Enabled:=TRUE;
      SetChessBoard();
      IsServer:=TRUE;
    end;
    1:
    begin
      Application.CreateForm(TForm_JoinGame,Form_JoinGame);
      Form_JoinGame.ShowModal;
      if Form_JoinGame.ModalResult = mrOK then
      begin
        TCPClient.Host := Form_JoinGame.edtRemoteHost.Text;
        TCPClient.Port :=1001;
        TCPClient.Open;
        Item_NewGame.Enabled:=FALSE;
        Item_JoinGame.Enabled:=FALSE;
        Item_QuitGame.Enabled:=TRUE;
        btnQuitGame.Enabled:=TRUE;
        SetChessBoard();
        IsServer:=FALSE;
      end;
      Form_JoinGame.Free;
      Form_JoinGame := nil;
    end;
    2:
    begin
      TCPClient.Close;
      TCPServer.Close;
      Item_NewGame.Enabled:=TRUE;
      Item_JoinGame.Enabled:=TRUE;
      Item_QuitGame.Enabled:=FALSE;
      btnQuitGame.Enabled:=FALSE;
      Form_ChessBoard.Free;
      Form_ChessBoard:=nil;
    end;
    3:
    begin
      Close;
    end;
  end;
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.SetChessBoard;
begin
  Application.CreateForm(TForm_ChessBoard,Form_ChessBoard);
  Form_ChessBoard.Parent := Panel_ChessBoard;
  Form_ChessBoard.Align  :=alTop;
  Form_ChessBoard.Show;
end;

procedure TForm_Main.TCPServerAccept(Sender: TObject;
  Socket: TCustomWinSocket);
var
  img:TBitmap;
begin
  Randomize();
  LocalFlag:=Random(2);
  if LocalFlag = 1 then
    RemoteFlag := 0
  else
    RemoteFlag := 1;


  CurrentFlag:=Random(2);

  Form_ChessBoard.ChessList.GetBitmap(LocalFlag,Image_Local.Picture.Bitmap);
  Form_ChessBoard.ChessList.GetBitmap(RemoteFlag,Image_Remote.Picture.Bitmap);

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

  if LocalFlag=CurrentFlag then
  begin
    Application.MessageBox('本方开始下棋','提示',MB_ICONINFORMATION+MB_OK);
    lblCurrent.Caption :='本方';
  end
  else
    lblCurrent.Caption :='对方';

  Over := FALSE;
end;

procedure TForm_Main.TCPClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i,j:Integer;
begin
  RxLen:=Socket.ReceiveBuf(RxBuff,256);
  case RxBuff[0] of
    $01:             //指定开始的双方的颜色,谁先下(两个数,由SERVER发送);
    begin
      if RxLen<>3 then
      begin
        Application.MessageBox('传送数据出错','警告',MB_ICONEXCLAMATION+MB_OK);
        Exit;
      end
      else
      begin
        LocalFlag:=RxBuff[1];
        CurrentFlag := RxBuff[2];
        if LocalFlag = 1 then
          RemoteFlag := 0
        else
          RemoteFlag := 1;
        Form_ChessBoard.ChessList.GetBitmap(LocalFlag,Image_Local.Picture.Bitmap);
        Form_ChessBoard.ChessList.GetBitmap(RemoteFlag,Image_Remote.Picture.Bitmap);

        if LocalFlag=CurrentFlag then
        begin
          Application.MessageBox('本方开始下棋','提示',MB_ICONINFORMATION+MB_OK);
          lblCurrent.Caption :='本方';
        end
        else
          lblCurrent.Caption :='对方';

        LocalSocket := Socket;
        Over := FALSE;
      end;
    end;
    $02:                  //棋盘数据(x,y表示新落子坐标,有SERVER,CLIENT双方发送);
    begin
      if RxLen<>4 then
      begin
        Application.MessageBox('传送数据出错','警告',MB_ICONEXCLAMATION+MB_OK);
        Exit;
      end
      else
      begin
        i:=RxBuff[1];
        j:=RxBuff[2];
        ChessData[i,j]:=RemoteFlag;
        Form_ChessBoard.PutChess(i,j,RemoteFlag);
        CurrentFlag := LocalFlag;
        lblCurrent.Caption :='本方';
        if RxBuff[3]=RemoteFlag then
        begin
          Over:=TRUE;
          lblCurrent.Caption :='';
          Application.MessageBox('你输掉了这场比赛','可惜',MB_ICONINFORMATION+MB_OK);
        end;
      end;
    end;
  end;
end;

procedure TForm_Main.TCPServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i,j:Integer;
begin
  RxLen:=Socket.ReceiveBuf(RxBuff,256);
  case RxBuff[0] of
    $02:                        ////棋盘数据(x,y表示新落子坐标,有SERVER,CLIENT双方发送);
    begin
      if RxLen<>4 then
      begin
        Application.MessageBox('传送数据出错','警告',MB_ICONEXCLAMATION+MB_OK);
        Exit;
      end
      else
      begin
        i:=RxBuff[1];
        j:=RxBuff[2];
        ChessData[i,j]:=RemoteFlag;
        Form_ChessBoard.PutChess(i,j,RemoteFlag);
        CurrentFlag := LocalFlag;
        lblCurrent.Caption :='本方';
        if RxBuff[3]=RemoteFlag then
        begin
          Over:=TRUE;
          lblCurrent.Caption :='';
          Application.MessageBox('你输掉了这场比赛','可惜',MB_ICONINFORMATION+MB_OK);
        end;
      end;
    end;
  end;
end;

procedure SendData(var Socket:TCustomWinSocket;var Buf;BufLen:Integer);
begin
  Socket.SendBuf(Buf,BufLen);
end;

procedure TForm_Main.btnQuitGameClick(Sender: TObject);
begin
  TCPClient.Close;
  TCPServer.Close;
  Item_NewGame.Enabled:=TRUE;
  Item_JoinGame.Enabled:=TRUE;
  Item_QuitGame.Enabled:=FALSE;
  btnQuitGame.Enabled:=FALSE;
  Form_ChessBoard.Free;
  Form_ChessBoard:=nil;
end;

procedure TForm_Main.btnExitClick(Sender: TObject);
begin
  Close;
end;

end.

⌨️ 快捷键说明

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