//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Welcome.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//绘制棋盘线
void __fastcall TMainForm::DrawChessBoard()
{
//外框
Image->Canvas->Pen->Width=1;
Image->Canvas->Rectangle(13,13,387,387);
Image->Canvas->Pen->Width=2;
Image->Canvas->Rectangle(16,16,384,384);
//网格线
Image->Canvas->Pen->Width=1;
for(int i=0;i<19;i++)
{
Image->Canvas->MoveTo((i+1)*20,20);
Image->Canvas->LineTo((i+1)*20,380);
Image->Canvas->MoveTo(20,(i+1)*20);
Image->Canvas->LineTo(380,(i+1)*20);
}
}
//---------------------------------------------------------------------------
//初始化参数
void __fastcall TMainForm::Initialize()
{
canPut=false; //不可下子
stepNum=0; //当前走棋步数为0
Label6->Caption=IntToStr(stepNum);
//初始化棋盘图像Image
Image->Picture->Graphic=NULL;
Image->Top=0;
Image->Left=0;
Image->Height=BKImage->Height; //棋盘Image大小等于背景大小
Image->Width=BKImage->Width;
Image->Canvas->Pen->Color=clBlue; //绘制棋盘的颜色
Memo1->Lines->Clear(); //清除聊天记录
DrawChessBoard(); //绘制棋盘
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
State[i][j]=sNone; //棋盘各个位置为空
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket)
{
IsServer=true;
StatusBar1->Panels->Items[0]->Text="成功连到:"+Socket->RemoteAddress;
StatusBar1->Panels->Items[1]->Text="该"+ServerUserName+"走棋!"; //显示该谁走棋
Image1->Picture->LoadFromFile("black.bmp"); //显示黑白方
Image2->Picture->LoadFromFile("white.bmp");
Send[0]='N';
strcpy(&Send[1],ServerUserName.c_str());
ServerSocket1->Socket->Connections[0]->SendText(AnsiString(Send));
canPut=true; //可以下子
mColor=sBlack;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ServerSocket1ClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
StatusBar1->Panels->Items[0]->Text="套接字错误:";
StatusBar1->Panels->Items[1]->Text="错误代码为"+IntToStr(ErrorCode);
ShowMessage("套接字错误,代码为"+IntToStr(ErrorCode));
ErrorCode=0;
ServerSocket1->Active=false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->Panels->Items[0]->Text="成功连到:"+Socket->RemoteHost;
StatusBar1->Panels->Items[1]->Text="该"+ServerUserName+"走棋!";
Image1->Picture->LoadFromFile(("white.bmp"));
Image2->Picture->LoadFromFile("black.bmp");
Send[0]='N';
strcpy(&Send[1],ClientUserName.c_str());
ClientSocket1->Socket->SendText(AnsiString(Send));
canPut=false;
mColor=sWhite;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ClientSocket1Error(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
StatusBar1->Panels->Items[0]->Text="套接字错误:";
StatusBar1->Panels->Items[1]->Text="错误代码为"+IntToStr(ErrorCode);
ShowMessage("套接字错误,代码为"+IntToStr(ErrorCode));
ErrorCode=0;
ClientSocket1->Active=false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
strcpy(Receive,Socket->ReceiveText().c_str());
switch(Receive[0])
{
case 'N': ///显示对方呢称到Lable4上
ClientUserName=AnsiString(&Receive[1]);
Label4->Caption=ClientUserName;
break;
case 'C': //聊天
Memo1->Lines->Add(ClientUserName+"说: "+AnsiString(&Receive[1]));
break;
case 'P': //走棋
State[Receive[1]][Receive[2]]=sWhite; //存储对手方落子在棋盘上的消息
canPut=true;
StatusBar1->Panels->Items[1]->Text="该"+ServerUserName+"走棋!";
DisplayChess(Receive[1],Receive[2],2); //显示白子到棋盘上
stepNum++;
Label6->Caption=IntToStr(stepNum); //在lable6上显示当前走棋步数
if(Check(sWhite)) //检查白子方(客户端)是否赢了
{
MessageBox(Handle,("真遗憾,"+ServerUserName+"你输了!").c_str(),
"败北",MB_OK);
MessageBox(Handle,"请重新再来!","重新再来",MB_OK);
Initialize();
}
break;
}
}
//---------------------------------------------------------------------------
//判断输赢
bool __fastcall TMainForm::Check(TState flag)
{
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
{
if(State[i][j]==flag)
{
if(i<15) //横向
{
if(State[i][j]==flag&&State[i+1][j]==flag&&
State[i+2][j]==flag&&State[i+3][j]==flag&&State[i+4][j]==flag)
return true;
}
if(j<15) //纵向
{
if(State[i][j]==flag&&State[i][j+1]==flag&&
State[i][j+2]==flag&&State[i][j+3]==flag&&State[i][j+4]==flag)
return true;
}
if(j<15&&i<15) //右斜向
{
if(State[i][j]==flag&&State[i+1][j+1]==flag&&
State[i+2][j+2]==flag&&State[i+3][j+3]==flag&&State[i+4][j+4]==flag)
return true;
}
if(j<15&&i>=4) //左斜向
{
if(State[i][j]==flag&&State[i-1][j+1]==flag&&
State[i-2][j+2]==flag&&State[i-3][j+3]==flag&&State[i-4][j+4]==flag)
return true;
}
}
}
return false;
}
//---------------------------------------------------------------------------
//在棋盘上点(xx,yy)处放入棋子
void _fastcall TMainForm::DisplayChess(int xx, int yy, int flag)
{
if(flag==1)
Image->Canvas->Draw(xx*20-5,yy*20-5,Image1->Picture->Graphic);
else
Image->Canvas->Draw(xx*20-5,yy*20-5,Image2->Picture->Graphic);
}
//---------------------------------------------------------------------------
//Image上鼠标左键单击事件
void __fastcall TMainForm::ImageMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int xx=(X+10)/20;
int yy=(Y+10)/20;
if(canPut&&Button==mbLeft) //轮到他走棋并是左键单击
{
if(State[xx][yy]==sNone)
{
State[xx][yy]=mColor;
DisplayChess(xx,yy,1); //在棋盘显示当前方下棋的棋子
Send[0]='P'; //发送当前下棋方棋子到对手方棋盘上显示
Send[1]=xx;
Send[2]=yy;
Send[3]='\0';
if(IsServer) //服务器端发送
ServerSocket1->Socket->Connections[0]->SendText(AnsiString(Send));
else //客服端发送
ClientSocket1->Socket->SendText(AnsiString(Send));
canPut=false; //不可下子
if(IsServer)
StatusBar1->Panels->Items[1]->Text="该"+ClientUserName+"走棋!";
else
StatusBar1->Panels->Items[1]->Text="该"+ServerUserName+"走棋!";
stepNum++; //步数递增
Label6->Caption="第"+IntToStr(stepNum)+"步";
if(Check(mColor)) //判断输赢
{
if(mColor==sBlack) //服务器端赢了