📄 main.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 + -