📄 gamemap.cpp
字号:
#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 + -