游戏制作 推箱子

步骤分析

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. Python格式化字符 %s %d %f

    格式 描述%% 百分号标记 #就是输出一个%%c 字符及其ASCII码%s 字符串%d 有符号整数(十进制)%u 无符号整数(十进制)%o 无符号整数(八进制)%x 无符号整数(十六进制)%X 无符号 ...

  2. day6-if,while,for的快速掌握

    python的缩进和冒号 python之所以如此简单,归功于它的缩进机制,严格的缩进机制是的代码非常整齐规范,赏心悦目,提高了可读性,在一定意义上提高了可维护性,但对于从其他语音转过来的朋友如:jav ...

  3. RabbitMQ 设置消息的TTL(过期时间)

    我们在RabbitMQ中发布消息时,在代码中有两种方法设置某个队列的消息过期时间: 1.针对队列来说,可以使用x-message-ttl参数设置当前队列中所有消息的过期时间,即当前队列中所有的消息过期 ...

  4. 【转载】JVM系列一:JVM内存组成及分配

    java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时 ...

  5. SQL-28 查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部

    题目描述 film表 字段 说明 film_id 电影id title 电影名称 description 电影描述信息 CREATE TABLE IF NOT EXISTS film ( film_i ...

  6. html页面小技巧

    #1.onkeyup限制输入框只能输入数字 通过onkeyup事件是输上后再去掉非数字字符 <input type="text" onkeyup="value=va ...

  7. POJ - 1942 D - Paths on a Grid

    Imagine you are attending your math lesson at school. Once again, you are bored because your teacher ...

  8. SpringMVC学习二

    处理请求 今天学了三种请求,一种是 PathVariable ,一种是 RequestParam ,还有一种是CookieValue,并实现简单rest增删改查 上代码 package com.spr ...

  9. 基于spec互评Alpha版本

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2323] 队名:二次元梦之队 组长:刘莹莹 组员:周昊 潘世维  王玉潘 赵美增 ...

  10. request的响应时间elapsed和超时timeout

    前言:requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的 1.获取接口请求的响应时间  r.elapsed.total_seconds() import ...