游戏制作 推箱子

步骤分析

1、模板

2、模板分析

组成元素:

空地 墙 人 目的地 箱子 背景

3、如何操作

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

4、如何绘制地图

通过数组来存储绘制

数组中 0表示空地

1表示墙

2表示人

3表示箱子

4表示目的地

移动时

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

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

 //事先先改多字节
#include<stdio.h>//预处理头文件
#include<conio.h>//控制台输入输出,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作
#include<graphics.h>//图形库 头文件
#include<mmsystem.h>//多媒体库头文件
#pragma comment(lib,"winmm.lib")//多媒体库 /*
1.音乐播放
mciSendString mp3 wav格式音乐 音乐不要用网易云下载
#include<mmsystem.h>//多媒体库头文件
#pragma comment(lib,"winmm.lib")//多媒体库
PlaySound 只能播放WAV格式音乐
2.推箱子 素材:照片-->jpg或者bmp格式 音乐
图形库 推箱子的流程-->地图-->推动箱子-->箱子到目的地的时候 游戏结束 操作 每一个操作对应一个函数
1、准备工作 地图 素材
2、推箱子
3、判断游戏是否结束
数据存放部分
推箱子
空地0 墙1 人2 箱子3 目的地4 (用数组存储)
人在目的地上:人+目的地=2+4=6
箱子在目的地上:箱子+目的地=3+4+7 */ int map[][] = {
, , , , , , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , , ,
, , , , , , ,
};//8行8列的地图 0空地 1墙 2人 3箱子 4目的地
//8*8的地图-->每张图片大小80*80 地图总大小640*640
IMAGE img[];//总共6张素材 用数组存放 void init()//自定义的函数 用来加载素材 全局 所有人都可以用
{
//加载图片 窗口大小640*640 小格子的大小80*80
loadimage(&img[], "背景.jpg");
loadimage(&img[], "目的地.jpg",,);//箱子推到目的地上
loadimage(&img[], "墙.jpg",,);
loadimage(&img[], "人物.jpg",,);
loadimage(&img[], "箱子.jpg",,);
loadimage(&img[], "源氏.jpg",,);//空的目的地 }
void drawMap()//画地图
{
putimage(,,&img[]);
for (int i = ; i < ; ++i)//数组大小是8
{
for (int j = ; j < ; ++j)
{
switch (map[i][j])//循环遍历数组
{
case ://空地 不贴图
break;
case ://墙
putimage(i * , j * , &img[]);//用来贴图的 前面两个是坐标(图形库的坐标)
break;
case ://人
putimage(i * , j * , & img[]);
break;
case ://箱子
putimage(i * , j * , &img[]);
break;
case ://目的地
putimage(i * , j * , &img[]);
break;
case ://人+目的地
putimage(i * , j * , &img[]);
break;
case ://箱子+目的地
putimage(i * , j * , &img[]);
break;
}
}
}
}
void play()//操作部分
{
int x, y;//找人物位置
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
if (map[i][j] == ||map[i][j]==)//等于2或6 找到人
{
x = i;
y = j;//保存了人的位置
}
}
}
//然后判断用户输入
//getch-->获取用户按键 conion.h
switch (getch())//人移动时遇到墙不能动
{
case 'w'://往上 可能是空地可能是墙 可能是箱子 //可能是目的地 可能是箱子加目的地
case 'W':
if (map[x][y - ] == || map[x][y - ] == )
{
map[x][y] -= ;
map[x][y - ] += ;
}
else if (map[x][y - ] == || map[x][y - ] == )
{
if (map[x][y - ] == || map[x][y - ] == )
{
map[x][y] -= ;
map[x][y - ] -= ;
map[x][y - ] += ;
}
}
break; case 's'://往下
case 'S':
if (map[x][y + ] == || map[x][y + ] == )
{
map[x][y] -= ;
map[x][y + ] += ;
}
else if (map[x][y + ] == || map[x][y + ] == )
{
if (map[x][y + ] == || map[x][y + ] == )
{
map[x][y] -= ;
map[x][y + ] -= ;
map[x][y + ] += ;
}
}
break; case 'a'://往左
case 'A':
if (map[x - ][y] == || map[x - ][y] == )//上方是空地或者是目的地
{
map[x][y] -= ;//相当于map[x][y]=map[x][y]-2;
map[x - ][y] += ;//人往上走
}
else if (map[x - ][y] == || map[x - ][y] == )//人的上方是箱子或是箱子加目的地
{
if (map[x - ][y] == || map[x - ][y] == )//箱子上方是空地 可以推动
{
map[x][y] -= ;//人往上走
map[x - ][y] -= ;//人来了+2 箱子上去了-3 所以就是 -3+2=-1
map[x - ][y] += ;//箱子往上走
}
}
break; case 'd'://往右
case 'D':
if (map[x + ][y] == || map[x + ][y] == )
{
map[x][y] -= ;
map[x + ][y] += ;
}
else if (map[x + ][y] == || map[x + ][y] == )
{
if (map[x + ][y] == || map[x + ][y] == )
{
map[x][y] -= ;
map[x + ][y] -= ;
map[x + ][y] += ;
}
}
break; } }
void gameOver()
{
//什么时候游戏结束
//1、赢 所有的箱子全部推到目的地上-->外面没有箱子
//2、输 有箱子没有推到目的地上 或者游戏超时
int flag = ;
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
if (map[i][j] == )//找到了箱子 游戏还没有赢
{
++flag;
if (map[i - ][j] == || map[i + ][j] == )//上方或者下方有一个
{
if (map[i][j - ] == || map[i][j + ] == )//左右有一个
{
//游戏结束 输
MessageBox(GetHWnd(),"输","sad",MB_OK);
closegraph();
exit();
}
}
}
}
}
if (flag == )
{
//没有箱子 游戏结束
//return
MessageBox(GetHWnd(), "赢", "GOOD", MB_OK);
//第一个参数 句柄(可以理解为指向窗口的指针) 作用让窗口置前 可以为空写NULL或0
//第二个是文本 第三个是标题 第四个是按钮
closegraph();
exit();//表示退出程序
} } int main()
{
//音乐播放示例1
//mciSendString("open bgm.mp3",0,0,0);//打开音乐
//mciSendString("play bgm.mp3 repeat",0,0,0);//先打开 然后播放 repeat 循环播放
//关闭音乐 stop 暂停音乐 pause
//音乐播放示例2
mciSendString("open bgm.mp3 alias bgm", , , );//打开音乐 alias bgm取一个名字
mciSendString("play bgm repeat", , , );//先打开 然后播放 repeat 循环播放 initgraph(,);//创建窗口
init();//加载图片 //开始界面================================
putimage(,,&img[]);//背景图
settextstyle(, , "宋体");
settextcolor(BLACK);
setbkmode(TRANSPARENT);//字体背景透明
//或者 setbkmode(1);设置背景模式 set background mode rectangle(,,,);
outtextxy(, , "开始游戏");
MOUSEMSG msg;
int flag = ;
while (flag)
{
msg = GetMouseMsg();//获取鼠标消息
switch ((msg.uMsg))//判断鼠标消息
{
case WM_LBUTTONDOWN://左键按下
if (msg.x > && msg.x< && msg.y> && msg.y < )
{
//点击的区域在方框之内 可以退出循环
flag = ;
} default:
break;
}
}
//outtextxy(400,400,"按任意键开始游戏");
//getch(); /*
鼠标操作
MouseHit() 判断是否存在鼠标消息
MOUSEMSG 类型 存放鼠标信息
GetMouseMsg() 获取鼠标信息的函数
*/
//========================================= drawMap();
while ()//循环 函数调用
{
play();
drawMap();
gameOver();
}
getchar();
closegraph();
return ;
}

运行结果

2018.05.23    12:26:26

C++学习(九)(C语言部分)之 项目 推箱子游戏的更多相关文章

  1. C语言之推箱子游戏代码

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Yan_Less 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...

  2. C语言实现推箱子游戏完整代码

    C语言实现推箱子游戏完整代码 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数 ...

  3. C++简单项目--推箱子

    在处理移动的时候有太多种情况了: 1.有空位 2.在推箱子,推到了空地 3.推箱子推到了目标, 4.推目标位的箱子推到另一个目标 5.推目标位的箱子推到空地 首先记录目标位置,在每次推动之后会再绘画中 ...

  4. C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  5. 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  6. 值得学习的C语言开源项目

    值得学习的C语言开源项目   - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...

  7. 【C/C++开发】值得学习的C语言开源项目

    值得学习的C语言开源项目 - 1. Webbench Webbench是一个在Linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...

  8. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  9. WinForm多语言版本实战项目演练

    一.课程介绍 关于如何实现“WinForm多语言版本”网上有很多实现技术方案,可以说是“琳琅满目”,"包罗万象".俗话说的好:一千个读者就有一千个哈姆雷特!如果您工作中恰好也遇到这 ...

随机推荐

  1. 神奇的口袋(dp)

    有一个神奇的口袋,总的容积是40,用这个口袋可以变出一 些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2……an.John可 ...

  2. 两点(DFS)

    福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”.基础级别的时候是在一个n×m单元上玩的.像这样: 每一个单元有包含一个有色点.我们将用不同的大写字母来表示不同的颜色. 这个游戏的关键是要找出一个包含 ...

  3. 关于scratch导出的flash画质很差的问题解决方案

    Scratch的分辨率是480*360,因此把scratch文件转变为flash时,因影像和画质很差,把flash插入到ppt幻灯片后,影像和画质仍然得不到保证.经过不断摸索,这个问题终于得到解决,关 ...

  4. 异常处理机制中的return关键字

    Java中,执行try-catch-finally语句需要注意: 第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂 ...

  5. memset详解 设置无穷大INF

    memest原型 (please type "man memset" in your shell) void *memset(void *s, int c, size_t n); ...

  6. [Leetcode 3] 最长不重复子串 Longest substring without repeating 滑动窗口

    [题目] Given a string, find the length of the longest substring without repeating characters. [举例] Exa ...

  7. 用matlab绘制中国地图

    reference:https://jingyan.baidu.com/article/870c6fc36fdacfb03ee4be58.html shp: http://muchong.com/ht ...

  8. 关于Java课堂实验中的一些总结(Scanner)

    import java.util.Scanner; 这个头文件是java里面用来输入东西的,就相当于c++里面的iostream输入流...?暂且这么理解吧 然后使用方法:Scanner in = n ...

  9. DevExpress WinForms v18.2新版亮点(二)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v1 ...

  10. tf 版本更新 记录

    tf 经常更新版本,网上教程又是各版本都有,且不标明版本,致使各种用法难以分清哪个新,哪个旧,这里做个记录,以前的博客我就不更新了,请大家见谅. tf.nn.rnn_cell 改为 tf.contri ...