⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netcontrol.cpp

📁 一个局域网的斗地主游戏
💻 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 + -