如何用C++和图形库制作一个简单的推箱子小游戏?
如何用C++和图形库制作一个简单的推箱子小游戏?
推箱子是我们小时候经常会玩的很简单的小游戏,在小神机的年代里,推箱子小游戏非常风靡,对于已经掌握了一定编程知识的你,简单地模仿这个游戏进行创作一定不是难事,那么我们现在尝试去制作它吧!
编程语言:C++
图形库:graphics.h
(图形库的安装教程参考:Visual Studio C++/C 教你四步安装graphics图形库)
一、前期分析
- 对于推箱子小游戏,我们需要考虑有几个游戏角色,易知,我们需要设置的是:
空地、箱子、墙壁、人、箱子要到达的终点,玩家起点
- 通过键入方向键,我们可以控制人移动,人的移动会发生以下状况:
1.人走到空地上
2.人推到了箱子
3.人走到终点
4.人推着箱子一起移动=人推箱子都走到空地上+人推箱子撞到墙+人推箱子到终点
5.人撞墙
- 我们要完成的几项任务:
1.推箱子地图设计
2.人物移动设计(按键键入)
3.关卡设计(完成后进入下一关)
二、地图设计
首先,我们需要将不同的角色用不同的数字代表,然后通过二维数组,来构建地图,就像这样:
1,1,1,1,1,1,1,1,
1,3,4,0,0,4,3,1,
1,0,1,0,0,1,0,1,
1,0,0,0,0,0,0,1,
1,0,1,5,0,1,0,1,
1,3,4,0,0,4,3,1,
1,1,1,1,1,1,1,1,
然后我们设计多个关卡,构成一个三维数组,接着我们对以上分析的几个游戏角色进行贴图,将图片导入。
三、人物移动设计
我们通过键入方向键来操纵人物的移动,并对人物移动所产生的不同的游戏状态,写出相应的代码。
即:对键入按键处理
判断:只有人可移动—>寻找人—>=5
判断:怎么移动?
数组操作:需要按键,上下左右
键入成功输出不同结果:不同方位按键进行不同的处理,遍历数组打印地图
四、是否进入下一关卡或者是否游戏结束
人物移动后,判断我们的箱子是不是都到达了终点,然后判断是否已经是最后一个关卡。
游戏完成后弹出自己设计的界面。
(我的是漂亮小姐姐嘿嘿嘿~)
这里放上我的人物角色图片:
这里其实是有一块白色的地面但是你们看不见,我恨!
好的现在我放上我的源码,但是你们要注意更改其中的图片文件的位置,还有你们要放入的文件名字哦!
给你们看看我的文件名:
源码:
现在就是我的完整代码了,希望借鉴以后能给我点支持哈哈哈哈哈哈
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
//制作地图,二维数组绘制
int map[3][7][8] =
{
1,1,1,1,1,1,1,1,
1,3,4,0,0,4,3,1,
1,0,1,0,0,1,0,1,
1,0,0,0,0,0,0,1,
1,0,1,5,0,1,0,1,
1,3,4,0,0,4,3,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,3,1,0,0,1,3,1,
1,4,1,1,0,4,0,1,
1,0,1,0,0,0,0,1,
1,0,1,5,0,4,0,1,
1,0,0,0,0,1,3,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,3,4,0,4,3,1,1,
1,1,1,0,0,1,1,1,
1,0,0,0,0,0,0,1,
1,4,1,5,0,1,4,1,
1,3,1,0,0,1,3,1,
1,1,1,1,1,1,1,1,
};
//关卡控制变量
int cos = 0;
//批量处理数据
IMAGE img[6];//存放照片
int imgIndex[6] = { 0,1,3,4,5,7 };
//加载资源----->变量的初始化
//不同变量初始化方式不同
//loadimage 初始化 IMAGE 变量
void loadResource()
{
for (int i = 0; i < 6; i++)
{
char filename[20] = "";
sprintf_s(filename, "%d.png", imgIndex[i]);
loadimage(img + i, filename);
}
}
//制作地图----->各个值分别代表什么物品
//遍历数组,打印相关物品
void drawMap()
{
int i, j;
int x, y;//坐标
for (i = 0; i < 7; i++)
{
for (j = 0; j < 8; j++)
{
x = 64 * j;
y = 64 * i;
//游戏状态分析
switch (map[cos][i][j])
{
case 0://空地
putimage(x, y, img + 0);
break;
case 1://墙面
putimage(x, y, img + 1);
break;
case 3://终点
putimage(x, y, img + 2);
break;
case 4://箱子
putimage(x, y, img + 3);
break;
case 5://人
putimage(x, y, img + 4);
break;
case 7://箱子推到了终点
putimage(x, y, img + 5);
break;
case 8://人在终点上
putimage(x, y, img + 4);
break;
}
}
}
}
//按键处理
//只有人可移动--->寻找人--->=5
//怎么移动?
//数组操作:需要按键,上下左右
//不同方位按键进行不同的处理
//遍历数组打印地图
void keyDown()
{
int i, j;
for (i = 0; i < 7; i++)
{
for (j = 0; j < 8; j++)
{
if (map[cos][i][j] == 5 || map[cos][i][j] == 8)
break;
}
if (map[cos][i][j] == 5 || map[cos][i][j] == 8)
break;//找到人的位置
}
//按键处理
char userKey = _getch();//不可见输入
switch (userKey)
{
//往上走
case 'w':
case 'W':
case 72:
if(map[cos][i - 1][j] == 0 || map[cos][i - 1][j] == 3)//往上是空地或者终点
{
map[cos][i][j] -= 5;//原来的地方变成空地
map[cos][i - 1][j] += 5;//空地变成人的位置
}
else if (map[cos][i - 1][j] == 4 || map[cos][i - 1][j] == 7)//往上是箱子
{
//箱子有两种情况:
//1.箱子的上面是空地或者终点
if (map[cos][i - 2][j] == 0 || map[cos][i - 2][j] == 3)
{
map[cos][i][j] -= 5;//原来位置变成空地
map[cos][i - 1][j] += 1;//箱子的位置变成人
map[cos][i - 2][j] += 4;//箱子上面的空地变成箱子
}
}
break;
//往下走
case 's':
case 'S':
case 80:
if(map[cos][i+1][j] == 0 || map[cos][i +1][j] == 3)//往下是空地或者终点
{
map[cos][i][j] -= 5;//原来的地方变成空地
map[cos][i + 1][j] += 5;//空地变成人的位置
}
else if (map[cos][i + 1][j] == 4 || map[cos][i + 1][j] == 7)//往上是箱子
{
//箱子有两种情况:
//1.箱子的上面是空地或者终点
if (map[cos][i + 2][j] == 0 || map[cos][i + 2][j] == 3)
{
map[cos][i][j] -= 5;//原来位置变成空地
map[cos][i + 1][j] += 1;//箱子的位置变成人
map[cos][i + 2][j] += 4;//箱子上面的空地变成箱子
}
}
break;
//往左走
case 'a':
case 'A':
case 75:
if(map[cos][i][j-1] == 0 || map[cos][i][j-1] == 3)//往上是空地或者终点
{
map[cos][i][j] -= 5;//原来的地方变成空地
map[cos][i][j-1] += 5;//空地变成人的位置
}
else if (map[cos][i][j - 1] == 4 || map[cos][i][j - 1] == 7)//往上是箱子
{
//箱子有两种情况:
//1.箱子的上面是空地或者终点
if (map[cos][i][j - 2] == 0 || map[cos][i][j - 2] == 3)
{
map[cos][i][j] -= 5;//原来位置变成空地
map[cos][i][j - 1] += 1;//箱子的位置变成人
map[cos][i][j - 2] += 4;//箱子上面的空地变成箱子
}
}
break;
//往右走
case 'd':
case 'D':
case 77:
if(map[cos][i][j+1] == 0 || map[cos][i][j+1] == 3)//往上是空地或者终点
{
map[cos][i][j] -= 5;//原来的地方变成空地
map[cos][i][j+1] += 5;//空地变成人的位置
}
else if (map[cos][i][j + 1] == 4 || map[cos][i][j + 1] == 7)//往上是箱子
{
//箱子有两种情况:
//1.箱子的右面是空地或者终点
if (map[cos][i][j+2] == 0 || map[cos][i][j+2] == 3)
{
map[cos][i][j] -= 5;//原来位置变成空地
map[cos][i][j+1] += 1;//箱子的位置变成人
map[cos][i][j+2] += 4;//箱子上面的空地变成箱子
}
}
break;
}
}
//判断游戏是否结束:当箱子都到终点时
int gameover()
{
int count = 1;
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 8; j++)
{
if (map[cos][i][j] == 4)//还没有推到位的箱子
{
count = 0;//没成功
}
}
}
return count;
}
//游戏结束界面
int gameoverLayout()
{
IMAGE pljj;
loadimage(&pljj, "pljj.jpg");
initgraph(pljj.getwidth(), pljj.getheight());
putimage(0, 0, &pljj);
getchar();
closegraph();
printf("------------------游戏结束!-----------------");
return 0;
}
int main()
{
initgraph(64*8, 64*7);
loadResource();
while (1)
{
drawMap();
keyDown();
if (gameover())
{
cos++;
if (cos == 3)
{
gameoverLayout();
break;
}
}
}
getchar();
closegraph();
return 0;
}
感谢你的浏览!麻烦下方点赞哦????!
|
/