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

📄 article3.cpp

📁 《C++编程杂谈之三:面向对象(续)》配套源代码
💻 CPP
字号:

#include <iostream>
#include <vector>
#include <windows.h>
#include <time.h>

using namespace std;


class actor//基类
{
protected:
	int               m_iHealth;//血
    const int         m_iSpeed;//为了方便,这个值使用延时值,越大表示速度越慢
	const int         m_iHitPoint;//攻击力
	char              m_strName[260];
public:
	actor(const char* strName,const int iHealth,const int iSpeed,const int iHitpoint);

	int& Health(){ return m_iHealth; };  
	const char* getName(){ return m_strName; };
	virtual void hit(actor *Actor) = 0;
	bool isAlive(); 
};

actor::actor(const char* strName,const int iHealth,const int iSpeed,const int iHitpoint):
m_iHealth(iHealth),
m_iSpeed(iSpeed),
m_iHitPoint(iHitpoint)
{
	strcpy(m_strName,strName);
}

bool actor::isAlive()
{
	return (m_iHealth>0);
}

/////////////////////////////////////////////////////////
//类fighter
class fighter :public actor
{
public:
	fighter(const char* strName);
	virtual void hit(actor *Actor);
private:
};

fighter::fighter(const char* strName):
actor(strName,100,20,20)
{
}

void fighter::hit(actor *Actor)
{
	Sleep(m_iSpeed);
	if(!isAlive())
	{
		return ;
	}
	if(Actor&&Actor->isAlive())
	{
		if(isAlive())
			Actor->Health() = Actor->Health() - m_iHitPoint;
	}
}

/////////////////////////////////////////////////////////
//类knight
class knight :public actor
{
public:
	knight(const char* strName);
	virtual void hit(actor *Actor);
private:
};

knight::knight(const char* strName):
actor(strName,150,20,25)
{
}

void knight::hit(actor *Actor)
{
	Sleep(m_iSpeed);
	if(!isAlive())
	{
		return ;
	}
	if(Actor&&Actor->isAlive())
	{
		if(isAlive())
			Actor->Health() = Actor->Health() - m_iHitPoint;
	}
}

/////////////////////////////////////////////////////////
//类warrior
class warrior :public actor
{
public:
	warrior(const char* strName);
	virtual void hit(actor *Actor);
private:
};

warrior::warrior(const char* strName):
actor(strName,150,20,25)
{
}

void warrior::hit(actor *Actor)
{
	Sleep(m_iSpeed);
	if(!isAlive())
	{
		return ;
	}
	if(Actor&&Actor->isAlive())
	{
		//这里我们用一个函数做了左值,因为函数返回的是引用
		if(isAlive())
			Actor->Health() = Actor->Health() - m_iHitPoint;
	}
}

vector<actor*> troop1;
vector<actor*> troop2;
BOOL	bThread1,bThread2;

ULONG WINAPI battletp1(LPVOID pParams)
{
	vector<actor *>::iterator it_tp1 = troop1.begin();
	vector<actor *>::iterator it_tp2 = troop2.begin();
	while( (it_tp1!=troop1.end()) && (it_tp2!=troop2.end()) )
	{
		while(((*it_tp1)->isAlive())&&(it_tp2!=troop2.end()))
		{
			(*it_tp1)->hit(*it_tp2);
			if(!(*it_tp2)->isAlive())
				it_tp2++;
		}
		it_tp1++;
	}


	bThread1 = true;
	return 0;
}

ULONG WINAPI battletp2(LPVOID pParams)
{
	vector<actor *>::iterator it_tp1 = troop1.begin();
	vector<actor *>::iterator it_tp2 = troop2.begin();
	while( (it_tp1!=troop1.end()) && (it_tp2!=troop2.end()) )
	{
		while(((*it_tp2)->isAlive())&&(it_tp1!=troop1.end()))
		{
			(*it_tp2)->hit(*it_tp1);
			if(!(*it_tp1)->isAlive())
				it_tp1++;

		}
		it_tp2++;
	}
	

	bThread2 = true;
	return 0;
}

void main()
{

	time_t t;
	srand((unsigned) time(&t));
	actor* tmp;
	char name[100];

	for(int i=0;i<10;i++)
	{
		switch(rand()%3)
		{
		case 0:
			sprintf(name,"warrior No%d of troop1",i);
			tmp = new warrior(name);
			break;
		case 1:
			sprintf(name,"knight No%d of troop1",i);
			tmp = new knight(name);
			break;
		case 2:
			sprintf(name,"fighter No%d of troop1",i);
			tmp = new fighter(name);
			break;
		default:
			break;
		}
		troop1.push_back(tmp);
	}

	for(i=0;i<10;i++)
	{
		switch(rand()%3)
		{
		case 0:
			sprintf(name,"warrior No%d of troop2",i);
			tmp = new warrior(name);
			break;
		case 1:
			sprintf(name,"knight No%d of troop2",i);
			tmp = new knight(name);
			break;
		case 2:
			sprintf(name,"fighter No%d of troop2",i);
			tmp = new fighter(name);
			break;
		default:
			break;
		}
		troop2.push_back(tmp);
	}

	DWORD x;
	bThread1 = bThread2 = false;
	CreateThread(NULL,0,battletp1,NULL,0,&x);
	CreateThread(NULL,0,battletp2,NULL,0,&x);
    while( (!bThread1) || (!bThread2) )
	{
		Sleep(100);
	}

	vector<actor *>::iterator it;
	for(it=troop1.begin();it!=troop1.end();it++)
	{
		cout<<(*it)->getName()<<( (*it)->isAlive()?" is Alive!":" is Died!")<<endl;
	}
	for(it=troop2.begin();it!=troop2.end();it++)
	{
		cout<<(*it)->getName()<<( (*it)->isAlive()?" is Alive!":" is Died!")<<endl;
	}

}


⌨️ 快捷键说明

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