这篇文章主要为大家详细介绍了C语言实现——《推箱子项目》,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!
本项目结合了分支,循环,数组的结合,并且对逻辑也是有一定的要求,但是这些在我们项目源码里面都会有注释,大家到时候学习的时候千万不要忽略注释,注释可以更好地帮你理解代码,尤其是C语言初学者。
本项目编译环境:VS2019/VS2013;
插件:图形库插件easyX;
1.头文件
2.关卡设置(这里我们定义一个三维数组,三维数组大家可以理解为多个二维数组)
int cas = 0;
IMAGE img0, img1, img2, img3, img4, img5;
int map[3][8][8] =
{
0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 1, 3, 1, 0, 0, 0,
0, 0, 1, 0, 1, 1, 1, 1,
1, 1, 1, 4, 0, 4, 3, 1,
1, 3, 0, 4, 5, 1, 1, 1,
1, 1, 1, 1, 4, 1, 0, 0,
0, 0, 0, 1, 3, 1, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0,
0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 1, 3, 1, 0, 0, 0,
0, 0, 1, 0, 1, 1, 1, 1,
1, 1, 1, 4, 0, 4, 3, 1,
1, 3, 0, 4, 5, 1, 1, 1,
1, 1, 1, 1, 4, 1, 0, 0,
0, 0, 0, 1, 3, 1, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0,
0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 1, 3, 1, 0, 0, 0,
0, 0, 1, 0, 1, 1, 1, 1,
1, 1, 1, 4, 0, 4, 3, 1,
1, 3, 0, 4, 5, 1, 1, 1,
1, 1, 1, 1, 4, 1, 0, 0,
0, 0, 0, 1, 3, 1, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0,
};
3.绘制推箱子地图
void drawmap()
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
int x = j * 64;
int y = i * 64;
switch (map[cas][i][j])
{
case 0: //空地
putimage(x, y, &img0);
//printf(" ");
break;
case 1: //墙
putimage(x, y, &img1);
//printf("█");
break;
case 3: //目的地:篮筐
putimage(x, y, &img2);
//printf("☆");
break;
case 4: //箱子:篮球
putimage(x, y, &img3);
//printf("★");
break;
case 5: //人:CXK
case 8:
putimage(x, y, &img4);
//printf("人");
break;
case 7: //把箱子推进目的地:鸡
putimage(x, y, &img5);
//printf("⊙");
break;
}
}
printf(" ");
}
}
4.游戏过程(这部分是整个游戏的核心部分,也是最难理解的部分,大家要仔细解读)
void playGame()
{
//按键操作:游戏过程
//找人:找CXK:遍历二维数组--->元素= 5||8
int i, j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
//找人
if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
{
break;//break只能跳出一层循环
}
}
//找人
if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
{
break;//break只能跳出一层循环
}
}
//已经找到人了
//通过键盘操作人物
char userKey = _getch();
switch (userKey)
{
//那几个键移动:wsad 箭头:小键盘 键码值:72 80 75 77
case 'w':
case 'W':
case 72:
//移动的原理:改变二维数组元素的值
//移动的步骤:
//1.先让人移动 map[cas][i-1][j]=0||map[cas][i-1][j]=3
if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3)
{
//人移动的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i - 1][j] += 5;
}
//2.推箱子,让箱子移动
//先找到(固定)箱子
if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7)
{
//篮球,箱子移动的条件
if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3)
{
//推箱子的原理:移动元素值
map[cas][i][j] -= 5;
map[cas][i - 1][j] += 5;
map[cas][i - 1][j] -= 4;
map[cas][i - 2][j] += 4;
}
}
break;
case 's':
case 'S':
case 80:
//1.先让人移动 map[cas][i-1][j]=0||map[cas][i-1][j]=3
if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)
{
//人移动的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i + 1][j] += 5;
}
//2.推箱子,让箱子移动
//先找到(固定)箱子
if (map[cas][i + 1][j] == 4 || map[cas][i + 1][j] == 7)
{
//篮球,箱子移动的条件
if (map[cas][i + 2][j] == 0 || map[cas][i + 2][j] == 3)
{
//推箱子的原理:移动元素值
map[cas][i][j] -= 5;
map[cas][i + 1][j] += 5;
map[cas][i + 1][j] -= 4;
map[cas][i + 2][j] += 4;
}
}
break;
case 'a':
case 'A':
case 75:
//1.先让人移动 map[cas][i-1][j]=0||map[cas][i-1][j]=3
if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3)
{
//人移动的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i][j - 1] += 5;
}
//2.推箱子,让箱子移动
//先找到(固定)箱子
if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7)
{
//篮球,箱子移动的条件
if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3)
{
//推箱子的原理:移动元素值
map[cas][i][j] -= 5;
map[cas][i][j - 1] += 5;
map[cas][i][j - 1] -= 4;
map[cas][i][j - 2] += 4;
}
}
break;
case 'd':
case 'D':
case 77:
//1.先让人移动 map[cas][i-1][j]=0||map[cas][i-1][j]=3
if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3)
{
//人移动的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i][j + 1] += 5;
}
//2.推箱子,让箱子移动
//先找到(固定)箱子
if (map[cas][i][j + 1] == 4 || map[cas][i][j + 1] == 7)
{
//篮球,箱子移动的条件
if (map[cas][i][j + 2] == 0 || map[cas][i][j + 2] == 3)
{
//推箱子的原理:移动元素值
map[cas][i][j] -= 5;
map[cas][i][j + 1] += 5;
map[cas][i][j + 1] -= 4;
map[cas][i][j + 2] += 4;
}
}
break;
}
}
int gameOver()
{
int flag = 0;
//遍历二维数组元素-->目的地:球框
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (map[cas][i][j] == 3)
{
flag = 1;
}
}
}
return flag;
}
5.主函数部分
int main()
{
loadimage(&img0, L"0.bmp"); //64*64
loadimage(&img1, L"1.bmp"); //64*64
loadimage(&img2, L"3.bmp"); //64*64
loadimage(&img3, L"4.bmp"); //64*64
loadimage(&img4, L"5.bmp"); //64*64
loadimage(&img5, L"7.bmp"); //64*64
initgraph(64 * 8, 64 * 8);
while (1)
{
drawmap();
playGame();
if (!gameOver())
{
cas++;
if (cas == 3)
break;
}
system("cls");
}
//initgraph(600,600);//窗口:宽度*高度
////贴图:基本贴图技术
////1.定义图片变量
//IMAGE img;
////2.加载图片
//loadimage(&img, L"timg.jpg", 600, 600);
////3.显示图片
//putimage(0, 0, &img);
while (1); //防止闪屏
closegraph(); //关闭窗口
return 0;
}
整个项目的源码已经分享,这是一个三关完善的推箱子游戏,大家如果有兴趣可以自己去试试做更多的关卡来玩!
如果学习的过程中有什么问题,以及本项目有什么不懂的地方,都可以来找我交流,我来帮你!
那么今天的分享就到这里了,后续会更新更多精彩项目的,大家要好好学C语言C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
全部0条评论
快来发表一下你的评论吧 !