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

📄 game.cpp

📁 控制台小游戏中的Game类,包含游戏的逻辑
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -