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 ...
随机推荐
- MFC在一个工程中启动其他工程的exe文件
说明:有的时候把两个工程合并,但是偷懒不想在工程中添加代码,所以想到了这个办法,仅限偷懒哈哈哈哈 方法:新建一个主程序,在主程序的界面中添加按钮,在按钮的程序代码中添加以下语句: void CMain ...
- 个人永久性免费-Excel催化剂功能第90波-xml与json数据结构转换表格结构
在网络时代,大量的数据交互以xml和json格式提供,特别是系统间的数据交互和网络WebAPI.WebService接口的数据提供,都是通过结构化的xml或json提供给其他应用调用返回数据.若能提供 ...
- MD5的简单用法
非常简单的MD5加密和解密(即用即copy) 点击帮助灯泡引用就可使用 //生成MD5帮助文件文件 public class MD5Help{ ///MD5加密 方法类 public static s ...
- C语言编程入门之--第一章初识程序
第一章 初识程序 导读:计算机程序无时不刻的影响着人类的生活,现代社会已经离不开程序,程序的作用如此巨大,那么程序到底是什么呢?本章主要讨论程序的概念,唤起读者对程序的兴趣,同时对C语言程序与其它语言 ...
- Spring 核心技术(4)
接上篇:Spring 核心技术(3) version 5.1.8.RELEASE 1.4.2 依赖关系及配置详情 如上一节所述,你可以将 bean 属性和构造函数参数定义为对其他托管 bean(协作者 ...
- nodejs 如何自动化配置环境参数
应用场景: 最近用 node 重构了网站的项目,部署到测试环境的时候测试一切正常. 直到有一天,运维把代码上线到内测环境的时候...... 突然发现:内测环境和测试环境竟然是同一台服务器,只不过是把代 ...
- Spring Cloud 之 Config与动态路由.
一.简介 Spring Cloud Confg 是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为分布式配置中心,它是一个独立的微服务 ...
- python模块知识一 自定义模块、time、datetime时间模块
第五章 模块 1.自定义模块: 模块分类: 内置模块(标准库)-- python解释器自带的.py文件(模块) 第三方模块(各种大神写的)-- 需要额外下载(并发编程pypi) 自定义模块(自己写的) ...
- Java类什么情况下被初始化?
1.创建类的实例(new 的方式).访问某个类或接口的静态变量,或者对该静态变量赋值,调用类的静态方法 2.反射的方式 3.当初始化一个类的时候,如果发现其父类还没有进行初始化,则需先触发其父类的初始 ...
- Java oop 多态
1.多态指对象的多种形态:引用多态与方法多态 注意: A:继承是多态的实现基础 B:方法重写也是多态的体现 2.引用多态 A:父类的引用可以指向本类的对象:父类 对象名 = new 父类( ...