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

📄 main.cpp

📁 本人初学window网络编程时开发的第一款网络游戏
💻 CPP
字号:
#include "tool.h"
#include "Player.h"
#include "MySocket.h"
#include "bullet.h"


//全局变量
vector<CPlayer> vecPlayer;
CMySocket * g_pSocket;
CBullet * g_pBullet;
HANDLE g_hOut;
CRITICAL_SECTION g_csBullet;   //子弹模块临界区

int g_iUserNum;    //已经连接的用户总数

int GetPlayerIndex(char chType);
void InitServer();
void SendtoAllPlayer(char* sendBuf);
DWORD WINAPI BulletProc(LPVOID lpParameter);


int main()
{   
    InitServer();  //初始化

	while (true)
	{
        Sleep(2);
		char recvBuf[20];
		SOCKADDR_IN addrClient;
		
		if (g_pSocket->RecvfromEX(recvBuf , 20 , &addrClient))
		{
			switch (recvBuf[0])
			{
			case CLIENT_LOGIN:
				cout<<"一个玩家请求登陆!"<<endl;
				if (g_iUserNum>=2)
				{
					cout<<"由于服务器连接已满,玩家登陆的请求被拒绝!"<<endl;
                    //发送玩家连接已满的消息
					char sendBuf[2];
					sendBuf[0]=SRV_USERNUM_MAX;
					sendBuf[1]=0x00;
					g_pSocket->SendtoEX(addrClient , sendBuf);
				} 
				else
				{
					if (g_iUserNum==1)
					{
						CPlayer player(PLAYER_UP , addrClient);
						vecPlayer.push_back(player);
						//给玩家发送LOGINOK
						char sendBuf[2];
						sendBuf[0]=SRV_LOGINOK;
						sendBuf[1]=PLAYER_UP;
						g_pSocket->SendtoEX(addrClient , sendBuf);
						vecPlayer[1].m_iState=9;
						//给所有玩家发送WAITOK  改变玩家状态
						sendBuf[0]=SRV_WAITOK;
						sendBuf[1]=0x00;
						g_pSocket->SendtoEX(vecPlayer[0].m_addr , sendBuf);
						g_pSocket->SendtoEX(vecPlayer[1].m_addr , sendBuf);
						vecPlayer[0].m_iState=10;
						vecPlayer[1].m_iState=10;

						g_iUserNum++; //连接数加1
						cout<<"已批准玩家登陆 , 当前人数已满,命令所有玩家开始游戏"<<endl;

						//启动子弹更新线程
						HANDLE hBulletThread;
						hBulletThread=CreateThread(NULL,0,BulletProc,NULL,0,NULL);
						CloseHandle(hBulletThread);
						cout<<"子弹更新线程已启动!"<<endl;
					} 
					else if (g_iUserNum==0)
					{
						CPlayer player(PLAYER_DOWN , addrClient);
						vecPlayer.push_back(player);
						//给玩家发送LOGINOK
						char sendBuf[3];
						sendBuf[0]=SRV_LOGINOK;
						sendBuf[1]=PLAYER_DOWN;
						sendBuf[2]=0x00;
						g_pSocket->SendtoEX(addrClient , sendBuf);
						vecPlayer[0].m_iState=9;  //等待状态

						g_iUserNum++;
                        cout<<"已批准玩家登陆,当前在线1人,无法开始游戏,命令客户端等待其它玩家"<<endl;
						
					}
				}
				break;

			case CLIENT_ACT:

                switch (recvBuf[1])
                {
                case ACT_MOVEUP:
					{
						if (CheckLimit(vecPlayer[GetPlayerIndex(recvBuf[2])].newcoord , recvBuf[2] , recvBuf[1]))
						{
						    cout<<"玩家向上移动的请求被拒绝!  原因:超出边界"<<endl;
						} 
						else
						{
							vecPlayer[GetPlayerIndex(recvBuf[2])].MoveUp();
							char sendBuf[4];
							sendBuf[0]=SRV_ACT;
							sendBuf[1]=ACT_MOVEUP;
							sendBuf[2]=recvBuf[2];
							sendBuf[3]=0x00;
							for (int i=0 ; i<vecPlayer.size() ; i++)
							{
								g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
							}
						}
						
						
					}
					
                	break;
				case ACT_MOVEDOWN:
					{
						if (CheckLimit(vecPlayer[GetPlayerIndex(recvBuf[2])].newcoord , recvBuf[2] , recvBuf[1]))
						{
							cout<<"玩家向下移动的请求被拒绝!  原因:超出边界"<<endl;
						} 
						else
						{
							vecPlayer[GetPlayerIndex(recvBuf[2])].MoveDown();
							char sendBuf[4];
							sendBuf[0]=SRV_ACT;
							sendBuf[1]=ACT_MOVEDOWN;
							sendBuf[2]=recvBuf[2];
							sendBuf[3]=0x00;
							for (int i=0 ; i<vecPlayer.size() ; i++)
							{
								g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
							}
						}
					    
					}
					
					break;
				case ACT_MOVELEFT:
					{
						if (CheckLimit(vecPlayer[GetPlayerIndex(recvBuf[2])].newcoord , recvBuf[2] , recvBuf[1]))
						{
							cout<<"玩家向左移动的请求被拒绝!  原因:超出边界"<<endl;
						} 
						else
						{
							vecPlayer[GetPlayerIndex(recvBuf[2])].MoveLeft();
							char sendBuf[4];
							sendBuf[0]=SRV_ACT;
							sendBuf[1]=ACT_MOVELEFT;
							sendBuf[2]=recvBuf[2];
							sendBuf[3]=0x00;
							for (int i=0 ; i<vecPlayer.size() ; i++)
							{
								g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
							}
						}
		
					}
					break;
				case ACT_MOVERIGHT:
					{
						if (CheckLimit(vecPlayer[GetPlayerIndex(recvBuf[2])].newcoord , recvBuf[2] , recvBuf[1]))
						{
							cout<<"玩家向右移动的请求被拒绝!  原因:超出边界"<<endl;
						} 
						else
						{
							vecPlayer[GetPlayerIndex(recvBuf[2])].MoveRight();
							char sendBuf[4];
							sendBuf[0]=SRV_ACT;
							sendBuf[1]=ACT_MOVERIGHT;
							sendBuf[2]=recvBuf[2];
							sendBuf[3]=0x00;
							for (int i=0 ; i<vecPlayer.size() ; i++)
							{
								g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
							}
						}
						
					}
					break;
				case ACT_FIRE:
					{
						EnterCriticalSection(&g_csBullet);
                        int iTemp=g_pBullet->Fire(vecPlayer[GetPlayerIndex(recvBuf[2])]);
						char chTemp[4];
                        IntToByteArray(iTemp , chTemp , 4);                      
 
						char sendBuf[8];
						sendBuf[0]=SRV_ACT;
						sendBuf[1]=ACT_FIRE;
						sendBuf[2]=recvBuf[2];
                        sendBuf[3]=chTemp[0];
						sendBuf[4]=chTemp[1];
						sendBuf[5]=chTemp[2];
						sendBuf[6]=chTemp[3];
						sendBuf[7]=0x00;

						SendtoAllPlayer(sendBuf);
						LeaveCriticalSection(&g_csBullet);
					}
					break;
                }


                break;
			default :
			break;
			}
		} 
		else
		{

		}
		
	}
	
	DeleteCriticalSection(&g_csBullet);
    return 0;
}

int GetPlayerIndex(char chType)
{
	for (int i=0 ; i<vecPlayer.size() ; i++)
	{
		if (vecPlayer[i].m_iType==chType)
		{
			return i;
		}
	}
	cout<<"查找玩家类型失败,没有此类型的玩家!"<<endl;
	return -1;
}

void InitServer()
{
	//初始化控制台
	g_hOut=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTitle("雷电Online服务器端"); 
	//初始化全局变量
	g_iUserNum=0;
    InitializeCriticalSection(&g_csBullet);  //初始化子弹模块临界区
	//初始化对象
	g_pSocket=new CMySocket();
	g_pBullet=new CBullet(g_hOut);

	if (g_pSocket->InitSocket())
	{
		cout<<"Socket创建成功!"<<endl;
		g_pSocket->SetSrvIP(7735);
		g_pSocket->SetBind(BIND_SRV);
		g_pSocket->InitFdSocket();
	} 
	else
	{
		cout<<"Socket创建失败,请重启服务器端程序!"<<endl;
		while (true)
		{
			Sleep(500000);
		}
	}
}


void SendtoAllPlayer(char* sendBuf)
{
	for (int i=0 ; i<vecPlayer.size() ; i++)
	{
		g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
	}
}




DWORD WINAPI BulletProc(LPVOID lpParameter)
{
    while (true)
    {
		EnterCriticalSection(&g_csBullet);
		g_pBullet->UpData(SRV_ACT);

		//对玩家下发射的子弹进行处理
		for (int i=0 ; i<g_pBullet->vecPlayerDownBullet.size() ; i++)
		{
			if (Collision(g_pBullet->vecPlayerDownBullet[i].newcoord , vecPlayer[GetPlayerIndex(PLAYER_UP)].newcoord , 1 , vecPlayer[GetPlayerIndex(PLAYER_UP)].m_iWidth , 1 , vecPlayer[GetPlayerIndex(PLAYER_UP)].m_iHeight))
			{
                //通知客户端进行操作
				int iTemp=g_pBullet->vecPlayerDownBullet[i].id;
				char chTemp[4];
				IntToByteArray(iTemp , chTemp , 4);                      

				char sendBuf[8];
				sendBuf[0]=SRV_UPDATE;
				sendBuf[1]=UPDATE_COLLISION;
				sendBuf[2]=PLAYER_UP;
				sendBuf[3]=chTemp[0];
				sendBuf[4]=chTemp[1];
				sendBuf[5]=chTemp[2];
				sendBuf[6]=chTemp[3];
				sendBuf[7]=0x00;
				SendtoAllPlayer(sendBuf);
				//减玩家上的血
                vecPlayer[GetPlayerIndex(PLAYER_UP)].m_iHP--;
				//删子弹
				g_pBullet->vecPlayerDownBullet.erase(&g_pBullet->vecPlayerDownBullet[i]);
				i--;
			} 
		}
        

		//对玩家上发射的子弹进行处理
		for (int i=0 ; i<g_pBullet->vecPlayerUpBullet.size() ; i++)
		{
			if (Collision(g_pBullet->vecPlayerUpBullet[i].newcoord , vecPlayer[GetPlayerIndex(PLAYER_DOWN)].newcoord , 1 , vecPlayer[GetPlayerIndex(PLAYER_DOWN)].m_iWidth , 1 , vecPlayer[GetPlayerIndex(PLAYER_DOWN)].m_iHeight))
			{
				//通知客户端进行操作
				int iTemp=g_pBullet->vecPlayerUpBullet[i].id;
				char chTemp[4];
				IntToByteArray(iTemp , chTemp , 4);                      

				char sendBuf[8];
				sendBuf[0]=SRV_UPDATE;
				sendBuf[1]=UPDATE_COLLISION;
				sendBuf[2]=PLAYER_DOWN;
				sendBuf[3]=chTemp[0];
				sendBuf[4]=chTemp[1];
				sendBuf[5]=chTemp[2];
				sendBuf[6]=chTemp[3];
				sendBuf[7]=0x00;
				SendtoAllPlayer(sendBuf);
				//减玩家上的血
				vecPlayer[GetPlayerIndex(PLAYER_DOWN)].m_iHP--;
				//删子弹
				g_pBullet->vecPlayerUpBullet.erase(&g_pBullet->vecPlayerUpBullet[i]);
				i--;
			} 
		}




		LeaveCriticalSection(&g_csBullet);
		Sleep(120);
    }
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -