游戏制作 推箱子

步骤分析

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. 【转载】offer经验

    http://www.cnblogs.com/figure9/archive/2013/01/09/2853649.html

  2. IDEA教程之导入maven项目

    通过从网上的开源项目下载源码,一般都是maven管理的项目,此类项目可以通过导入快捷运行项目,如图为下载的一个项目: 2 打开IDEA,点击第二个选项“Import Porject”,然后选择源码根目 ...

  3. [Linux]Linux下rsync服务器和客户端配置

    一.rsync简介 Rsync(remote sync)是UNIX及类UNIX平台下一款神奇的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync可以根据数据的变化进行差异( ...

  4. Linux学习: LCD驱动

    一.LCD驱动框架: 1.分配一个fb_info结构体:s3c_lcd = framebuffer_alloc(0,NULL); 2.设置fb_info(s3c_lcd): ID.固定参数.可变参数. ...

  5. FPGA构造spi时序——AD7176为例(转)

    reference:https://blog.csdn.net/fzhykx/article/details/79490330 项目中用到了一种常见的低速接口(spi),于是整理了一下关于spi相关的 ...

  6. Java基础-变量常量

    变量 内存中的一小块区域,需要变量名来访问 变量的命名: 变量类型 变量名=变量值 例:String stuName= "wangwei"; java中的所有标点符号都是英文的 变 ...

  7. VS2012里面使用EF框架的增删改查和分页的方法

    public class BaseRepository<T> where T : class    {        //实例化EF框架        DataModelContainer ...

  8. Python 基础的应用day2

    1 用户交互input,将用户输入的内容赋值给 name 变量 后只能是字符串str.      区别2和3: ps :python2:raw_input python3:input 例 :1 nam ...

  9. chromium ②

    这篇研究两个问题:chromium对线程的封装和进程通信.主要参考chromium的官方技术文档:Treading和Inter-process Communication (IPC). chrome速 ...

  10. Allocation-Free Collections

    假设你有一个方法,通过创建临时的List来收集某些数据,并根据这些数据来统计信息,然后销毁这个临时列表.这个方法被经常调用,导致大量内存分配和释放以及增加的内存碎片.此外,所有这些内存管理都需要时间, ...