📄 netcontrol.cpp
字号:
// NetControl.cpp: implementation of the NetControl class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Program.h"
#include "NetControl.h"
#include "Net.h"
#include "Getin.h"
#include "Server.h"
#include "Getin.h"
#include "Managers.h"
#include "ProgramDoc.h"
#include "ProgramView.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern Managers manager;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
NetControl::NetControl()
{
m_pSocket=NULL;
m_Server="";
m_Port=100;
m_pListening=NULL;
m_pList.RemoveAll();
}
NetControl::~NetControl()
{
if(m_pSocket)
delete m_pSocket;
delete m_pListening;
}
void NetControl::FetchMsg(CNet *pRequest)
{
CString pMsg;//用CString代替Char * 方便
char Msg[10000],tempMsg[1000];
int ByteCount;
int End=0;
CStringArray *temp=new CStringArray;
strcpy(Msg,"");
do
{
strcpy(tempMsg,"");
ByteCount=pRequest->Receive(tempMsg,1000);
if(ByteCount>1000||ByteCount<=0)
{
MessageBox(GetActiveWindow(),"接受网络信息发生错误","警告信息",MB_OK);
return ;
}
else if(ByteCount<1000&&ByteCount>0)
{
End=1;
}
tempMsg[ByteCount]=0;
strcat(Msg,tempMsg);
}while(End==0);
// MessageBox(GetActiveWindow(),Msg,"网络信息",MB_OK);
if(!strcmp("退出游戏",Msg))
{
// if( m_pList.GetHead()
MessageBox(GetActiveWindow(),"有人退出了","警告信息",MB_OK);
if(m_Isserver)
Broadcast(Msg);
exit(0);
}
if(!m_Isserver)
{
if(!strcmp(Msg,sMsg))
return ;
}
pMsg=Msg;
//接受信息
if(m_Isserver)//服务器的处理
{
if(!strncmp(pMsg,"1818",4))
{
if(manager.Game_State<0 || manager.Game_State>2)//改变
{
if(pMsg[4]==1)
//如果是服务器,接收到的信息第4个是1则表示次信息用来获得服务器信息,返回服务器信息
{
if(pRequest==(CNet*)m_pList.GetHead())
{
char tem[100]="1811";
strcpy(tem+4,m_pView->PlayerName[1]);
m_pView->PlayerName[2]=pMsg.Right(pMsg.GetLength()-5);
SendMsg(pRequest,tem);//+主机姓名
m_pView->DrawPlayername();
}
else if(pRequest==(CNet*)m_pList.GetTail())
{
char tem[100]="1812";
strcpy(tem+4,m_pView->PlayerName[1]);
m_pView->PlayerName[0]=pMsg.Right(pMsg.GetLength()-5);
SendMsg(pRequest,tem);//+主机姓名
m_pView->DrawPlayername();
}
if(m_pList.GetCount()==2)//如果2个玩家都到了就广播所有玩家的名字
{
char p[200];
sprintf(p,"1818%c%s%c%s",1,m_pView->PlayerName[2],1,m_pView->PlayerName[0]);
//把名字按照这样的顺序写进P ("1818%c%s%c%s",1,name1,1,name2)
Broadcast(p);
}
return;
}
//服务器接收到的是游戏准备开始的信息
else if(pMsg[4]==99 && pMsg[5]==99)
{
// 计数 当3个都按下开始了 就游戏开始
if(pMsg[6]==1)
m_ready[2]=true;
else if(pMsg[6]==2)
m_ready[0]=true;
if(m_ready[0] && m_ready[1] && m_ready[2])
{
m_ready[0]=false;
m_ready[1]=false;
m_ready[2]=false;
manager.GameStart();
StartCards();
m_pView->PlayerPos();
m_pView->PrintAll(1);
}
}
else if(pMsg[5]>100 && pMsg[5]<106 && manager.Game_State==-1)
//服务器接收到的是选择地主信息
{
Broadcast(Msg);
int action=pMsg[5]-100;
if(action==4)
{
manager.PlayCards[manager.PlayerMain][17]=manager.Sendleft[0];
manager.PlayCards[manager.PlayerMain][18]=manager.Sendleft[1];
manager.PlayCards[manager.PlayerMain][19]=manager.Sendleft[2];
manager.Game_State=manager.PlayerMain;
m_pView->PrintAll();
return;
}
else if(action==3)
{
manager.PlayerMain=(manager.PlayerMain+1)%3;
manager.PlayerMaininfo++;
if(manager.PlayerMaininfo==3)
manager.Game_State=-2;
return;
}
}
}
if(manager.Game_State>=0 || manager.Game_State<3)
//接收游戏中的数据
{//改变
int temp=manager.Game_State;
temp=(temp+1)%3;
if (pMsg[5]==104)//action==4;
{
int k;
DeMakeCard(Msg,manager.OutCards,6,pMsg.GetLength());
manager.OutPlayer=manager.Game_State;
for(k=0;k<20 && manager.OutCards[k].Num<=15;k++)
m_pView->OutCards[temp][k]=manager.OutCards[k];
if(k!=20)
m_pView->OutCards[temp][k].Num=16;
// manager.Updata();
m_pView->DrawCardOut(temp);
}
else if(pMsg[5]==103)
{
m_pView->OutCards[temp][0].Num=16;
manager.Game_State=(manager.Game_State+1)%3;
}
if(manager.Game_State!=pMsg[4]-100)
{
manager.Game_State=pMsg[4]-100;
}
Broadcast(Msg);
}
if(manager.Game_State>=3)
{
//某猪胜利
if(manager.Game_State-3==manager.PlayerMain)
MessageBox(GetActiveWindow(),"地主胜利","游戏结束",0);//改变
else
MessageBox(GetActiveWindow(),"农民胜利","游戏结束",0);//改变
manager.Game_State=-2;
}
}
}
else//非服务器的处理
{
if(!strncmp(pMsg,"1811",4))
{
//获得主机姓名 传给Player0
manager.PlayerAc=1;
m_pView->PlayerName[0]=pMsg.Right(pMsg.GetLength()-4);
m_pView->DrawPlayername();
return;
}
else if(!strncmp(pMsg,"1812",4))
{
//获得主机姓名 传给Player0
manager.PlayerAc=2;
m_pView->PlayerName[2]=pMsg.Right(pMsg.GetLength()-4);
m_pView->DrawPlayername();
return;
}
if(manager.Game_State==-1 || manager.Game_State==-2)
{
if(strncmp(pMsg,"1818",4))
return;
if(pMsg[4]==1)//获得FWQ上的信息
{
int k;
//获得第2个分隔符的位置
for(k=5;pMsg[k]!=1;k++);
//如果这台机器的玩家是1号
if(manager.PlayerAc==1)
{
m_pView->PlayerName[2]=pMsg.Mid(k+1);
m_pView->DrawPlayername();
}
//如果这台机器的玩家是2号
else if(manager.PlayerAc==2)
{
m_pView->PlayerName[0]=pMsg.Mid(5,k-5);
m_pView->DrawPlayername();
}
return;
}
if(pMsg[4]==99 && pMsg[5]==1 )//收到发牌信息
{
DeMakeCard(pMsg,manager.PlayCards[0],6,23);
DeMakeCard(pMsg,manager.PlayCards[1],23,40);
DeMakeCard(pMsg,manager.PlayCards[2],40,57);
DeMakeCard(pMsg,manager.Sendleft,57,60);
manager.PlayerMain=Msg[60]-100;
m_pView->PlayerPos();
m_pView->PrintAll(1);
manager.Game_State=-1;
return;
}
if(pMsg[5]>100 &&pMsg[5]<106 )//收到选地主信息
{
int action=pMsg[5]-100;
if(action==4)
{
manager.PlayCards[manager.PlayerMain][17]=manager.Sendleft[0];
manager.PlayCards[manager.PlayerMain][18]=manager.Sendleft[1];
manager.PlayCards[manager.PlayerMain][19]=manager.Sendleft[2];
manager.Game_State=manager.PlayerMain;
m_pView->PrintAll();
MessageBox(GetActiveWindow(),"选地主了","选地主了",0);//改变
return;
}
else if(action==3)
{
manager.PlayerMain=(manager.PlayerMain+1)%3;
manager.PlayerMaininfo++;
if(manager.PlayerMaininfo==3)
manager.Game_State=-2;
return;
}
}
}
if(manager.Game_State>=0 && manager.Game_State<3)
{
//游戏进行中 改变
int temp=manager.Game_State;
if(manager.PlayerAc==2)
temp=(temp+2)%3;
if (pMsg[5]==104)//action==4;
{
DeMakeCard(Msg,manager.OutCards,6,pMsg.GetLength());
manager.OutPlayer=manager.Game_State;
int k;
for(k=0;k<20 && manager.OutCards[k].Num<=15;k++)
m_pView->OutCards[temp][k]=manager.OutCards[k];
if(k!=20)
m_pView->OutCards[temp][k].Num=16;
// manager.Updata();
m_pView->DrawCardOut(temp);
}
else if(pMsg[5]==103)
{
m_pView->OutCards[temp][0].Num=16;
manager.Game_State=(manager.Game_State+1)%3;
}
if(manager.Game_State!=pMsg[4]-100)
{
manager.Game_State=pMsg[4]-100;
}
}
if(manager.Game_State>=3)
{
if(manager.Game_State-3==manager.PlayerMain)
MessageBox(GetActiveWindow(),"地主胜利","游戏结束",0);//改变
else
MessageBox(GetActiveWindow(),"农民胜利","游戏结束",0);//改变
manager.Game_State=-2;
}
}
}
void NetControl::OnSet()
{
m_pListening=new CNet(this);
if(m_pListening->Create(m_Port))
{
if(!m_pListening->Listen())
{
MessageBox(GetActiveWindow(),"端口设置错误!","网络信息",MB_OK);
}
}
else
{
MessageBox(GetActiveWindow(),"服务器设置成功,请等待玩家加入!","网络信息",MB_OK);
}
}
void NetControl::SendMsg(CNet *pSend, char *pMsg)
{
sMsg=pMsg;
if(pMsg!=NULL)
pSend->Send(pMsg,strlen(pMsg));
}
void NetControl::OnSorc()
{
int k;
k=MessageBox(GetActiveWindow(),"你是否建立主机?(主机/客户机 Y/N)","建立主机",MB_OKCANCEL);
if(k==1)//主机
{
CServer ser1;
ser1.DoModal();
m_Port=atoi(ser1.m_Port);
OnSet();
m_Isserver=true;
manager.MainComputer=true;
//manager
}
else
{
CGetin dlg1;
if(dlg1.DoModal()==IDOK)
{
CString *p=new(CString);
*p=dlg1.m_ip;
m_Server=*p;
m_Port=atoi(dlg1.m_Port);
OnOpen();
m_Isserver=false;
manager.MainComputer=false;
}
}
}
CNet* NetControl::ConnectServer()
{
CNet *pSocket=new CNet(this);
if(!(pSocket->Create()))
{
delete pSocket;
MessageBox(GetActiveWindow(),"创建Socket失败","警告信息",MB_OK);
return NULL;
}
//连接到服务器
if(!pSocket->Connect(m_Server,m_Port))
{
delete pSocket;
MessageBox(GetActiveWindow(),"请求连接到服务器失败","警告信息",MB_OK);
return NULL;
}
return pSocket;
}
void NetControl::OnOpen()
{
if(m_pSocket)
{
MessageBox(GetActiveWindow(),"已经连接到服务器,请关闭连接再试一次!","警告信息",MB_OK);
return;
}
// m_pSocket=new CNet(this);
if(!(m_pSocket=ConnectServer()))
{
m_pSocket=NULL;
return;
}
else//连接成功就发送信息到服务器,获得服务器上的信息
{
char tem[100]="1818";
tem[4]=1;
strcpy(tem+5,m_pView->PlayerName[1]);
SendMsg(m_pSocket,tem);
}
}
void NetControl::Broadcast(char *pMsg)
{
CNet *pNet;
if(!m_pList.IsEmpty())
{
pNet=(CNet*)m_pList.GetHead();
SendMsg(pNet,pMsg);
if(m_pList.GetCount()==2)
{
pNet=(CNet*)m_pList.GetTail();
SendMsg(pNet,pMsg);
}
}
// if((p=m_pList)!=NULL)
}
NetControl::NetControl(CProgramView *p)
{
m_pView=p;
m_pSocket=NULL;
m_Server="";
m_Port=100;
m_pListening=NULL;
m_pList.RemoveAll();
m_ready[0]=false;
m_ready[1]=false;
m_ready[2]=false;
}
void NetControl::MakeCard(char *st, Card *c)
{
int k;
for(k=0;k<20 && c[k].Num<=15;k++)
st[k]=(c[k].Pow+c[k].Type*20);
st[k]='\0';
}
void NetControl::DeMakeCard(const CString st, Card *c,int sstart,int eend)
{
int k,m;
m=0;
for(k=sstart;k<eend;k++)
{
c[m].Pow=st[k]%20;
c[m].Type=st[k]/20;
if(c[m].Pow<14)
{
c[m].Num=c[m].Pow+2;
if(c[m].Pow>11)
c[m].Num-=13;
}
else
c[m].Num=c[m].Pow;
m++;
}
if(m!=20)
c[m].Num=16;
}
void NetControl::SendCards(Card *c,int action)
{
char p[100]="1818";
p[4]=manager.Game_State+100;
p[5]=action+100;
p[6]='\0';
if(m_Isserver)
{
if(action==4)
MakeCard(p+6,c);
Broadcast(p);
}
else
{
if(action==4)
MakeCard(p+6,c);
SendMsg(m_pSocket,p);
}
}
void NetControl::SendGetReady()
{
char tem[20];
sprintf(tem,"1818%c%c%c",99,99,manager.PlayerAc);
SendMsg(m_pSocket,tem);
}
void NetControl::StartCards()
{
manager.GameStart();
char tem1[22],tem2[22],tem3[22],tem0[22];
MakeCard(tem0,manager.PlayCards[0]);
MakeCard(tem1,manager.PlayCards[1]);
MakeCard(tem2,manager.PlayCards[2]);
MakeCard(tem3,manager.Sendleft);
char st[100];
sprintf(st,"1818%c%c%s%s%s%s%c",99,1,tem0,tem1,tem2,tem3,manager.PlayerMain+100);
Broadcast(st);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -