//---------------------------------------------------------------------------
#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;
Label6->Caption=IntToStr(stepNum);
//初始化Image
Image->Picture->Graphic=NULL;
Image->Top=0;
Image->Left=0;
Image->Height=BKImage->Height;
Image->Width=BKImage->Width;
Image->Canvas->Pen->Color=RGB(2,255,53);
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::FormShow(TObject *Sender)
{
TWelcomeForm* welcomeform=new TWelcomeForm(NULL);
if(welcomeform->ShowModal()==mrOk)
{
MainForm->Show();
Label2->Caption=welcomeform->UserNickName->Text;
OpenDialog1->Filter=GraphicFilter(__classid(TGraphic));
Initialize();
if(welcomeform->RadioButton1->Checked) //做擂主(服务器端)
{
IsServer=true;
MainForm->Caption="网络五子棋-服务器端";
ServerUserName=welcomeform->UserNickName->Text;
ClientSocket1->Active=false;
ServerSocket1->Active=true; //启动服务器等待客户端的连接请求
StatusBar1->Panels->Items[0]->Text="Waiting.....";
OpenItem->Checked=true;
ConnectItem->Visible=false;
DisconnectItem->Enabled=true;
}
else
{
IsServer=false;
MainForm->Caption="网络五子棋-客户端";
ClientUserName=welcomeform->UserNickName->Text;
OpenItem->Visible=false;
if(welcomeform->Host->Text.Length()>0)
{
ClientSocket1->Host=welcomeform->Host->Text;
ClientSocket1->Active=true;
ServerSocket1->Active=false;
DisconnectItem->Enabled=true;
// DisconnectTButton->Enabled=true;
StatusBar1->Panels->Items[0]->Text="connecting.....";
}
else
{
ShowMessage("你没有输入服务器地址,请重新连接!");
}
}
}
else
Close();
delete welcomeform;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ServerSocket1Accept(TObject *Sender,
TCustomWinSocket *Socket)
{
IsServer=true;
StatusBar1->Panels->Items[0]->Text="成功连到:"+Socket->RemoteAddress;
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;
StatusBar1->Panels->Items[1]->Text="该"+ServerUserName+"走棋!"; //显示该谁走棋
mColor=sBlack;
ShowMessage("成功连到:"+Socket->RemoteAddress+",可以开始游戏了"); //提示游戏开始
}
//---------------------------------------------------------------------------
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;
ShowMessage("成功连到:"+Socket->RemoteAddress+",可以开始游戏了");
}
//---------------------------------------------------------------------------
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': //新对手
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);
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;
}
//---------------------------------------------------------------------------
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