百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

C++学习之项目推箱子游戏(推箱子c语言程序代码原理)

sinye56 2024-10-23 14:23 7 浏览 0 评论

游戏制作 推箱子

步骤分析

1、模板

2、模板分析

组成元素:

空地 墙 人 目的地 箱子 背景

3、如何操作

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

4、如何绘制地图

通过数组来存储绘制

数组中 0表示空地

1表示墙

2表示人

3表示箱子

4表示目的地

移动时

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

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

(⊙o⊙)…额 大概就这样吧 (其实就是自己做的时候的一些笔记,以后用的时候再看吧)

1 //事先先改多字节

2 #include<stdio.h>//预处理头文件

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

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

5 #include<mmsystem.h>//多媒体库头文件

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

7

8 /*

9 1.音乐播放

10 mciSendString mp3 wav格式音乐 音乐不要用网易云下载

11 #include<mmsystem.h>//多媒体库头文件

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

13 PlaySound 只能播放WAV格式音乐

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

15 图形库

16

17

18 推箱子的流程-->地图-->推动箱子-->箱子到目的地的时候 游戏结束

19

20 操作 每一个操作对应一个函数

21 1、准备工作 地图 素材

22 2、推箱子

23 3、判断游戏是否结束

24 数据存放部分

25 推箱子

26 空地0 墙1 人2 箱子3 目的地4 (用数组存储)

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

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

29

30

31

32 */

33

34 int map[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张素材 用数组存放

46

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

48 {

49 //加载图片 窗口大小640*640 小格子的大小80*80

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

51 loadimage(&img[1], "目的地.jpg",80,80);//箱子推到目的地上

52 loadimage(&img[2], "墙.jpg",80,80);

53 loadimage(&img[3], "人物.jpg",80,80);

54 loadimage(&img[4], "箱子.jpg",80,80);

55 loadimage(&img[5], "源氏.jpg",80,80);//空的目的地

56

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 break;

69 case 1://墙

70 putimage(i * 80, j * 80, &img[2]);//用来贴图的 前面两个是坐标(图形库的坐标)

71 break;

72 case 2://人

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

74 break;

75 case 3://箱子

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

77 break;

78 case 4://目的地

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

80 break;

81 case 6://人+目的地

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

83 break;

84 case 7://箱子+目的地

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

86 break;

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 = i;

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

102 }

103 }

104 }

105 //然后判断用户输入

106 //getch-->获取用户按键 conion.h

107 switch (getch())//人移动时遇到墙不能动

108 {

109 case 'w'://往上 可能是空地可能是墙 可能是箱子 //可能是目的地 可能是箱子加目的地

110 case 'W':

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

112 {

113 map[x][y] -= 2;

114 map[x][y - 1] += 2;

115 }

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

117 {

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

119 {

120 map[x][y] -= 2;

121 map[x][y - 1] -= 1;

122 map[x][y - 2] += 3;

123 }

124 }

125 break;

126

127

128 case 's'://往下

129 case 'S':

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

131 {

132 map[x][y] -= 2;

133 map[x][y + 1] += 2;

134 }

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

136 {

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

138 {

139 map[x][y] -= 2;

140 map[x][y + 1] -= 1;

141 map[x][y + 2] += 3;

142 }

143 }

144 break;

145

146 case 'a'://往左

147 case '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 map[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 break;

163

164 case 'd'://往右

165 case 'D':

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

167 {

168 map[x][y] -= 2;

169 map[x + 1][y] += 2;

170 }

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

172 {

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

174 {

175 map[x][y] -= 2;

176 map[x + 1][y] -= 1;

177 map[x + 2][y] += 3;

178 }

179 }

180 break;

181

182 }

183

184

185 }

186 void gameOver()

187 {

188 //什么时候游戏结束

189 //1、赢 所有的箱子全部推到目的地上-->外面没有箱子

190 //2、输 有箱子没有推到目的地上 或者游戏超时

191 int flag = 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 ++flag;

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(),"输","sad",MB_OK);

205 closegraph();

206 exit(0);

207 }

208 }

209 }

210 }

211 }

212 if (flag == 0)

213 {

214 //没有箱子 游戏结束

215 //return

216 MessageBox(GetHWnd(), "赢", "GOOD", MB_OK);

217 //第一个参数 句柄(可以理解为指向窗口的指针) 作用让窗口置前 可以为空写NULL或0

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

219 closegraph();

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

221 }

222

223 }

224

225

226 int main()

227 {

228 //音乐播放示例1

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

230 //mciSendString("play bgm.mp3 repeat",0,0,0);//先打开 然后播放 repeat 循环播放

231 //关闭音乐 stop 暂停音乐 pause

232 //音乐播放示例2

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

234 mciSendString("play bgm repeat", 0, 0, 0);//先打开 然后播放 repeat 循环播放

235

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

237 init();//加载图片

238

239 //开始界面================================

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

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

242 settextcolor(BLACK);

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

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

245

246 rectangle(200,200,400,400);

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

248 MOUSEMSG msg;

249 int flag = 1;

250 while (flag)

251 {

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

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

254 {

255 case WM_LBUTTONDOWN://左键按下

256 if (msg.x > 200 && msg.x<400 && msg.y>200 && msg.y < 400)

257 {

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

259 flag = 0;

260 }

261

262 default:

263 break;

264 }

265 }

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

267 //getch();

268

269

270 /*

271 鼠标操作

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

273 MOUSEMSG 类型 存放鼠标信息

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

275 */

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

277

278 drawMap();

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

280 {

281 play();

282 drawMap();

283 gameOver();

284 }

285 getchar();

286 closegraph();

287 return 0;

288 }

289

290

运行结果

最后你觉得我们的文章对你有帮助,欢迎关注我,可以私信我:久伴,领取学习资料,在评论下方可以关注我的学习群,你可以随时在上面向我们提问,把你在学习前端过程中所遇到的问题发给我们。我们每天都会按时回复大家的每一个问题,希望久伴可以伴随你从入门到专家。

相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&amp;配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: