📄 fight.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 + -