📄 game.cpp
字号:
#include ".\game.h"
#include "GlobalObject.h"
#include "FileOperation.h"
extern CGlobalObject g_Global;
CGame::CGame(void)
{
}
CGame::~CGame(void)
{
}
void CGame::GameHelp()
{
g_Global.SetWordsColor(FOREGROUND_RED|FOREGROUND_GREEN);
cout<<"游戏按键帮助信息:"<<endl;
g_Global.HelpString(" F ",": 查看人物装备");
g_Global.HelpString(" C ",": 查看人物状态");
g_Global.HelpString(" B ",": 查看包裹物品");
g_Global.HelpString(" G ",": 捡取掉落物品");
g_Global.HelpString(" R ",": 休息一个回合");
g_Global.HelpString(" H ",": 查看帮助信息");
g_Global.HelpString(" V ",": 检视周围环境");
g_Global.HelpString(" Q ",": 退出游戏");
g_Global.HelpString(" W ",": 向北移动一段距离");
g_Global.HelpString(" S ",": 向南移动一段距离");
g_Global.HelpString(" A ",": 向西移动一段距离");
g_Global.HelpString(" D ",": 向东移动一段距离");
}
bool CGame::InitPlayer(char *strFileName)
{
char *pName;
pName=new char[30];
cout<<"请输入玩家姓名:";
cin>>pName;
strcpy_s(g_Global.m_protagonist.m_strRoleName,pName);
char Temp[30];
do{
cout<<"请玩家选择职业<1-弓猎手,2-刀猎手>:";
cin>>Temp;
switch(Temp[0])
{
case '1':
cout<<"<骤然响起激昂的音乐:>"<<endl;
g_Global.SetWordsColor();
cout<<" 一位肩负强弓的英勇猎手";
g_Global.SetWordsColor(4,0);
cout<<pName;
g_Global.SetWordsColor();
cout<<"来到了桃源村,他会成为拯救村民的英雄吗?"<<endl;
break;
case '2':
cout<<"<骤然响起激昂的音乐:>"<<endl;
g_Global.SetWordsColor();
cout<<" 一位手提钢刀的英勇猎手";
g_Global.SetWordsColor(4,0);
cout<<pName;
g_Global.SetWordsColor();
cout<<"来到了桃源村,他会成为拯救村民的英雄吗?"<<endl;
break;
default:
cout<<"非有效输入,重新选择!"<<endl;
}
}while(Temp[0]!='1'&&Temp[0]!='2');
int cType=Temp[0]-48;
CFileOperation file;
int nFileLength;
char *pStart=new char[FILE_MAX];
memset(pStart,0,FILE_MAX);
bool bRead=file.ReadFile(strFileName,nFileLength,pStart);
int i,j,k=0;
char pTemp[50];
for(i=0;i<nFileLength;i++)
{
if(pStart[i]=='<'&&pStart[i+1]=='/')
{
for(j=i+2;j<nFileLength;j++)
{
if(pStart[j]=='>'&&pStart[j-1]=='/')
{
if(pStart[i+2]=='0')
{
for(k=i+1;k<j;k++)
{
if(pStart[k]==';')
{
memcpy(pTemp,&pStart[k+1],j-k-2);
g_Global.m_protagonist.InitProtagonist(atoi(pTemp),cType);
}
}
i=j+1;
break;
}
if(pStart[i+2]=='1'&&cType==PROTAGONIST_LONGRANGE)
FillEquip(&pStart[i+3],j-i-4);
else if(pStart[i+2]=='2'&&cType==PROTAGONIST_SHORTRANGE)
FillEquip(&pStart[i+3],j-i-4);
else if(pStart[i+2]=='3')
FillEquip(&pStart[i+3],j-i-4);
else if(pStart[i+2]=='4')
FillGoods(&pStart[i+3],j-i-4);
i=j+1;
break;
}
}
}
}
delete []pStart;
if(!bRead)
{
cout<<"加载人物信息失败!"<<endl;
}
return bRead;
}
void CGame::FillEquip(char *strEquip,int nLength)
{
int Start=0,i,j=0;
PLAYER_EQUIP equip;
char strTemp[30];
memset(strTemp,0,30);
for(i=0;i<nLength;i++)
{
if(strEquip[i]==';')
{
if(j==0)
{
equip.strEquipName=new char[i-Start+1];
memset(equip.strEquipName,0,i-Start+1);
memcpy(equip.strEquipName,&strEquip[Start],i-Start);
}
else if(j==1)
{
memset(strTemp,0,30);
memcpy(strTemp,&strEquip[Start],i-Start);
equip.nEquipType=atoi(strTemp);
}
else if(j==2)
{
memset(strTemp,0,30);
memcpy(strTemp,&strEquip[Start],i-Start);
equip.nAttributeEqu.nMinAtt=atoi(strTemp);
}
else if(j==3)
{
memset(strTemp,0,30);
memcpy(strTemp,&strEquip[Start],i-Start);
equip.nAttributeEqu.nMaxAtt=atoi(strTemp);
memset(strTemp,0,30);
memcpy(strTemp,&strEquip[i+1],nLength-i-1);
equip.nAttributeEqu.nDefend=atoi(strTemp);
}
Start=i+1;
j++;
}
}
if(equip.nEquipType==1)
{
g_Global.m_protagonist.m_nMinAtt=g_Global.m_protagonist.m_nBaseMinAtt+equip.nAttributeEqu.nMinAtt;
g_Global.m_protagonist.m_nMaxAtt=g_Global.m_protagonist.m_nBaseMaxAtt+equip.nAttributeEqu.nMaxAtt;
}
else if(equip.nEquipType==2)
{
g_Global.m_protagonist.m_nMinAtt=g_Global.m_protagonist.m_nBaseMinAtt+equip.nAttributeEqu.nMinAtt;
g_Global.m_protagonist.m_nMaxAtt=g_Global.m_protagonist.m_nBaseMaxAtt+equip.nAttributeEqu.nMaxAtt;
}
else if(equip.nEquipType==3)
{
g_Global.m_protagonist.m_nDefend=g_Global.m_protagonist.m_nBaseDef+equip.nAttributeEqu.nDefend;
}
g_Global.m_vEquip.push_back(equip);
}
void CGame::FillGoods(char *strGoods,int nLength)
{
int i,j=0,Start=0;
PLAYER_GOODS goods;
char strTemp[30];
memset(strTemp,0,30);
for(i=0;i<nLength;i++)
{
if(strGoods[i]==';')
{
if(j==0)
{
goods.strGoodsName=new char[i-Start+1];
memset(goods.strGoodsName,0,i-Start+1);
memcpy(goods.strGoodsName,&strGoods[Start],i-Start);
}
else if(j==1)
{
memset(strTemp,0,30);
memcpy(strTemp,&strGoods[Start],i-Start);
goods.nGoodsType=atoi(strTemp);
}
else if(j==2)
{
memset(strTemp,0,30);
memcpy(strTemp,&strGoods[Start],i-Start);
goods.nGoodsAttribute=atoi(strTemp);
memset(strTemp,0,30);
memcpy(strTemp,&strGoods[i+1],nLength-i-1);
goods.nGoodsNumber=atoi(strTemp);
}
Start=i+1;
j++;
}
}
g_Global.m_vGoods.push_back(goods);
}
bool CGame::InitScenario(char *strFileName)
{
char *pStart=new char[FILE_MAX];
memset(pStart,0,FILE_MAX);
CFileOperation file;
int nFileLength;
bool bRead=file.ReadFile(strFileName,nFileLength,pStart);
if(!bRead)
{
cout<<"加载剧情信息失败!"<<endl;
delete []pStart;
return false;
}
int i,j;
char strNumber[3];
strNumber[2]=0;
SCENARIO_INFO sceInfo;
for(i=0;i<nFileLength;i++)
{
if(pStart[i]=='<'&&pStart[i+1]=='/')
{
for(j=i+2;j<nFileLength;j++)
{
if(pStart[j]=='>'&&pStart[j-1]=='/')
{
sceInfo.strSceInfo=new char[j-i-4];
memcpy(sceInfo.strSceInfo,&pStart[i+4],j-i-5);
sceInfo.strSceInfo[j-i-5]=0;
memcpy(strNumber,&pStart[i+2],2);
sceInfo.nInfoLength=j-i-3;
sceInfo.nSceType=atoi(strNumber);
g_Global.m_vScenarioInfo.push_back(sceInfo);
i=j+1;
break;
}
}
}
}
delete []pStart;
return bRead;
}
bool CGame::InitNPC(char * strFileName)
{
char *pStart=new char[FILE_MAX];
memset(pStart,0,FILE_MAX);
CFileOperation file;
int nFileLength;
bool bRead=file.ReadFile(strFileName,nFileLength,pStart);
if(!bRead)
{
cout<<"加载怪物信息失败!"<<endl;
delete []pStart;
return false;
}
int i,j;
for(i=0;i<nFileLength;i++)
{
if(pStart[i]=='<'&&pStart[i+1]=='/')
{
for(j=i+2;j<nFileLength;j++)
{
if(pStart[j]=='>'&&pStart[j-1]=='/')
{
FillNPC(&pStart[i+2],j-i-2);
i=j+1;
break;
}
}
}
}
delete []pStart;
return bRead;
}
void CGame::FillNPC(char *strNPC,int nLength)
{
int start=0,i,j=0;
char strTemp[30];
memset(strTemp,0,30);
CRole role;
int nLevel,nType,nPosX,nPosY;
for(i=0;i<nLength;i++)
{
if(strNPC[i]==';')
{
if(j==0)
{
memcpy(role.m_strRoleName,&strNPC[start],i-start);
}
else if(j==1)
{
memset(strTemp,0,30);
memcpy(strTemp,&strNPC[start],i-start);
nLevel=atoi(strTemp);
}
else if(j==2)
{
memset(strTemp,0,30);
memcpy(strTemp,&strNPC[start],i-start);
nType=atoi(strTemp);
}
else if(j==3)
{
memset(strTemp,0,30);
memcpy(strTemp,&strNPC[start],i-start);
nPosX=atoi(strTemp);
}
else if(j==4)
{
memset(strTemp,0,30);
memcpy(strTemp,&strNPC[start],i-start);
nPosY=atoi(strTemp);
}
start=i+1;
j++;
}
}
role.InitMonsterNPC(nLevel,nType,nPosX,nPosY);
g_Global.m_vNPC.push_back(role);
g_Global.m_NPC_Number=g_Global.m_vNPC.size();
}
bool CGame::Init()
{
SetConsoleTitle("丛林猎手");
g_Global.DrawTitlePicture();
g_Global.SetWordsColor(6,2);
cout<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
if(!InitScenario("start.txt"))
return false;
vector<SCENARIO_INFO>::iterator iter;
for(iter=g_Global.m_vScenarioInfo.begin();iter!=g_Global.m_vScenarioInfo.end();iter++)
{
if(iter->nSceType==1)
{
g_Global.PlayString(iter->strSceInfo,iter->nInfoLength,30);
break;
}
}
g_Global.SetWordsColor(6,2);
cout<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
if(!InitPlayer("role.txt"))
return false;
g_Global.SetWordsColor(6,2);
cout<<"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"<<endl;
if(!InitNPC("monster.txt"))
return false;
return true;
}
void CGame::GameRender(char cCommand)
{
switch(cCommand)
{
case 'f':
case 'F':
{
vector<PLAYER_EQUIP>::iterator iter;
for(iter=g_Global.m_vEquip.begin();iter!=g_Global.m_vEquip.end();iter++)
{
switch(g_Global.m_protagonist.m_nRoleType)
{
case PROTAGONIST_LONGRANGE:
if(iter->nEquipType==EQUIP_WEAPON_BOW)
{
g_Global.SetWordsColor(4,0);
cout<<g_Global.m_protagonist.m_strRoleName;
g_Global.SetWordsColor(6,2);
cout<<"装备资料:"<<endl;
cout<<"手部:"<<" "<<iter->strEquipName<<"(属性:攻击16-20 限制:弓猎手)"<<endl;
}
break;
case PROTAGONIST_SHORTRANGE:
if(iter->nEquipType==EQUIP_WEAPON_SWORD)
{
g_Global.SetWordsColor(4,0);
cout<<g_Global.m_protagonist.m_strRoleName;
g_Global.SetWordsColor(6,2);
cout<<" 装备资料:"<<endl;
cout<<"手部:"<<" "<<iter->strEquipName<<"(属性:攻击12-15 限制:刀猎手)"<<endl;
}
break;
}
if(iter->nEquipType==EQUIP_CLOTHES)
{
cout<<"身体:"<<" "<<iter->strEquipName<<"(属性:防御20 限制:无)"<<endl;
}
}
}
break;
case 'c':
case 'C':
g_Global.SetWordsColor(4,0);
cout<<g_Global.m_protagonist.m_strRoleName;
g_Global.SetWordsColor(6,2);
cout<<"人物状态:"<<endl;
cout<<"等级: "<<g_Global.m_protagonist.m_nLevel<<endl;
if(g_Global.m_protagonist.m_nRoleType==PROTAGONIST_LONGRANGE)
cout<<"职业: 弓猎手"<<endl;
else if(g_Global.m_protagonist.m_nRoleType==PROTAGONIST_SHORTRANGE)
cout<<"职业: 刀猎手"<<endl;
cout<<"经验: "<<g_Global.m_protagonist.m_nExperience<<"/"<<g_Global.m_protagonist.m_nUpgradeExp<<endl;
cout<<"生命值: "<<g_Global.m_protagonist.m_nHP<<"/"<<g_Global.m_protagonist.m_nMaxHP<<endl;
cout<<"气力值: "<<g_Global.m_protagonist.m_nMP<<"/"<<g_Global.m_protagonist.m_nMaxMP<<endl;
cout<<"防御: "<<g_Global.m_protagonist.m_nDefend<<endl;
cout<<"攻击: "<<g_Global.m_protagonist.m_nMinAtt<<"-"<<g_Global.m_protagonist.m_nMaxAtt<<endl;
break;
case 'b':
case 'B':
g_Global.SetWordsColor(4,0);
cout<<g_Global.m_protagonist.m_strRoleName;
g_Global.SetWordsColor(6,2);
cout<<"包裹物品:"<<endl;
{
vector<PLAYER_GOODS>::iterator iter;
for(iter=g_Global.m_vGoods.begin();iter!=g_Global.m_vGoods.end();iter++)
{
if (iter->nGoodsType==GOODS_ADDHP)
{
cout<<"<"<<iter->strGoodsName<<">"<<endl;
cout<<"数量:"<<iter->nGoodsNumber<<endl;
cout<<"属性:瞬间补血"<<iter->nGoodsAttribute<<"点"<<endl;
}
else if(iter->nGoodsType==GOODS_ADDMP)
{
cout<<"<"<<iter->strGoodsName<<">"<<endl;
cout<<"数量:"<<iter->nGoodsNumber<<endl;
cout<<"属性:瞬间补气"<<iter->nGoodsAttribute<<"点"<<endl;
}
}
if(g_Global.m_NPC_Number==0)
{
cout<<"<猎手勋章>"<<endl;
cout<<"属性:增加攻击10点"<<endl;
}
}
break;
case 'g':
case 'G':
cout<<"没有任何物品掉落!"<<endl;
break;
case 'r':
case 'R':
if(g_Global.m_protagonist.m_nHP<g_Global.m_protagonist.m_nMaxHP)
{
g_Global.m_protagonist.m_nHP+=g_Global.m_protagonist.m_nMaxHP/10;
if(g_Global.m_protagonist.m_nHP<g_Global.m_protagonist.m_nMaxHP)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -