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

📄 gamemap.cpp

📁 MUD文字游戏开发
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "GlobalDef.h"
#include <Windows.h>
#include <conio.h>
#include "GameMap.h"
#include <time.h>
#include <fstream>
#include <string>
#include <iostream>
#include "Input.h"

CGameMap* CGameMap::m_pGameMap = NULL;

//运用类的单例
CGameMap* CGameMap::GetInstance()
{
	if(m_pGameMap==NULL)
	{
		m_pGameMap=new CGameMap();
	}
	return m_pGameMap;
}

CGameMap::CGameMap(void)
{
	m_pcPlayer = new CPlayer();
	m_pcMonster = new CMonster();
	m_DrawMapElement = new CInterface();
}

CGameMap::~CGameMap(void)
{
	delete m_pcPlayer;
	delete m_pcMonster;
	delete m_DrawMapElement;
}

void CGameMap::IntoIceMap()
{
	m_bRunIceMap= true;
	m_bStopMove = false;
	m_bFight	= false;
	m_vecMonster.clear();
}

//控制冰原地图上的怪物不停地移动
void CGameMap::IceMonsterMove()
{
	while (m_bRunIceMap)
	{
		if (!m_bFight && !m_bStopMove)
		{
			vector<CMonster>::iterator it;
			for(it = m_vecMonster.begin();it!=m_vecMonster.end();++it)
			{
				DrawMonsterMove(&(*it),(*it).GetName());
			}
		}
		Sleep(500);
	}
}

//画出移动后的怪物
void CGameMap::DrawMonsterMove(CMonster *pMonster,string strName)
{
	int nOldX,nOldY;
	int nPlayerPOSX = m_pcPlayer->GetPlayerX();
	int nPlayerPOSY = m_pcPlayer->GetPlayerY();
	//如果人进入怪物各自的领域,怪物则停止移动,等待人的进攻。
	//这样做只是为了程序的一个简单化。
	if (nPlayerPOSX<pMonster->GetMonsterMinX() || nPlayerPOSX>pMonster->GetMonsterMaxX() ||
		nPlayerPOSY<pMonster->GetMonsterMinY() || nPlayerPOSY>pMonster->GetMonsterMaxY())
	{
		//让别玩家杀死的怪物重生
		if(pMonster->GetCurrentHP() <= 0)
		{
			pMonster->SetCurrentHP();
		}
		//保存怪物的移动前的坐标
		nOldX = pMonster->GetMonsterX();
		nOldY = pMonster->GetMonsterY();
		//怪物按照随机取到的方向进行行走
		pMonster->MonsterMove();
		//画出怪物目前的位置
		DrawRole(nOldX,nOldY,pMonster->GetMonsterX(),pMonster->GetMonsterY(),strName);
	}
}

//运行冰原地图
void CGameMap::IceMapRun()
{
	int nKey;
	srand((unsigned)time(NULL));
	//初始化冰原地图
	InitIceMap();
	while (m_bRunIceMap)
	{
		if (m_bFight)
		{
			Fighting();//战斗中
		}
		else
		{
			nKey=_getch();
			IceKeyEvent(nKey);
		}
	}
}

//控制玩家的移动
void CGameMap::IceKeyEvent(int nKey)
{
	int nOldX,nOldY,nCurrentX,nCurrentY;
	nOldX = m_pcPlayer->GetPlayerX();
	nOldY = m_pcPlayer->GetPlayerY();
	switch(nKey)
	{
	case 72://向上:0
		if (nOldY > 0)
		{
			if (nOldY==18 && nOldX<20 && nOldX!=14)
			{
				break;
			}
			if (nOldY==3 && nOldX>=(SCREENWIDTH-6))
			{
				break;
			}
			RolesHitCheck(nOldX,nOldY,0);
			if (m_bFight)
			{
				break;
			}
			m_pcPlayer->PlayerMove(0,-1);
		}
		break;
	case 80://向下:1
		if (nOldY < (SCREENHEIGHT-1))
		{
			if (nOldY==16 && nOldX<22 && nOldX!=14)
			{
				break;
			}
			RolesHitCheck(nOldX,nOldY,1);
			if (m_bFight)
			{
				break;
			}
			m_pcPlayer->PlayerMove(0,1);
		}
		break;
	case 75://向左:2
		if (nOldX > 1)
		{
			if ((nOldY==SCREENHEIGHT-8) && nOldX==14)//控制不能穿过城堡的围墙
			{
				break;
			}
			if (nOldX==22 && nOldY>(SCREENHEIGHT-9))
			{
				break;
			}
			RolesHitCheck(nOldX,nOldY,2);
			if (m_bFight)
			{
				break;
			}
			m_pcPlayer->PlayerMove(-2,0);
		}
		break;
	case 77://向右:3
		if (nOldX<(SCREENWIDTH-2))
		{
			if (nOldX==(SCREENWIDTH-8) && nOldY>=0 && nOldY<3)
			{
				//提示通行的条件
				if(nOldY == 1)
				{
					ClueOnMESS();
					while (1)
					{
						_getch();
						break;
					}
					system("cls");
					DrawCastle();//在冰原地图的左下角画出城堡
					DrawBurrow();//在冰原地图的右上角画出火魔的洞穴入库
					m_bStopMove = false;
				}
				break;
			}
			if ((nOldY==SCREENHEIGHT-8) && nOldX==14)
			{
				break;
			}
			if (nOldX==18 && nOldY>(SCREENHEIGHT-9))
			{
				break;
			}
			RolesHitCheck(nOldX,nOldY,3);
			if (m_bFight)
			{
				break;
			}
			m_pcPlayer->PlayerMove(2,0);
		}
		break;
	case 27://取消键ESC,暂时做成直接返回主菜单
		system("cls");
		m_bRunIceMap = false;
	}
	if ((!m_bFight) && (m_bRunIceMap == true))
	{
		nCurrentX = m_pcPlayer->GetPlayerX();
		nCurrentY = m_pcPlayer->GetPlayerY();
		//画出玩家新的位置
		DrawRole(nOldX,nOldY,nCurrentX,nCurrentY,"侠");
	}
}

//画出初始化的冰原地图
void CGameMap::InitIceMap()
{
	//int nX,nY;
	DrawCastle();//在冰原地图的左下角画出城堡
	DrawBurrow();//在冰原地图的右上角画出火魔的洞穴入库
	//显示玩家的初始位置
	//m_pcPlayer->InitPlayer(1,10,(SCREENHEIGHT - 4));//获取玩家的初始坐标
	//nX = m_pcPlayer->GetPlayerX();
	//nY = m_pcPlayer->GetPlayerY();
	//DrawRole(nX,nY,nX,nY,"侠");
	InitPlayer();
	//显示怪物的初始位置
	InitIceMonster();
}

//初始化玩家
void CGameMap::InitPlayer()
{
	string Name;
	int nX,nY;
	ifstream infile("Player.txt");
	if(infile)
	{
		string strName;
		int nHP,nMP,nCurHP,nCurMP,nAttack,nDefence,nMoney;
		unsigned unEXP;
		int nLevel,nCurPosX,nCurPosY;
		getline(infile,string());
		while(!infile.eof())
		{
			infile>>strName>>nHP>>nMP>>nCurHP>>nCurMP>>nAttack>>nDefence>>nMoney>>unEXP
				>>nLevel>>nCurPosX>>nCurPosY;
		}
		m_pcPlayer->InitPlayer(strName,nHP,nMP,nCurHP,nCurMP,nAttack,nDefence,nMoney,unEXP,nLevel,nCurPosX,nCurPosY);
	}
	nX = m_pcPlayer->GetPlayerX();
	nY = m_pcPlayer->GetPlayerY();
	DrawRole(nX,nY,nX,nY,"侠");
}

//画出开始时冰原地图上的怪物
void CGameMap::InitIceMonster()
{
	//从文件中导入各怪物的初始化值
	ifstream infile("Monster.txt");
	if(infile)
	{
		string strName,strSkill;
		int nHP,nMP,nCurHP,nCurMP,nAttack,nDefence,nMoney;
		unsigned unEXP;
		int nMinPosX,nMaxPosX,nMinPosY,nMaxPosY;
		getline(infile,string());
		while(!infile.eof())
		{
			infile>>strName>>nHP>>nMP>>nCurHP>>nCurMP>>nAttack>>nDefence>>nMoney>>unEXP
				>>nMinPosX>>nMaxPosX>>nMinPosY>>nMaxPosY>>strSkill;
			m_vecMonster.push_back(CMonster(strName,nHP,nMP,nCurHP,nCurMP,nAttack,nDefence,
				nMoney,unEXP,nMinPosX,nMaxPosX,nMinPosY,nMaxPosY,strSkill));		
		}
	}
	infile.close();
	infile.clear();	
	//画出各怪物的初始位置
	vector<CMonster>::iterator it;
	for(it = m_vecMonster.begin();it!=m_vecMonster.end();++it)
	{

⌨️ 快捷键说明

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