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

📄 fight.cpp

📁 一个用C++写的文字类游戏
💻 CPP
字号:
#include "StdAfx.h"
#include ".\fight.h"
#include "globalobject.h"
#include <windows.h> 


extern CGlobalObject g_Object;


CFight::CFight(void)
{
	m_nBout = 0;
	
}

CFight::~CFight(void)
{
}
//此处实现攻防计算
void CFight::Render(char cCommand)
{

	g_Object.SetColor(FOREGROUND_BLUE);
	// 查看状态,不算在回合中。
	if (cCommand == '9') {
		cout<<g_Object.m_protagonist.m_strName<<"还有"<<g_Object.m_protagonist.m_nBlood<<"点血。"<<endl;
		return ;
	}
	if (m_nBloodTime > 0) {
		g_Object.m_protagonist.m_nBlood += this->m_nBlood;
		if (g_Object.m_protagonist.m_nBlood > g_Object.m_protagonist.m_nMaxBlood) {
			g_Object.m_protagonist.m_nBlood = g_Object.m_protagonist.m_nMaxBlood;
		}
		m_nBloodTime--;
		cout<<g_Object.m_protagonist.m_strName<<"生命回复"<<m_nBlood<<"点。"<<endl;
	}
	//此处的逻辑是NPC先攻击,然后再算主角的攻击,这样可以少考虑很多状态。
	//防值
	int nDef;
	if (m_nRoleDefDouble > 0) {
		nDef = g_Object.m_protagonist.m_nDefend + g_Object.m_protagonist.m_nBaseDef;
		m_nRoleDefDouble--;
	} else {
		nDef = g_Object.m_protagonist.m_nDefend;
	}
	//是否闪躲
	int nLostBlood;
	bool bIsDodge = false;
	if ( m_nDodgeTime > 0) {
		if ((rand()*m_nDodge)/100 == 0) {
			bIsDodge = true;
		}
		m_nDodgeTime--;
	} 

	if (m_nNpcDizzy > 0) {
		cout<<m_iterNPC.m_strName<<"还有晕眩中。"<<endl;
		m_nNpcDizzy--;
	} else {
		if (bIsDodge) {
			cout<<g_Object.m_protagonist.m_strName<<"高超的身法躲开了"<<m_iterNPC.m_strName<<"的攻击。"<<endl;
		} else {
			//躲不过去就算伤害,
			nLostBlood = m_iterNPC.m_nAttack - nDef/4;
			if (nLostBlood < 0) 
				nLostBlood = 0;
			g_Object.m_protagonist.m_nBlood -= nLostBlood;
			if (g_Object.m_protagonist.m_nBlood <= 0) {
				cout<<g_Object.m_protagonist.m_strName<<"被"<<m_iterNPC.m_strName<<"杀死了!!"<<endl;
				cout<<"请按任意键结束。"<<endl;
				g_Object.m_nGameStart = GS_DIE;
				return ;
			} else {
				cout<<g_Object.m_protagonist.m_strName<<"被"<<m_iterNPC.m_strName<<"打掉"<<nLostBlood<<"血。"<<endl;
			}
		}
	}
	//攻击的计算
	int nAtt = g_Object.m_protagonist.m_nAttack;
	if (m_nDeadlyTime > 0) {
		if ((rand()*m_nDeadly)/100 == 0) {
			nAtt *= 2;
		} 
		m_nDeadlyTime--;
	} 
	bool bKill = false;
	switch(cCommand) {
	case 'H':
	case 'h':
		this->AttackHelp();
		HelpInfo();
		return ;
	case '1':
		nLostBlood = nAtt - m_iterNPC.m_nDefend/4;
		m_iterNPC.m_nBlood -= nLostBlood;
		if (m_iterNPC.m_nBlood <= 0) {
			cout<<g_Object.m_protagonist.m_strName<<"打掉"<<m_iterNPC.m_strName;
			cout<<nLostBlood<<"点血。"<<endl;
			cout<<g_Object.m_protagonist.m_strName<<"杀死了"<<m_iterNPC.m_strName<<endl;
			GetExperience();
			bKill = true;
		} else {
			cout<<g_Object.m_protagonist.m_strName<<"打掉"<<m_iterNPC.m_strName;
			cout<<nLostBlood<<"点血。"<<endl;
		}
		break;
	case '2':
		nLostBlood = 30 + g_Object.m_protagonist.m_nLevel* 5 + (nAtt - m_iterNPC.m_nDefend/4)/3;
		m_iterNPC.m_nBlood -= nLostBlood;
		if (m_iterNPC.m_nBlood <= 0) {
			cout<<g_Object.m_protagonist.m_strName<<"打掉"<<m_iterNPC.m_strName;
			cout<<nLostBlood<<"点血。"<<endl;
			cout<<g_Object.m_protagonist.m_strName<<"杀死了"<<m_iterNPC.m_strName<<endl;
			GetExperience();
			bKill = true;
		} else {
			cout<<g_Object.m_protagonist.m_strName<<"打掉"<<m_iterNPC.m_strName;
			cout<<nLostBlood<<"点血。"<<endl;
		}
		break;
	case '3':
		nLostBlood = 20 + g_Object.m_protagonist.m_nLevel* 4 + (nAtt - m_iterNPC.m_nDefend/4)/3;
		m_iterNPC.m_nBlood -= nLostBlood;
		if (m_iterNPC.m_nBlood <= 0) {
			cout<<g_Object.m_protagonist.m_strName<<"打掉"<<m_iterNPC.m_strName;
			cout<<nLostBlood<<"点血。"<<endl;
			cout<<g_Object.m_protagonist.m_strName<<"杀死了"<<m_iterNPC.m_strName<<endl;
			GetExperience();
			bKill = true;
		} else {
			cout<<g_Object.m_protagonist.m_strName<<"打掉"<<m_iterNPC.m_strName;
			cout<<nLostBlood<<"点血。"<<endl;
		}
		break;
	case '4':
		m_nNpcDizzy = 3;
		cout<<g_Object.m_protagonist.m_strName<<"打晕了"<<m_iterNPC.m_strName<<endl;
		break;
	case '5':
		m_nRoleDefDouble = 6;
		cout<<g_Object.m_protagonist.m_strName<<"的防御加倍。"<<endl;
		break;
	case '6':
		m_nDeadly = 50;	//主角致命一击的机率; 20表示20%
		m_nDeadlyTime = 5;
		cout<<g_Object.m_protagonist.m_strName<<"提高了致命一击的机率。"<<endl;
		break;
	case '7':
		m_nDodge = 20;//闪躲机率;20表示20%
		m_nDodgeTime = 10;//还能用几回合
		cout<<g_Object.m_protagonist.m_strName<<"提高了闪躲的机率。"<<endl;
		break;
	case '8':
		UseGoods();
		break;
	default:
		cout<<"请进行有效攻击。"<<endl;
		HelpInfo();
		return ;
	}
	if (bKill) {
		vector<CRole>::iterator iter;
		for(iter = g_Object.m_vecNpc.begin(); iter != g_Object.m_vecNpc.end(); iter++) {
			if (iter->m_nPosX == m_iterNPC.m_nPosX && 
				iter->m_nPosY == m_iterNPC.m_nPosY) {
				g_Object.m_vecNpc.erase(iter);
				break;
			}
		}
		g_Object.m_nGameStart = GS_MAP;
		ClearStart();
	} else {
		HelpInfo();
	}
}

void CFight::AttackHelp()
{
	g_Object.HelpString("", '1',"普通攻击");
	//三斩三绝为杀敌技能,望有效利用。
	g_Object.HelpString("", '2',"飞龙斩:  攻击敌人单体");
	g_Object.HelpString("", '3',"狂风斩:  攻击敌人全体");
	g_Object.HelpString("", '4',"霹雳斩:  攻击敌人单体,三回合内晕乎乎的");
	g_Object.HelpString("", '5',"金钟诀:  六回合内防御加倍");
	g_Object.HelpString("", '6',"必杀诀:  五回合内致命一击机率+50%");
	g_Object.HelpString("", '7',"灵体诀:  十回合内闪避机率+20%");
	g_Object.HelpString("", '8',"使用药物");
	g_Object.HelpString("", '9',"查看状态");
}

void CFight::HelpInfo()
{
	g_Object.SetColor(FOREGROUND_GREEN);
	cout<<"1:普通攻击  2:飞龙斩  3:狂风斩  4:霹雳斩"<<endl;
	cout<<"5:金钟诀    6:必杀诀  7:灵体诀  8:使用药物"<<endl;
	cout<<"9:参看状态             H:查看详细说明"<<endl;
}
void CFight::ClearStart()
{
	m_nBout = 0;//第几回合
	
	m_nNpcDizzy = 0;//NPC晕的状态,大于1表示还要晕几回合,等于0为不晕。
	m_nRoleDefDouble = 0;//主角防御加倍的状态,大于1表示还要加倍几回合,等于0为不加倍。
	m_nDeadly = 0;	//主角致命一击的机率; 20表示20%
	m_nDeadlyTime = 0;//还能用几回合。
	m_nDodge = 0;//闪躲机率;20表示20%
	m_nDodgeTime = 0;//还能用几回合
	m_nBlood = 0;//回血量
	m_nBloodTime = 0; //能回血几回合
}

void CFight::GetExperience()
{
	float fCoefficient;
	if (g_Object.m_protagonist.m_nLevel > m_iterNPC.m_nLevel + 2) {
		fCoefficient = 0.8;
	} else if (g_Object.m_protagonist.m_nLevel + 2 < m_iterNPC.m_nLevel) {
		fCoefficient = 1.2;
	} else {
		fCoefficient = 1.0;
	}
	int nEx = (g_Object.m_protagonist.m_nLevel + 10) * fCoefficient;
	g_Object.m_protagonist.m_nExperience += nEx;
	g_Object.SetColor(FOREGROUND_GREEN);
	cout<<g_Object.m_protagonist.m_strName<<"得到经验"<<nEx<<endl;
	g_Object.m_protagonist.Upgrade();
}

void CFight::UseGoods()
{
	g_Object.SetColor(FOREGROUND_BLUE);
	vector<ROLE_GOODS>::iterator iter;
	for (iter = g_Object.m_vecGoods.begin(); iter != g_Object.m_vecGoods.end(); iter++) {
		if (iter->nType == 3) {
			cout<<"1:"<<iter->strName<<"数量"<<iter->nNumber<<endl;	
		} else if (iter->nType == 4) {
			cout<<"2:"<<iter->strName<<"数量"<<iter->nNumber<<endl;	
		}
	}
	cout<<"您使用:"<<endl;
	char cTemp[30];
	memset(cTemp, 0, 30);
	cin>>cTemp;
	if (cTemp[0] != '1'&& cTemp[0] != '2') {
		cout<<g_Object.m_protagonist.m_strName<<"笨拙的动作浪费了一次吃药的机会。"<<endl;
		return ;
	}
	for (iter = g_Object.m_vecGoods.begin(); iter != g_Object.m_vecGoods.end(); iter++) {
		if (iter->nType == 3 && cTemp[0] == '1') {
			if (iter->nNumber <= 0) {
				cout<<iter->strName<<"已吃完了。"<<endl;
				return ;
			}
			cout<<g_Object.m_protagonist.m_strName<<"使用了"<<iter->strName<<endl;
			m_nBlood = iter->nAttribute;
			m_nBloodTime = 10;
			g_Object.m_protagonist.m_nBlood += this->m_nBlood;
			if (g_Object.m_protagonist.m_nBlood > g_Object.m_protagonist.m_nMaxBlood) {
				g_Object.m_protagonist.m_nBlood = g_Object.m_protagonist.m_nMaxBlood;
			}
			m_nBloodTime--;
			cout<<g_Object.m_protagonist.m_strName<<"生命回复"<<m_nBlood<<"点。"<<endl;
			iter->nNumber--;	
			break;
		} else if (iter->nType == 4 && cTemp[0] == '2') {
			if (iter->nNumber <= 0) {
				cout<<iter->strName<<"已吃完了。"<<endl;
				return ;
			}
			iter->nNumber--;
			cout<<g_Object.m_protagonist.m_strName<<"使用了"<<iter->strName<<endl;
			g_Object.m_protagonist.m_nBlood += iter->nAttribute;
			if (g_Object.m_protagonist.m_nBlood > g_Object.m_protagonist.m_nMaxBlood) {
				g_Object.m_protagonist.m_nBlood = g_Object.m_protagonist.m_nMaxBlood;
			}
			break;
		}
	}

}

⌨️ 快捷键说明

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