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

📄 npc.cpp

📁 本人初学window网络编程时开发的第一款网络游戏
💻 CPP
字号:
#include ".\npc.h"
extern CPlane* player;
extern CBullet* bullet;
extern CGame* game;

extern CRITICAL_SECTION g_csBullet;

CRITICAL_SECTION g_cs2;
CRITICAL_SECTION g_csVecNpcBullet;
struct NPCBULLET
{
	COORD newcoord , oldcoord;
	int iAngleX;
};
vector<NPCBULLET> vecNpcBullet;
CNPC::CNPC(HANDLE _hStdOut, CONSOLE_SCREEN_BUFFER_INFO _csbi)
{
	hStdOut=_hStdOut;
	csbi=_csbi;
}

CNPC::~CNPC(void)
{
}

void CNPC::start()
{
	InitializeCriticalSection(&g_cs2);
	InitializeCriticalSection(&g_csVecNpcBullet);

	Sleep(1000);
	_beginthread(CNPC::upData , 0 , (void*)&hStdOut);
	_beginthread(CNPC::BulletUpDate , 0 , (void*)&hStdOut);
}

void CNPC::upData(void *dummy)
{
	while (true)
	{
		srand(time(0));
		Sleep(GetRandom(1000 , 2000));
        _beginthread(CNPC::ProcAI , 0 , dummy);
	}
	
}
void CNPC::BulletUpDate(void *dummy)
{
	HANDLE hStdOut=*(HANDLE *)dummy;
	DWORD result;
	char cVoid , cBullet;
	cBullet=0x2E;
	cVoid=0x20;
	while (true)
	{
		//更新和绘制
		EnterCriticalSection(&g_csVecNpcBullet);
		for (int i=0 ; i<vecNpcBullet.size() ; i++)
		{
            vecNpcBullet[i].newcoord.X+=vecNpcBullet[i].iAngleX;
			vecNpcBullet[i].newcoord.Y+=1;

			WriteConsoleOutputCharacter(hStdOut , &cVoid , 1 , vecNpcBullet[i].oldcoord , &result);
			WriteConsoleOutputCharacter(hStdOut , &cBullet , 1 , vecNpcBullet[i].newcoord , &result);
			vecNpcBullet[i].oldcoord.X=vecNpcBullet[i].newcoord.X;
			vecNpcBullet[i].oldcoord.Y=vecNpcBullet[i].newcoord.Y;
		}
        
		//边检和碰撞
		for (int i=0 ; i<vecNpcBullet.size() ; i++)
		{
			if (vecNpcBullet[i].newcoord.Y>50)
			{
				WriteConsoleOutputCharacter(hStdOut , &cVoid , 1 , vecNpcBullet[i].oldcoord , &result);
				vecNpcBullet.erase(&vecNpcBullet[i]);
				i--;
			}
			else
			{
				if (vecNpcBullet[i].newcoord.X>player->newcoord.X-1 &&
					vecNpcBullet[i].newcoord.X<player->newcoord.X+1 &&
                    vecNpcBullet[i].newcoord.Y>player->newcoord.Y-2 &&
					vecNpcBullet[i].newcoord.Y<player->newcoord.Y+2 )
				{
					WriteConsoleOutputCharacter(hStdOut , &cVoid , 1 , vecNpcBullet[i].oldcoord , &result);
					vecNpcBullet.erase(&vecNpcBullet[i]);
					i--;

					//玩家死亡
				} 
			}
		}
		LeaveCriticalSection(&g_csVecNpcBullet);
		Sleep(100);
	}

}
void CNPC::ProcAI(void *dummy)
{
	HANDLE hStdOut=*(HANDLE*)dummy;
	DWORD result;
	char cNpc[3] , cVoid[3];
	COORD newcoord , oldcoord;
	cNpc[0]=0x11;
	cNpc[1]=0x0F;
	cNpc[2]=0x10;
	cVoid[0]=cVoid[1]=cVoid[2]=0x20;
	srand(time(0));
	EnterCriticalSection(&g_cs2);
    newcoord.X=GetRandom(10 , 60);
	newcoord.Y=GetRandom(-15 , 0);
	oldcoord=newcoord;
	srand(time(0));
	int iAngleX=rand()%4-2;
	srand(time(0));
	int iAngleY=1;
	int iChangeTime=GetRandom(5 , 30);
    int iTime=0;
	LeaveCriticalSection(&g_cs2);
	while (true)
	{
		iTime++;
		EnterCriticalSection(&g_cs2);
		//数据更新部分
        newcoord.X+=iAngleX;
		newcoord.Y+=iAngleY;
		//AI部分
		if (newcoord.X<2)
		{
			srand(time(0));
			if (GetRandom(1 , 3)==2)
			{
				newcoord.X=3;
				iAngleX=~iAngleX;
			} 
			else
			{
				newcoord.Y=55;
			}	
		}
		if (newcoord.X>70)
		{
            srand(time(0));
			if (GetRandom(1 , 3)==2)
			{
				newcoord.X=69;
			    iAngleX=~iAngleX;
			} 
			else
			{
				newcoord.Y=55;
			}	
		}
		if (iTime==iChangeTime)
		{
			srand(time(0));
			iAngleX=rand()%4-2;
		}
		LeaveCriticalSection(&g_cs2);
		EnterCriticalSection(&g_csVecNpcBullet);
		if ((iTime%5)==0)
		{
			NPCBULLET n1,n2,n3;
			n1.iAngleX=1;
			n2.iAngleX=0;
			n3.iAngleX=-1;
			n1.newcoord.X=n2.newcoord.X=n3.newcoord.X=newcoord.X+1;
			n1.newcoord.Y=n2.newcoord.Y=n3.newcoord.Y=newcoord.Y+1;
			n1.oldcoord=n2.oldcoord=n3.oldcoord=n1.newcoord;
			vecNpcBullet.push_back(n1);
			vecNpcBullet.push_back(n2);
			vecNpcBullet.push_back(n3);
		}
		LeaveCriticalSection(&g_csVecNpcBullet);
		//销毁条件
		EnterCriticalSection(&g_csBullet);
		for (int i=0 ; i<bullet->vecBullet.size() ; i++)
		{
			if (bullet->vecBullet[i].newcoord.X>newcoord.X-1 &&
				bullet->vecBullet[i].newcoord.X<newcoord.X+4 &&
				bullet->vecBullet[i].newcoord.Y>newcoord.Y-2 &&
				bullet->vecBullet[i].newcoord.Y<newcoord.Y+2 )
			{
				char cVoidTemp=0x20;
				WriteConsoleOutputCharacter(hStdOut , &cVoidTemp , 1 , bullet->vecBullet[i].oldcoord , &result);
				bullet->vecBullet.erase(&bullet->vecBullet[i]);
				WriteConsoleOutputCharacter(hStdOut , cVoid , 3 , oldcoord , &result);
				i--;
				LeaveCriticalSection(&g_csBullet);
				game->createBomb(newcoord);
				_endthread();
			} 
		}
		LeaveCriticalSection(&g_csBullet);
		if (newcoord.Y>50)
		{
			 WriteConsoleOutputCharacter(hStdOut , cVoid , 3 , oldcoord , &result);
             _endthread();
		}
		EnterCriticalSection(&g_cs2);
        //绘制部分
		WriteConsoleOutputCharacter(hStdOut , cVoid , 3 , oldcoord , &result);
		WriteConsoleOutputCharacter(hStdOut , cNpc , 3 , newcoord , &result);
		oldcoord.X=newcoord.X;
		oldcoord.Y=newcoord.Y;
		LeaveCriticalSection(&g_cs2);
		Sleep(150);
	}
	_endthread();
}

⌨️ 快捷键说明

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