C++学习(九)(C语言部分)之 项目 推箱子游戏
游戏制作 推箱子
步骤分析
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语言部分)之 项目 推箱子游戏的更多相关文章
- C语言之推箱子游戏代码
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Yan_Less 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
- C语言实现推箱子游戏完整代码
C语言实现推箱子游戏完整代码 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数 ...
- C++简单项目--推箱子
在处理移动的时候有太多种情况了: 1.有空位 2.在推箱子,推到了空地 3.推箱子推到了目标, 4.推目标位的箱子推到另一个目标 5.推目标位的箱子推到空地 首先记录目标位置,在每次推动之后会再绘画中 ...
- C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 值得学习的C语言开源项目
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...
- 【C/C++开发】值得学习的C语言开源项目
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在Linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
- WinForm多语言版本实战项目演练
一.课程介绍 关于如何实现“WinForm多语言版本”网上有很多实现技术方案,可以说是“琳琅满目”,"包罗万象".俗话说的好:一千个读者就有一千个哈姆雷特!如果您工作中恰好也遇到这 ...
随机推荐
- 补交第二周作业:学习ka li
在老师给的虚拟机上安装,试了n次都没有安装成功,百度上的说法也是众说纷纭. 之后重新安装了另一个版本的虚拟机,按照教程成功装上了ka li. 一. 安装VMtools:是为了方便宿主机与虚拟机间的文件 ...
- 机器学习---笔记----numpy和math包中的常用函数
本文只是简单罗列一下再机器学习过程中遇到的常用的数学函数. 1. math.fabs(x): 返回x的绝对值.同numpy. >>> import numpy >>> ...
- windows 文本操作
type命令 作用:显示文件类文件内容 (例如:.txt .Java .cpp .c .html 等属于文本类文件 .word excel ppt exe dll 等都不属于文本类文件) fc命令 作 ...
- C++解析三
类的构造函数类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行.构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void.构造函数可用于为某些成员变量设置初始 ...
- js将接口返回的数据序列化
<div style={{marginLeft: '80px'}}> <pre> {th ...
- 回溯算法 LEETCODE别人的小结 一八皇后问题
回溯算法实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试中寻找问题的解,当发现已不满足求解条件时,就回溯返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目的.但是当探索到某 ...
- day22 模块_1
核能来袭--模块 1.简单了解模块 2.Collections 3.Time模块 4.functools 一.初识模块 其实之前写的每一个PY文件都是一个模块 还有一些我们一直在使用的模块 buil ...
- 《Python》hashlib模块、configparser模块、logging模块
一.hashlib模块 Python的hashlib模块中提供了常见的摘要算法,如md5,sha1等等. 摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的字符串(通 ...
- nopcommerce 4.1 net core 学习1
关注nop有2年多, 基本都是下载看看结构, 里面的多语言跟主题模板 插件加载 是我比较喜欢的. 最近看nop4.1版本已经全面替换成了asp.net core 2.1 +ef core2.1,所以专 ...
- 《软件调试 Windows概要》
操作系统是计算机系统中的基本软件.它负责管理系统中的软硬件资源.通常都包括文件管理.内存管理.进程管理.打印管理.网络管理等基本功能.除此之外,支持调试也是操作系统设计的一项根本任务. 0x01 进 ...