第一次发博客也不太会用,基于控制台的一个推箱子小游戏,就不说什么废话了直接上干货,代码服下
用到的工具 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(j50,i50,&wall);
break;
case HERO:
putimage(j50,i50,&birdfb,SRCAND);///???
putimage(j50,i50,&bird,SRCPAINT);///???
break;
case BOX_:
putimage(j50,i50,&EndPointfb,SRCAND);
putimage(j50,i50,&EndPoint,SRCPAINT);
break;
case END_:
putimage(j50,i50,&boxfb,SRCAND);
putimage(j50,i50,&box,SRCPAINT);
break;
case HERO +END_:
putimage(j50,i50,&boomfb,SRCAND);
putimage(j50,i50,&boom,SRCPAINT);
break;
case BOX_+END_:
putimage(j50,i50,&boomfb,SRCAND);
putimage(j50,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;
}
}