游戏制作 推箱子

步骤分析

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. 2-Servlet和servletContext

    2018-08-09   22:34 * Servlet(好好学)  * 动态WEB的资源.   * 什么是Servlet    * 实现Servlet接口,重写5个方法.           * S ...

  2. day04流程控制之while循环

    流程控制之while循环 1.什么是while循环 循环指的是一个重复做某件事的过程 2.为何有循环 为了让计算机能像人一样重复 做某件事 3.如何用循环 ''' # while循环的语法:while ...

  3. 学习Linux系统的方法经验

    Linux系统是一个开源的高效的以命令行为主的操作系统,主要用于服务器操作系统领域.对于Linux操作系统更多详细准确的解释大家可以网上找到<Linux就该这么学>的第0章介绍的比较详细: ...

  4. InterBase 数据库与驱动 版本不同

    [Window Title] Project1 - Delphi 10.1 Berlin - Unit1 [Content] Failed: "unsupported on-disk str ...

  5. python logging模块,升级print调试到logging。

    简介: 我们在写python程序的时候,很多时候都有bug,都是自己写的,自己造的孽,又的时候报错又是一堆,不知道是那部分出错了. 我这初学者水平,就是打print,看哪部分执行了,哪部分没执行,由此 ...

  6. 百度GIS API使用

    按照惯例,先来一段"Hello World"级别的直观的效果 实现效果: 实现代码: (WEB工程下直接运行即可) <!DOCTYPE html> <html&g ...

  7. RabbitMQ 循环调度

    循环调度是针对Consumer消费者来说的.如果有多个Consumer订阅同一个队列的消息,RabbitMQ会自动按照顺序将消息发送到每一个Consumer手中. 就是这么简单!

  8. JavaScript简介及作用

    JavaScript是一门脚本语言,是可以插入HTML页面的编程代码,插入HTML以后可以由所有现代浏览器运行 一.写如html输出 <body> <script> docum ...

  9. 使用GCD控制网络请求

    当,当山峰没有棱角的时候 当河水不再流 当时间停住日夜不分 当天地万物化为虚有!,,,,不好意思跑题了! 当我们在一个页面中需要进行多次网络请求才能满足页面所有的显示需要的时候,我们需要控制这些请求全 ...

  10. 以黄门镇黄湾村某一扶贫文档为例——将Excel数据填入到已存在的Word模板

    傻瓜可以写出机器读得懂代码,但写出让人能读懂的代码的是优秀程序员 作用:通过Excel文件中的一列数据作为文件名创建Word文档,并将Excel中的一行数据填一表,实现自动化 Excel的VBA宏代码 ...