C语言项目实战:《推箱子》零基础项目,270 行源码注释示例

Posted 一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言项目实战:《推箱子》零基础项目,270 行源码注释示例相关的知识,希望对你有一定的参考价值。

这篇文章主要为大家详细介绍了C语言实现——《推箱子项目》,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!

本项目结合了分支,循环,数组的结合,并且对逻辑也是有一定的要求,但是这些在我们项目源码里面都会有注释,大家到时候学习的时候千万不要忽略注释,注释可以更好地帮你理解代码,尤其是C语言初学者。

本项目编译环境:VS2019/VS2013;

插件:图形库插件easyX;

效果图展示

大家如果有什么不懂也可以看看这个教程跟着写:

C语言游戏开发:推箱子(保姆级讲解)!全程高能,超细致讲解,这还学不会推箱子开发!老夫也没办法了~_哔哩哔哩_bilibili

源代码示例

1.头文件

#include<stdio.h>

#include<stdlib.h>

#include<graphics.h> //easyX图形库头文件

#include<conio.h>

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("\\n");

}

}

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++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:829164294点击进入】微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:


 

以上是关于C语言项目实战:《推箱子》零基础项目,270 行源码注释示例的主要内容,如果未能解决你的问题,请参考以下文章

C语言零基础开发推箱子小游戏

C语言项目实战:《拼图游戏》零基础项目

C语言项目实战:《自动版贪吃蛇》零基础项目

C语言项目实战:《贪吃蛇》零基础项目,源码 + 注释解析

C语言项目实战:《扫雷游戏》零基础项目,230 行源码注释示例

C语言项目实战:《球球大作战》零基础项目 + 源码示例