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