一个c++实现的简单推箱子小游戏

第一次发博客也不太会用,基于控制台的一个推箱子小游戏,就不说什么废话了直接上干货,代码服下
用到的工具 vc6.0+easyx
`​
附加easyX的下载链接:https://easyx.cn/downloads/

复制可直接运行

#include//c++输入输出头文件
using namespace std;//引入命名空间
#include<conio.h>//使用getch()接收输入命令
#include<graphics.h>//图形库头文件
#include<mmsystem.h>//多媒体头文件
#pragma comment(lib,“winmm.lib”)//声音组件

//宏定义地图上的事物
#define LAND 0 //空地
#define WALL 1 //墙
#define HERO 2 //人
#define BOX_ 3 //箱子
#define END_ 4 //目的地

//地图
int Map[10][10] ={
WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,
WALL,END_,LAND,LAND,LAND,LAND,LAND,LAND,END_,WALL,
WALL, WALL, WALL, WALL, LAND, LAND, LAND, LAND, LAND, WALL,
WALL, LAND, LAND, WALL, LAND, LAND, LAND, WALL, WALL, WALL,
WALL, LAND, LAND, LAND, HERO, LAND, BOX_, LAND, LAND, WALL,
WALL, LAND, BOX_, LAND, LAND, LAND, LAND, LAND, LAND, WALL,
WALL, LAND, LAND, WALL, LAND, LAND, LAND, LAND, LAND, WALL,
WALL, LAND, WALL, LAND, LAND, WALL, BOX_, WALL, LAND, WALL,
WALL, WALL, LAND, LAND, LAND, WALL, END_, WALL, LAND, WALL,
WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL,
};
//定义图片
IMAGE bk, bird, birdfb, boom, boomfb, box, boxfb, EndPoint, EndPointfb, wall;

//声明函数
void DrawMap(); //画地图
void PlayGame(); //进行游戏
void Walk(int X,int Y);//行走逻辑
void lnitlma(); //初始化图片
//主函数入口
int main()
{
//创建一个窗口
initgraph(500,500,SHOWCONSOLE);//系统自带,不用定义
//初始化图片
lnitlma();
//1.打开音频
mciSendString(“open BGM.mp3”,0,0,0);
//播放音频
mciSendString (“play BGM.mp3”,0,0,0);

while (true)
{
//清屏
	cleardevice();
	DrawMap();
	PlayGame();
}
closegraph();
return 0;

}

//实现函数

//画地图
void DrawMap()
{
/*
void putimage(int dstX, int dstY, const IMAGE pSrcImg, DWORD dwRop = SRCCOPY); // 绘制图像到屏幕
void putimage(int dstX, int dstY, int dstWidth, int dstHeight, const IMAGE pSrcImg, int srcX, int srcY, DWORD dwRop = SRCCOPY); // 绘制图像到屏幕(指定宽高)
/
putimage (0,0,&bk);//绘制图片到屏幕
for(int i =0;i<10;i++)
{
for(int j = 0;j<10;j++)
{
switch(Map[i][j])
{
case LAND :
break;
case WALL:
putimage(j
50,i
50,&wall);
break;
case HERO:
putimage(j
50,i50,&birdfb,SRCAND);///???
putimage(j
50,i50,&bird,SRCPAINT);///???
break;
case BOX_:
putimage(j
50,i50,&EndPointfb,SRCAND);
putimage(j
50,i50,&EndPoint,SRCPAINT);
break;
case END_:
putimage(j
50,i50,&boxfb,SRCAND);
putimage(j
50,i50,&box,SRCPAINT);
break;
case HERO +END_:
putimage(j
50,i50,&boomfb,SRCAND);
putimage(j
50,i50,&boom,SRCPAINT);
break;
case BOX_+END_:
putimage(j
50,i50,&boomfb,SRCAND);
putimage(j
50,i*50,&boom,SRCPAINT);
break;
default:
break;
}
}
cout<<endl;

}
}
//行走逻辑
void Walk(int X,int Y)
{
/*
行走逻辑
1找到人 遍历数组 得到坐标
2走 改变数组的值
下一个位置可能是:
空地 走一步:当前—HERO 下一个+HERO
墙 不动
成功点 踩上去
箱子+成功点 当前-人 下-箱子+下下+箱子
箱子
判断箱子下个位置
推不了-------不动
能推---------推
*/

int heroPos_X,heroPos_Y;
for(int i=0;i<10;i++)
{
	for(int j=0;j<10;j++)
	{
	if(HERO==Map[i][j]||HERO+END_==Map[i][j])
	{
	heroPos_X=i;
	heroPos_Y=j;
	}
	}
}
//下一位置是空地或成功点
if(LAND==Map[heroPos_X+X][heroPos_Y+Y]||END_==Map[heroPos_X+X][heroPos_Y+Y])
{
//当前位置人离开
Map[heroPos_X][heroPos_Y] -= HERO;
//下个位置人过来
Map[heroPos_X + X][heroPos_Y + Y] += HERO;
}
else if( BOX_ == Map[heroPos_X + X][heroPos_Y + Y] ||
	BOX_ + END_ == Map[heroPos_X + X][heroPos_Y + Y])	//下个位置是箱子或箱子+成功点)
{
if (LAND == Map[heroPos_X + (X*2)][heroPos_Y + (Y*2)] ||
		END_ == Map[heroPos_X + (X * 2)][heroPos_Y + (Y * 2)])//下下个位置是空地或是成功点
		{
		//当前位置人离开
		Map[heroPos_X][heroPos_Y] -= HERO;
		//下个位置人来,箱子走
		Map[heroPos_X + X][heroPos_Y + Y] += (HERO-BOX_);
		//下下个位置箱子过来
		Map[heroPos_X + (X * 2)][heroPos_Y + (Y * 2)] += BOX_;
	}
}

}
//初始化图片
void lnitlma()
{
loadimage(&bk, “bk.jpg”, 500, 500);

//加载小鸟  第一个图是原图 掩码图
loadimage(&bird, "images\\bird.bmp", 50, 50);
loadimage(&birdfb, "images\\birdfb.bmp", 50, 50);

//加载boom  第一个图是原图 掩码图
loadimage(&boom, "images\\boom.bmp", 50, 50);
loadimage(&boomfb, "images\\boomfb.bmp", 50, 50);

//加载箱子  第一个图是原图 掩码图
loadimage(&box, "images\\box.bmp", 50, 50);
loadimage(&boxfb, "images\\boxfb.bmp", 50, 50);

//加载目的地  第一个图是原图 掩码图
loadimage(&EndPoint, "images\\EndPoint.bmp", 50, 50);
loadimage(&EndPointfb, "images\\EndPointfb.bmp", 50, 50);

//加载墙
loadimage(&wall, "images\\wall.bmp", 50, 50);

}

//进行游戏
void PlayGame()
{
/*
人在地图上走 能推动箱子 就推着走

		通过 wsad WSAD 控制行走
*/

switch (getch())					//不要回车
{
case 'W':
case 'w':
	//写行走逻辑 向上
	Walk(-1,0);
	break;
case 'S':
case 's':
	Walk(1, 0);
	break;
case 'A':
case 'a':
	Walk(0,-1);
	break;
case 'D':
case 'd':
	Walk(0, 1);
	break;
default:
	break;
}

}

简易推箱子 #include "Map.h" #include <conio.h> int XDest = 4; int YDest = 4; void CMap::Init() { int i,j; CPoint cPoint; CSprite *pSphte; CPlayer cPlay; CBox cBox; CDest cDest; int XPlayer = 4; int YPlayer = 6; int XBox = 4; int YBox = 5; for (i = 0; i < 10; i++) { for (j =0; j < 10; j++) { if (i == 0 || j == 0 || i == 9 || j == 9) { cPoint.SetPoint(i, j); pSphte = new CWall(cPoint); m_nMap[i][j] = pSphte; } else if (i == XPlayer && j == YPlayer) { cPoint.SetPoint(i,j); pSphte = new CPlayer(cPoint); m_nMap[i][j] = pSphte; } else if (i == XBox && j == YBox) { cPoint.SetPoint(i,j); pSphte = new CBox(cPoint); m_nMap[i][j] = pSphte; } else if (i == XDest && j == YDest) { cPoint.SetPoint(i,j); pSphte = new CDest(cPoint); m_nMap[i][j] = pSphte; } else { cPoint.SetPoint(i, j); pSphte = new CSpace(cPoint); m_nMap[i][j] = pSphte; } } cout<<endl; } } void CMap::Draw() { int i,j; for (i=0; i<10; i++) { for (j=0; j<10; j++) { cout<<m_nMap[i][j]->GetSprite(); } cout<<endl; } } void CMap::Logic() { int n = getch(); //获取输入的数字 char ch = char(n);//将获取到的数字进行强制类型转换 CPlayer *pPlayer = GetPlayer(); int XPlayer = pPlayer->GetX(); int YPlayer = pPlayer->GetY(); CBox *pBox = GetBox(); int XBox = pBox->GetX(); int YBox = pBox->GetY(); CDest *pDest = GetDest(); switch(ch) { case 'a': { int yPlayer = pPlayer->GetY(); YPlayer--; if ("※" == m_nMap[XPlayer][YPlayer]->GetSprite()) { YPlayer++; } else if (m_nMap[XPlayer][YPlayer]->GetSprite() == "■" || m_nMap[XPlayer][YPlayer]->GetSprite() == "●") { int yBox = pBox->GetY(); YBox--; if (m_nMap[XBox][YBox]->GetSprite() == "※") { YPlayer++; YBox++; } CSprite *pB = m_nMap[pBox->GetX()][yBox]; m_nMap[pBox->GetX()][yBox] = m_nMap[XBox][YBox]; m_nMap[XBox][YBox] = pB; pBox->SetY(YBox); m_nMap[pBox->GetX()][yBox]->SetY(yBox); } CSprite *pP = m_nMap[pPlayer->GetX()][yPlayer]; m_nMap[pPlayer->GetX()][yPlayer] = m_nMap[XPlayer][YPlayer]; m_nMap[XPlayer][YPlayer] = pP; pPlayer->SetY(YPlayer); m_nMap[pPlayer->GetX()][yPlayer]->SetY(yPlayer); } break; case 'd': { int yPlayer = pPlayer->GetY(); YPlayer++; if ("※" == m_nMap[XPlayer][YPlayer]->GetSprite()) { YPlayer--; } else if (m_nMap[XPlayer][YPlayer]->GetSprite() == "■" || m_nMap[XPlayer][YPlayer]->GetSprite() == "●") { int yBox = pBox->GetY(); YBox++; if (m_nMap[XBox][YBox]->GetSprite() == "※") { YPlayer--; YBox--; } CSprite *pB = m_nMap[pBox->GetX()][yBox]; m_nMap[pBox->GetX()][yBox] = m_nMap[XBox][YBox]; m_nMap[XBox][YBox] = pB; pBox->SetY(YBox); m_nMap[pBox->GetX()][yBox]->SetY(yBox); } CSprite *pP = m_nMap[pPlayer->GetX()][yPlayer]; m_nMap[pPlayer->GetX()][yPlayer] = m_nMap[XPlayer][YPlayer]; m_nMap[XPlayer][YPlayer] = pP; pPlayer->SetY(YPlayer); m_nMap[pPlayer->GetX()][yPlayer]->SetY(yPlayer); } break; case 'w': { int xPlayer = pPlayer->GetX(); XPlayer--; if ("※" == m_nMap[XPlayer][YPlayer]->GetSprite()) { XPlayer++; } else if (m_nMap[XPlayer][YPlayer]->GetSprite() == "■" || m_nMap[XPlayer][YPlayer]->GetSprite() == "●") { int xBox = pBox->GetX(); XBox--; if (m_nMap[XBox][YBox]->GetSprite() == "※") { XPlayer++; XBox++; } CSprite *pB = m_nMap[xBox][pBox->GetY()]; m_nMap[xBox][pBox->GetY()] = m_nMap[XBox][YBox]; m_nMap[XBox][YBox] = pB; pBox->SetX(XBox); m_nMap[xBox][pBox->GetY()]->SetX(xBox); } CSprite *pP = m_nMap[xPlayer][pPlayer->GetY()]; m_nMap[xPlayer][pPlayer->GetY()] = m_nMap[XPlayer][YPlayer]; m_nMap[XPlayer][YPlayer] = pP; pPlayer->SetX(XPlayer); m_nMap[xPlayer][pPlayer->GetY()]->SetX(xPlayer); } break; case 's': { int xPlayer = pPlayer->GetX(); XPlayer++; if ("※" == m_nMap[XPlayer][YPlayer]->GetSprite()) { XPlayer--; } else if (m_nMap[XPlayer][YPlayer]->GetSprite() == "■" || m_nMap[XPlayer][YPlayer]->GetSprite() == "●") { int xBox = pBox->GetX(); XBox++; if (m_nMap[XBox][YBox]->GetSprite() == "※") { XPlayer--; XBox--; } CSprite *pB = m_nMap[xBox][pBox->GetY()]; m_nMap[xBox][pBox->GetY()] = m_nMap[XBox][YBox]; m_nMap[XBox][YBox] = pB; pBox->SetX(XBox); m_nMap[xBox][pBox->GetY()]->SetX(xBox); } CSprite *pP = m_nMap[xPlayer][pPlayer->GetY()]; m_nMap[xPlayer][pPlayer->GetY()] = m_nMap[XPlayer][YPlayer]; m_nMap[XPlayer][YPlayer] = pP; pPlayer->SetX(XPlayer); m_nMap[xPlayer][pPlayer->GetY()]->SetX(xPlayer); } break; default: break; } if ((pPlayer->GetX() == XDest && pPlayer->GetY() == YDest) || (pBox->GetX() == XDest && pBox->GetY() == YDest)) { int i,j; for (i = 0; i < 10; i++) { for (j =0; j < 10; j++) { if (m_nMap[i][j]->GetSprite() == "◎") { m_nMap[i][j]->SetSprite(" "); } } } } else if (m_nMap[XDest][YDest]->GetSprite() == " ") { m_nMap[XDest][YDest]->SetSprite("◎"); } if (m_nMap[XDest][YDest]->GetSprite() == "■") { m_nMap[XDest][YDest]->SetSprite("●"); // cout<<"游戏结束"<<endl; } if (pBox->GetX() != XDest || pBox->GetY() != YDest) { pBox->SetSprite("■"); } } CPlayer *CMap::GetPlayer(void) { int i, j; for (i = 0; i < 10; i++) { for (j =0; j < 10; j++) { if (m_nMap[i][j]->GetSprite() == "♀") { return (CPlayer *)m_nMap[i][j]; } } } } CBox *CMap::GetBox(void) { int i, j; for (i = 0; i < 10; i++) { for (j =0; j < 10; j++) { if (m_nMap[i][j]->GetSprite() == "■" || m_nMap[i][j]->GetSprite() == "●") { return (CBox *)m_nMap[i][j]; } } } } CDest *CMap::GetDest(void) { int i, j; for (i = 0; i < 10; i++) { for (j =0; j < 10; j++) { if (m_nMap[i][j]->GetSprite() == "◎") { return (CDest *)m_nMap[i][j]; } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值