?? 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 + -