C++学习项目推箱子游戏

发布时间:2025-05-16浏览:91

1. 模板

2. 模板分析

组成要素:

清理墙壁人目的地框背景

3. 如何操作

通过WASD键盘操作人,推动箱子,到达目的地。游戏结束。如果盒子卡在死角,游戏就会失败。

4. 如何绘制地图

将绘图存储在数组中

数组中的0代表空白

1 表示墙

2代表人

3表示盒子

4 表示目的地

移动时

人在目的地:人+目的地=2+4=6

箱子在目的地:箱子+目的地=3+4+7

(o)…嗯,就这样了(其实只是我做的时候做的一些笔记,等以后用的时候再看)

1 //先改变多字节

2 #include//预处理头文件

3 #include//控制台输入输出,定义了通过控制台进行数据输入和数据输出的函数,主要是对应一些用户通过按下键盘产生的操作

4 #include//图形库头文件

5 #include//多媒体库头文件

6 #pragma comment(lib,'winmm.lib')//多媒体库

8/*

9 1. 音乐播放

10 mciSendString mp3 wav 格式音乐请勿使用网易云下载音乐

11 #include//多媒体库头文件

12 #pragma comment(lib,'winmm.lib')//多媒体库

13 PlaySound只能播放WAV格式音乐

14 2.推箱子素材:照片--jpg或bmp格式音乐

15个图形库

18 推箱子的过程--地图--推箱子--箱子到达目的地游戏结束。

20 个操作每个操作对应一个功能

21 1. 准备地图材料

22 2.推箱子

23 3.判断游戏是否结束

24 数据存储部分

25 推箱子

26 空地0 墙1 人2 盒子3 目的地4(存储在数组中)

27人到达目的地:人+目的地=2+4=6

28 盒子在目的地:盒子+ 目的地=3+4+7

32*/

34 int 地图[8][8]={

35 0, 0, 1, 1, 1, 0, 0, 0,

36 0, 0, 1, 4, 1, 0, 0, 0,

37 0, 0, 1, 0, 1, 1, 1, 1,

38 1, 1, 1, 3, 0, 3, 4, 1,

39 1, 4, 0, 3, 2, 1, 1, 1,

40 1, 1, 1, 1, 3, 1, 0, 0,

41 0, 0, 0, 1, 4, 1, 0, 0,

42 0, 0, 0, 1, 1, 1, 0, 0

43 };//地图有8行8列,0个空地,1堵墙,2个人,3个箱子,4个目的地

44 //8*8地图--每张图片尺寸为80*80,总地图尺寸为640*640

45 IMAGE img[6];//数组中存放了总共6个素材

47 void init()//自定义函数,用于加载素材,全局的,所有人都可以使用

48{

49 //加载图片。窗口尺寸为640*640,小网格尺寸为80*80。

50 loadimage(img[0], '背景.jpg');

51 loadimage(img[1], 'destination.jpg',80,80);//将盒子推送到目的地

52 loadimage(img[2], 'wall.jpg',80,80);

53 loadimage(img[3], '角色.jpg',80,80);

54 loadimage(img[4], 'box.jpg',80,80);

55 loadimage(img[5], 'Genji.jpg',80,80);//清空目的地

57}

58 void drawMap()//绘制地图

59{

60 putimage(0,0,img[0]);

61 for (int i=0; i 8; ++i)//数组大小为8

62{

63 for (int j=0; j 8; ++j)

64{

65 switch(map[i][j])//循环遍历数组

66{

67 case 0://没有地图的空位

68 打破;

69箱1://墙

70 putimage(i * 80, j * 80, img[2]);//用于映射的前两个是坐标(图形库的坐标)

71 打破;

72例2://人

73 putimage(i * 80, j * 80, img[3]);

74 打破;

75箱3://箱

76 putimage(i * 80, j * 80, img[4]);

77 打破;

78 case 4://目的地

79 putimage(i * 80, j * 80, img[5]);

80 休息;

81 case 6://人+目的地

82 putimage(i * 80, j * 80, img[3]);

83 打破;

84箱7://箱+目的地

85 putimage(i * 80, j * 80, img[1]);

86 打破;

87}

88}

89}

90}

91 void play()//操作部分

92{

93 int x,y;//求出字符的位置

94 for (int i=0; i 8; ++i)

95{

96 for (int j=0; j 8; ++j)

97{

98 if (map[i][j]==2||map[i][j]==6)//等于2或6找到人

99{

100 x=我;

101 y=j;//保存人的位置

102}

103}

104}

105 //然后判断用户输入

106 //getch--获取用户密钥conion.h

107 switch(getch())//人移动时遇到墙无法移动。

108{

109 case 'w': //向上,可能是空地,可能是墙,可能是盒子//可能是目的地,可能是盒子加目的地

110 箱'W':

111 if (地图[x][y - 1]==0 || 地图[x][y - 1]==4)

112{

113 地图[x][y] -=2;

114 地图[x][y - 1] +=2;

115}

116 else if (map[x][y - 1]==3 || map[x][y - 1]==7)

117 {

118 if (地图[x][y - 2]==0 || 地图[x][y - 2]==4)

119 {

120 地图[x][y] -=2;

第121章地图[x][y - 1] -=1;

122 地图[x][y - 2] +=3;

123}

124}

125 打破;

128 case ': //下载

129 箱'S':

130 if (地图[x][y + 1]==0 || 地图[x][y + 1]==4)

131 {

132 地图[x][y] -=2;

133 映射[x][y + 1] +=2;

134}

135 else if (map[x][y + 1]==3 || map[x][y + 1]==7)

136 {

137 if (地图[x][y + 2]==0 || 地图[x][y + 2]==4)

138 {

139 地图[x][y] -=2;

140 地图[x][y + 1] -=1;

141 地图[x][y + 2] +=3;

142}

143}

144 打破;

146 case 'a'://向左走

147 案例'A':

148 if (map[x - 1][y]==0 || map[x - 1][y]==4)//上方是空地或者目的地

149 {

150 map[x][y] -=2;//相当于map[x][y]=map[x][y]-2;

151 地图[x - 1][y] +=2; //人走上来

152}

153 else if (map[x - 1][y]==3 || map[x - 1][y]==7)//人的上方是一个盒子或者一个盒子加一个目的地

154 {

155 if (map[x - 2][y]==0 || map[x - 2][y]==4)//盒子上方有空位,可以推

156 {

157 map[x][y] -=2;//人向上走

158 map[x - 1][y] -=1;//人来+2,箱子上-3,所以是-3+2=-1

159 map[x - 2][y] +=3;//盒子上升

160}

161}

162 打破;

164 case 'd'://向右走

165 箱‘D’:

166 if (地图[x + 1][y]==0 || 地图[x + 1][y]==4)

167 {

168 地图[x][y] -=2;

169 地图[x + 1][y] +=2;

170}

171 else if (map[x + 1][y]==3 || map[x + 1][y]==7)

172 {

173 if (地图[x + 2][y]==0 || 地图[x + 2][y]==4)

174 {

175 地图[x][y] -=2;

176 地图[x + 1][y] -=1;

177 地图[x + 2][y] +=3;

178}

179}

180 断;

182}

185}

186 无效gameOver()

187 {

188 //游戏什么时候结束?

189 //1。赢。将所有箱子推到目的地——外面没有箱子。

190//2.失去。有些盒子没有被推到目的地或者游戏超时。

191 int 标志=0;

192 for (int i=0; i 8; ++i)

193 {

194 for (int j=0;j 8;++j)

195 {

196 if (map[i][j]==3)//盒子找到了,游戏还没有赢

197 {

198 ++标志;

199 if (map[i - 1][j]==1 || map[i + 1][j]==1)//上面或者下面都有一个

200 {

201 if (map[i][j - 1]==1 || map[i][j + 1]==1)//左右各有一个

202 {

203 //游戏结束失败

204 MessageBox(GetHWnd(),'丢失','伤心',MB_OK);

205 关闭图();

206 退出(0);

207}

208}

209}

210}

211}

212 if(标志==0)

213 {

214 //没有盒子,游戏结束

215 //返回

第216 章

217 //第一个参数句柄(可以理解为指向窗口的指针)用于将窗口带到前面。您可以为其写入NULL 或0。

218 //第二个是文本,第三个是标题,第四个是按钮

[第219 章]

220 exit(0);//表示退出程序

221}

223}

226 int main()

227 {

228 //音乐播放示例1

229 //mciSendString('打开bgm.mp3',0,0,0);//打开音乐

230 //mciSendString('play bgm.mp3 Repeat',0,0,0);//先打开再播放repeat循环

231 //关闭音乐停止暂停音乐暂停

232 //音乐播放示例2

233 mciSendString('open bgm.mp3 alias bgm', 0, 0, 0);//打开音乐别名bgm并取个名字

234 mciSendString('播放bgm重复', 0, 0, 0);//先打开再播放重复。

236 initgraph(640,640);//创建窗口

237 init();//加载图像

239 //启动界面==================================

240 putimage(0,0,img[0]);//背景图片

241 settextstyle(40, 0, '宋体');

242 settextcolor(黑色);

243 setbkmode(TRANSPARENT);//字体背景透明

244 //或者setbkmode(1);设置背景模式设置背景模式

246矩形(200,200,400,400);

247 outtextxy(200, 200, '开始游戏');

248 MOUSEMSG 消息;

249 int 标志=1;

250 同时(标志)

251 {

252 msg=GetMouseMsg();//获取鼠标消息

253 switch ((msg.uMsg))//判断鼠标消息

254 {

255 case WM_LBUTTONDOWN://左键按下

256 if (msg.x 200 msg.x400 msg.y200 msg.y 400)

257 {

258 //点击的区域在框内,可以退出循环

259 标志=0;

260}

262 默认:

263 打破;

264}

265}

266 //outtextxy(400,400,'按任意键开始游戏');

第267章

270/*

第271章鼠标操作

272 MouseHit() 判断是否有鼠标消息

273 MOUSEMSG类型存储鼠标信息

274 GetMouseMsg()函数获取鼠标信息

第275章

276 //==============================================

[第278 章]

279 while(1)//循环函数调用

280 {

281 播放();

第282章

283 游戏结束();

第284章

第285章

[第286 章]

287返回0;

第288章

运行结果

推箱子1

推箱子2

推箱子3

用户评论

代价是折磨╳

这个"推箱子游戏"听起来很有意思!感觉像小时候玩的俄罗斯方块那样,用代码把逻辑控制好真的太酷了。会不会有各种难度和场景?

    有13位网友表示赞同!

水波映月

C++ 学习总是枯燥乏味,这项目让我看到了学习的乐趣!如果能看到成品画面多好啊,说不定还能联机对战~

    有16位网友表示赞同!

堕落爱人!

玩游戏当然好玩,但项目要做的足够严谨才更有意义吧?推箱子游戏的规则和逻辑都很简单,难点可能在于代码的效率和可读性。

    有9位网友表示赞同!

追忆思域。

好久没接触C++了,看到这个项目想起来当年学习编程时的那份激情! 不过现在的工作已经很久不触碰这类游戏开发,有点怀念以前的感觉哦。

    有19位网友表示赞同!

颓废人士

对这类型的游戏并不太感兴趣,但我还是觉得这个推箱子游戏的项目设计很好。 用游戏的方式学习C++确实可以让枯燥的学习过程变得更有乐趣和吸引力!

    有19位网友表示赞同!

拥抱

我觉得这个“项目”有点弱啊, 推箱子这游戏简单得让人难以想象开发难度有多大。 还是希望看到一些更具挑战性的项目,比如模拟一些物理模型或者人工智能等等。

    有14位网友表示赞同!

情字何解ヘ

我还没学过C++,但这个"推箱子游戏"听着很有意思! 是不是以后可以玩到这个项目啊? 好想体验一下用代码实现的游戏!

    有14位网友表示赞同!

你tm的滚

学习编程就是应该从简单的游戏开始逐步提高, 这"推箱子游戏"的确是个很好的入门案例哦! 学习语言和逻辑思维都是宝贵经验, 期待看到更多人尝试这个有意思的项目!

    有20位网友表示赞同!

弃我者亡

最近在学习C++, 这个“推箱子游戏”正好可以用作练习。 希望能够深入学习相关的算法和数据结构, 把项目做成更有趣和复杂的游戏场景呢!

    有9位网友表示赞同!

予之欢颜

我有点不理解, “推箱子游戏”这种玩法真的适合作为C++学习项目吗? 感觉太简单了, 也许可以尝试一些更复杂的逻辑设计?

    有7位网友表示赞同!

绝版女子

这个项目的设计很有教育意义, 学习C++通过玩游戏的方式更容易理解代码的执行逻辑和调试技巧, 尤其对于初学者来说非常实用!

    有18位网友表示赞同!

断桥残雪

我真想试试用C++自己开发一个"推箱子"的游戏, 虽然这只是入门级项目, 但我相信能够锻炼我的编程能力, 并让我在学习过程中收获乐趣!

    有14位网友表示赞同!

丢了爱情i

感觉这个项目可以引申出很多有趣的玩法,比如加入不同的障碍物、陷阱或者道具等! 如果能添加一些AI控制的对手,那该有多棒!

    有18位网友表示赞同!

西瓜贩子

学习编程需要不断积累经验和实践, 这个“推箱子游戏”项目虽然简单,但却能让我们一步步熟悉C++语法和开发流程

    有10位网友表示赞同!

娇眉恨

这个"推箱子游戏"项目的描述很吸引人, 希望能看到更详细的图文介绍以及最终的效果展示!

    有14位网友表示赞同!

不浪漫罪名

如果能够开源这个"推箱子游戏"项目, 广大开发者就可以共同学习、改进和分享代码, 这一定会推动C++学习及开发实践的进步!

    有16位网友表示赞同!

摩天轮的依恋

玩游戏也是一种学习的方式, 有些人通过玩游戏认识了编程, 而这个"推箱子游戏" 项目也许能激发更多人对C++学习的兴趣!

    有8位网友表示赞同!

热点资讯