c语言推箱子 扫雷项目
推箱子
两关的推箱子用到一个三维数组
用到的图片数据如下
https://pan.baidu.com/s/1IDE4GQLo46cxNywDqwxmlQ
密码:jdel
代码如下:
#include<stdio.h>#include<easyx.h>#include<conio.h>//getch不显示字母#include<mmsystem.h>#pragmacomment(lib,"winmm.lib")//PlaySound播放wav//mciSendString放mp3intmyMap[][][]={{//8行9列-->8行10列,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,},{//7行10列-->8行10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}};//初始地图intmap[][];//正在使用地图IMAGEimg[];intlevel=;intflag;//当前关卡是否结束intop[];//保存最近100次的操作inttimes=;//保存的操作次数现在可以回撤次数voidrecord(intre)//记录每次的操作用于每部操作之后放到数组中{op[times++]=re;}voidrecall(){if(times==)return;//无法撤回times--;intx,y;for(inti=;i<;i++){for(intj=;j<;j++){if(map[i][j]==||map[i][j]==)//人或者人在目的地上{x=i;y=j;}}}//用x,y来表示人的位置switch(op[times]){case://直接往下走map[x][y]-=;map[x+][y]+=;break;case://带箱子往下走map[x][y]+=;map[x+][y]+=;//箱子下去了map[x-][y]-=;break;case://直接往上走map[x][y]-=;map[x-][y]+=;break;case://带着箱子往上走map[x][y]+=;map[x+][y]-=;map[x-][y]+=;break;case://直接往右走map[x][y]-=;map[x][y+]+=;break;case:map[x][y]+=;map[x][y+]+=;map[x][y-]-=;break;case://直接往左走map[x][y]-=;map[x][y-]+=;break;case:map[x][y]+=;map[x][y-]+=;map[x][y+]-=;break;}}voidloadMap()//加载地图{for(inti=;i<;++i){for(intj=;j<;j++){map[i][j]=myMap[level][i][j];//把第几关的地图放进map}}}voiddrawMap()//利用数字进行贴图{BeginBatchDraw();//双缓冲贴图优化贴图效果putimage(,,&img[]);for(inti=;i<;++i){for(intj=;j<;++j){switch(map[i][j]){case://空地break;case://墙壁putimage(j*,i*,&img[]);break;case://putimage(j*,i*,&img[]);break;case:putimage(j*,i*,&img[]);break;case:putimage(j*,i*,&img[]);break;case:putimage(j*,i*,&img[]);break;case:putimage(j*,i*,&img[]);break;}}}EndBatchDraw();}voidplay(){intx,y;//保存人的位置for(inti=;i<;i++){for(intj=;j<;j++){if(map[i][j]==||map[i][j]==)//人或者人在目的地上{x=i;y=j;}}}//找到人开始操作getch直接读取键盘的一个字符头文件conio.h//getch直接按就有反应getchar按完需要回车才有反应switch(getch()){case'w':case'W':if(map[x-][y]==||map[x-][y]==)//上方可以走或者上面是目的地或者空地{map[x][y]-=;map[x-][y]+=;record();}elseif(map[x-][y]==||map[x-][y]==)//上方是箱子或者目的地箱子{if(map[x-][y]==||map[x-][y]==){map[x][y]-=;map[x-][y]-=;map[x-][y]+=;record();}}break;case'a':case'A':if(map[x][y-]==||map[x][y-]==){map[x][y]-=;map[x][y-]+=;record();}elseif(map[x][y-]==||map[x][y-]==){if(map[x][y-]==||map[x][y-]==){map[x][y]-=;map[x][y-]-=;map[x][y-]+=;record();}}break;case's':case'S':if(map[x+][y]==||map[x+][y]==){map[x][y]-=;map[x+][y]+=;record();}elseif(map[x+][y]==||map[x+][y]==){if(map[x+][y]==||map[x+][y]==){map[x][y]-=;map[x+][y]-=;map[x+][y]+=;record();}}break;case'd':case'D':if(map[x][y+]==||map[x][y+]==){map[x][y]-=;map[x][y+]+=;record();}elseif(map[x][y+]==||map[x][y+]==){if(map[x][y+]==||map[x][y+]==){map[x][y]-=;map[x][y+]-=;map[x][y+]+=;record();}}break;//如果方向键盘上下左右72807577case'r':case'R':recall();break;default:break;}}voidwin(){intboxNum=;for(inti=;i<;i++){for(intj=;j<;j++){if(map[i][j]==){boxNum++;if(map[i-][j]==||map[i+][j]==)//上下至少一睹墙{if(map[i][j-]==||map[i][j+]==){flag=-;return;}}}}}if(boxNum==){flag=;//所有的箱子都推到目的地上游戏赢return;}flag=;}intmain(){mciSendString(L"open遥远的你.mp3",,,);mciSendString(L"play遥远的你.mp3",,,);initgraph(,);loadimage(&img[],L"素材/背景.jpg",,);loadimage(&img[],L"素材/墙.jpg",,);loadimage(&img[],L"素材/人物.jpg",,);loadimage(&img[],L"素材/箱子.jpg",,);loadimage(&img[],L"素材/目的地.jpg",,);loadimage(&img[],L"素材/源氏.jpg",,);loadMap();//加载第一关while(){drawMap();//画图play();win();if(flag==)//没输没赢继续{}elseif(flag==)//赢{level++;//关卡加1下一关times=;//清空回撤记录drawMap();if(level==){MessageBox(GetHWnd(),L"游戏结束",L"恭喜",MB_OK);break;//结束}else{if(MessageBox(GetHWnd(),L"是否进入下一关?",L"恭喜",MB_OKCANCEL)==IDOK)//IDCANCEL要么好要么不好{loadMap();flag=;}elsebreak;}}else{drawMap();if(MessageBox(GetHWnd(),L"是否重新玩?",L"抱歉",MB_OKCANCEL)==IDOK){//level=0;//从最初的那关开始玩times=;loadMap();//重新加载新地图}elsebreak;}}//getchar();closegraph();return;}
推箱子代码
扫雷
扫雷素材:
https://pan.baidu.com/s/1oAAuPHCzfxiLggQuB7wFfw
密码:5rxd
#include<stdio.h>
#include<graphics.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
#include<mmsystem.h>
#pragma comment(lib,"WINMM.LIB") void drawMap(int map[][], IMAGE img[]);
void init(int map[][], IMAGE img[],int bobNum);
int play(int map[][]);
int open(int map[][], int x, int y);//打开0周围的一片
int main()
{
mciSendString(L"open 遥远的你.mp3", , , );
mciSendString(L"play 遥远的你.mp3", , , );
int map[][] = {};
srand((unsigned)time(NULL));
int bobNum = rand() % + ;
IMAGE img[];
init(map, img,bobNum);
initgraph(*, *);//图形库窗口 int num,sum=;
while ()
{
drawMap(map, img);
num=play(map);
sum += num;
if (num == -)
{
drawMap(map, img);
MessageBox(GetHWnd(), L"踩到雷了", L"BOOM", MB_OK);
break;
}
else if (sum==*-bobNum)//是不是踩完了 踩的总个数==地图大小-雷的个数
{
drawMap(map, img);
MessageBox(GetHWnd(), L"恭喜", L"GOOD", MB_OK);
break;
}
}
closegraph();
return ;
}
//画图函数 作用画图 是否需要返回值?
void drawMap(int map[][],IMAGE img[])
{
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
if (map[i][j] >= - && map[i][j] <= )//没有分开
{
putimage(j * , i * , &img[]);
}
else if (map[i][j]>)
{
putimage(j * , i * , &img[]);
}
else
switch (map[i][j])
{
case ://雷
putimage(j * , i * , &img[]);break;
case :putimage(j * , i * , &img[]); break;
case :putimage(j * , i * , &img[]); break;
case :putimage(j * , i * , &img[]); break;
case :putimage(j * , i * , &img[]); break;
case :putimage(j * , i * , &img[]); break;
case :putimage(j * , i * , &img[]); break;
case :putimage(j * , i * , &img[]); break;
case :putimage(j * , i * , &img[]); break;
case :putimage(j * , i * , &img[]); break;
default:
break;
}
}
}
}
void init(int map[][], IMAGE img[], int bobNum)
{ int x, y;
for (int i = ; i < bobNum;)
{
x = rand() % ;
y = rand() % ;
if (map[x][y] == )//这个位置没有雷
{
map[x][y] = -;//随机位置放一个雷
++i;
} }
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
if (map[i][j] == -)
{
//给上下左右加上1
for (int x = i - ; x <= i + ; ++x)
{
for (int y = j - ; y <= j + ; ++y)
{
if (x >= && x< && y >= && y < && map[x][y] != -)
{
map[x][y]++;//不是雷的位置加1
}
}
}
}
}
}
//for (int i = 0; i < 10; ++i)
//{
// for (int j = 0; j < 15; ++j)
// {
// printf("%d\t", map[i][j]);
// }
// printf("\n");
//}
loadimage(&img[], L"素材2/space.jpg", , );
loadimage(&img[], L"素材2/1.jpg", , );
loadimage(&img[], L"素材2/2.jpg", , );
loadimage(&img[], L"素材2/3.jpg", , );
loadimage(&img[], L"素材2/4.jpg", , );
loadimage(&img[], L"素材2/5.jpg", , );
loadimage(&img[], L"素材2/6.jpg", , );
loadimage(&img[], L"素材2/7.jpg", , );
loadimage(&img[], L"素材2/8.jpg", , );
loadimage(&img[], L"素材2/hitmine.jpg", , );//雷
loadimage(&img[], L"素材2/stone.jpg", , );//石头
loadimage(&img[], L"素材2/flag.jpg", , );//旗帜 }
//play 1.有没有踩到雷 2.点开几个位置(翻开了几次)
int play(int map[][])
{
MOUSEMSG msg;//保存鼠标信息
while ()
{
msg = GetMouseMsg();//获取鼠标信息
int i, j;
switch (msg.uMsg)
{
case WM_LBUTTONDOWN://左键按下
//左键按下的位置是属于数组的哪个元素
i = msg.y / ;
j = msg.x / ;
//-1~8之间的数字 表示没有翻开
//9~18之间的数字 表示翻开
//-1+10-->9
//写标记 只有没有翻开的位置才可以标记 标记+20
//19~28 表示这个位置是标记过的
if (map[i][j] == )
{
int num=open(map, i, j);
//for (int x = i - 1; x <= i + 1; ++x)
//{
// for (int y = j - 1; y <= j + 1; ++y)
// {
// if (x >= 0 && x < 10 && y >= 0 && y < 15)//判断是否越界
// {
// if (map[x][y] <= 8 && map[x][y] >= -1)//判断是否翻开
// {
// map[x][y] += 10;//翻开周围一片
// }
// }
// }
//}
return num;
}
if (map[i][j] <= && map[i][j] >= )//能不能点开
{
map[i][j] += ;
return ;
}//
else if (map[i][j] == -)
{
map[i][j] += ;
return -;
}
break;
case WM_RBUTTONDOWN://鼠标右键按下
i = msg.y / ;
j = msg.x / ;
//如果已经标记了的 可以取消标记
//如果是没有标记过 并且没有翻开的 点开标记
if (map[i][j] <= && map[i][j] >= -)
{
map[i][j] += ;
return ;
}
else if (map[i][j] >= )
{
map[i][j] -= ;
return ;
}
default:
break;
}
}
}
int open(int map[][], int x, int y)
{
int num = ;
map[x][y] += ;
for (int i = x - ; i <= x + ; ++i)
{
for (int j = y - ; j <= y + ; ++j)
{
if (i >= && i< && j>= && j < )
{
if (map[i][j] == )
{
num+=open(map, i, j);//如果周围有0那么翻开周围的0
}
else if (map[i][j] >= - && map[i][j] <= )
{
map[i][j] += ;
num++;
}
}
}
}
return num;
}
//获取鼠标信息方法
// WM_MOUSEMOVE 鼠标移动
// WM_MOUSEWHEEL 鼠标滚轮拨动
// WM_LBUTTONDOWN 左键按下
// WM_LBUTTONUP 左键弹起
// WM_LBUTTONDBLCLK 左键双击
// WM_MBUTTONDOWN 中键按下
// WM_MBUTTONUP 中键弹起
// WM_MBUTTONDBLCLK 中键双击
// WM_RBUTTONDOWN 右键按下
// WM_RBUTTONUP 右键弹起
// WM_RBUTTONDBLCLK 右键双击
c语言推箱子 扫雷项目的更多相关文章
- C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- C++学习(九)(C语言部分)之 项目 推箱子游戏
游戏制作 推箱子 步骤分析 1.模板 2.模板分析 组成元素: 空地 墙 人 目的地 箱子 背景 3.如何操作 通过WASD键盘操作人,推着箱子,到达目的地,游戏结束,如果箱子卡在死角则游戏失败 4. ...
- C语言小程序——推箱子(窄字符和宽字符)
C语言小程序——推箱子(窄字符Version) 推箱子.c #include <stdio.h> #include <conio.h> #include <stdlib. ...
- C语言之推箱子游戏代码
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Yan_Less 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
- 012-C语言小游戏之推箱子
012-C语言小游戏之推箱子 一.创建游戏地图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #define ROWS 11 #define COLS 12 char ...
- C语言实现推箱子游戏完整代码
C语言实现推箱子游戏完整代码 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数 ...
- c语言游戏推箱子
前两天做了推箱子小游戏,看似简单的一个小游戏背后却 有巨大的秘密,这秘密就是一大堆逻辑. 自从学习了函数过后,的确是解决了很多问题,而且调用很方便,尽管我现在都不是很会调用. 写完一个函数,准备测试一 ...
- C语言版推箱子
推箱子源代码初步: #include<stdio.h> #include<conio.h> #include<stdlib.h> #define boolean i ...
随机推荐
- 洛谷 P3367 并查集 【模板题】
题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入输出格式 输入格式: 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1 ...
- 【超详细】vultr(CentOS7)+LNMP+WordPress 搭建个人博客
心血来潮想搭建个人博客,我的vps只用来搭ss未免太过浪费 在这里记录一下搭建个人博客的历程 0x00 写在前面 why vultr: 优点:便宜. 性能优良.按时间计费(不用包年 学生党的福音).稳 ...
- 使用jqueryUI实现自由调整表格列宽
今天项目中需要插入表格,用Excel表格调整列宽时,想怎么拖就怎么拖,于是乎就让插入的表格也这么让人舒服.网上查找许久,没找到好用的方案.最后发现jQuery UI中的resizable()方法可以实 ...
- 学习git使用网址
如何将本地项目上传到Github (随梦飞翔) https://www.cnblogs.com/smfx1314/p/8426115.html git学习 GUI https://blog.csdn. ...
- python红蓝英雄大乱斗(面向对象实现)
红蓝英雄大乱斗 游戏规则 ''' 有红蓝两方英雄(可自定义个数) 随机一方英雄使用随机攻击方式攻击另一方英雄,任意一方英雄全部阵亡则游戏结束 每个英雄有 名字.生命值.普通攻击.Q技能攻击.W技能攻击 ...
- ALLOT流控设备SSG
Allot AC 系列产品EOL的通知如下. 该产品于2021年3月31日EOL. 替代的产品系列为SG/SSG系列. Allot Secure Service Gateway(SSG)应用程序和用户 ...
- Reporting报表开发知识合并[个人原创]
[个人原创] ,转发请声明原文链接 了解 a) SSRS全称 SQL Server Reporting Services,是依赖于数据库运行的,是微软开发的重量级别的BI产品 b) ...
- windows下用easybcd引导ubuntu出现grub的解决方案
linux安装时吧boot挂在到单独的分区 如果grub覆盖了mbr的话可以用pe工具箱修复windows的mbr linux引导项选grub 驱动器选安装时挂载了/boot的分区 添加条目 启动即可 ...
- kafka集群跨双网段及多网段通信问题解决
一.问题场景: 实际生产环境总存在很多kafka集群跨网段的问题.kafka集群可能存在多个网卡,对应多个网段.不同网段之间需要同时与集群通信,即跨网段生产消费问题. 二.解决方法:自定义listen ...
- LinkedHashMap的特殊之处
一.前言 乍眼一看会怀疑或者问LinkedHashMap与HashMap有什么区别? 它有什么与众不同之处? 由于前面已经有两篇文章分析了HashMap,今天就看看LinkedHashMap.(基于 ...