C++学习(九)之 项目 推箱子游戏

游戏制作 推箱子

步骤分析

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  

运行结果

2018.05.23    12:26:26

原文地址:https://www.cnblogs.com/Yuuki-/p/9076306.html

时间: 2024-10-12 18:20:59

C++学习(九)之 项目 推箱子游戏的相关文章

第十二天学习内容 综合应用 推箱子和对战游戏

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace day12{    class Program    {        static void Main(string[] args)        { //推箱子游戏            int x = 1, y = 1, i = 0;        

JavaScript写一个小乌龟推箱子游戏

推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用了zepto的touch模块, 通过手指滑动屏幕就可以控制乌龟走不同的方向: 因为推箱子这个游戏比较简单, 直接用了过程式的方式写代码, 模块也就是两个View 和 Model, 剩下就是用户的事件Controller, 用户每一次按下键盘的方向键都会改变数据模型的数据,然后重新生成游戏的静态htm

致佳音: 推箱子游戏自动求解算法设计(四)

这一节是本文的核心内容,即推箱子游戏求解算法的设计思路过程 前面已经说过过,判断局面重复的最好标准不是局面完全一致,而是坐标排序相同且角色坐标通行 如下图,角色无论怎么移动,不推动箱子的时候,都能回到原来的位置,算作同一个局面: 再如下图,两个箱子互换位置,结果与没有移动箱子是一样的,所以排序箱子坐标以后一致,还是相同局面 问:有必要判断局面重复吗?是不是只是提升一下效率? 答:不是为了提升效率,而是为了能解出来,如果使用递归,重复的局面反复耗尽堆栈,而队列则耗尽内存 正如上图,反复推这两个箱子

致佳音: 推箱子游戏自己主动求解算法设计(四)

这一节是本文的核心内容,即推箱子游戏求解算法的设计思路过程 前面已经说过过,推断局面反复的最好标准不是局面全然一致,而是坐标排序同样且角色坐标通行 例如以下图.角色不管怎么移动,不推动箱子的时候.都能回到原来的位置.算作同一个局面: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJzbmlwZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"

推箱子游戏

本游戏为推箱子游戏,即通过移动方向键来控制小人去推动箱子,直到把所有的箱子都推动到各个目标中.游戏需要在人物行走过程中无法穿越墙和箱子,并在有限的范围中放好各箱子,且每次只能搬运一个箱子.所基于的语言是8086汇编,使用的编译环境是唐都的集中开发环境TD-PIT. 本次设计的基本思想是通过将不同的元素(墙.路.箱子.人.目标位)抽象为不同的矩阵,然后将所设计的地图描抽象成一个控制矩阵来控制图像的显示,每一个控制矩阵块代表一个元素,我们通过不断刷新控制矩阵来达到显示人物移动及推箱子的效果. 1.1

jQuery版推箱子游戏详解和源码

前言 偶然间看到很多用js写游戏的感觉很炫酷的样子,所以就想试试,就看了一些资料和某前端站点的视屏.于是乎就自己动手实践了一下,上推箱子截图 感觉很丑陋,但是功能是实现了.再说貌似大多都是这样的吧,这一关其实还是有点难度的,我做完之后想检测一下下一关正确么,居然还玩了以后才通关. 如果你看到这张图让你想起了你童年的回忆,说明你老了,这里可以试玩一下(很遗憾没有链接地址,最后又源码可以下载). css布局 主要考虑的是地图是怎么动态生成的,地图中有灰色的,还有墙,箱子,蓝色,红色背景,人物.先看c

用C写一个简单的推箱子游戏(一)

我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱子小程序. 这一程序主要用到了C语言中的二维数组,头文件#include<conio.h>(因为要调用getch()函数以记录输入内容),switch函数等. 一.     功能概述 a)   游戏规则概述 玩家通过键盘输入W.S.A.D四键或者“↑”.“↓”.“←”.“→”四个方向键推动箱子,而

致佳音: 推箱子游戏自动求解算法设计(二)

这一个小节我们说一说传说中的A×算法,其实之前也上传过类似的小件件,这里我们就去剖析一下它 毕竟在游戏程序,我们要从一点移动到另一点,并得到最短路程的轨迹,类似这种算法还有好几种,执行效率都差不多,不过大多不能得到轨迹 首先,从一点移动到另一点,最快就是直接走过去了,就像小男生爱上小女生,最好的办法就是直接走到她面前说:我爱你 不过理想状态,几乎是没有的,弯路那是必然的经过,有曲线,其实更美-- 那么弯路该怎么走呢,是不是先去背景看下毛主席,再去三亚晒个太阳,再回来告诉她外面的世界好美,不,不,

hdu 1254(推箱子游戏bfs+状态标记)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5181    Accepted Submission(s): 1439 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N