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 ...
随机推荐
- DvaJS构建配置React项目与使用
DvaJS构建配置React项目与使用 一,介绍与需求分析 1.1,介绍 dva 首先是一个基于redux 和redux-saga的数据流方案,然后为了简化开发体验,dva 还额外内置了react-r ...
- TreeMap原理实现及常用方法
目录 一. TreeMap概述 二. 红黑树回顾 三. TreeMap构造 四. put方法 五. get 方法 六. remove方法 七. 遍历 八. 总结 前面我们分别讲了Map接口的两个实现类 ...
- Spring Boot 中 Redis 的使用
Spring Boot 对常用的数据库支持外,对 Nosql 数据库也进行了封装自动化,如Redis.MongoDB等,本文主要介绍Redis的使用. Redis 介绍 Redis 是目前业界使用最广 ...
- Hive的基本操作和数据类型
Hive的基本操作 1.启动Hive bin/hive 2.查看数据库 hive>show databases; 3. 打开默认数据库 hive>use default; 4.显示defa ...
- VUE过滤器的使用 vue 时间格式化
过滤器介绍 官方教程地址:https://cn.vuejs.org/v2/guide/filters.html 过滤器常被用于一些文本格式化 我们可以自定义过滤器,可以实现各种各样的功能. vue时间 ...
- easypermissions的基本使用
转载请注明出处 http://blog.csdn.net/pyfysf/article/details/78204395 Android 6.0(API 级别 23)开始,在应用运行时向其授予权限,而 ...
- [leetcode] 392. Is Subsequence (Medium)
原题 判断子序列 /** * @param {string} s * @param {string} t * @return {boolean} */ var isSubsequence = func ...
- Java IO部分面试题
1.什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 1. Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1 2. Byte是计算机操作数据 ...
- 推荐:经典SQL语句大全
一.基础 .说明:备份sql server--- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mss ...
- mysql添加外键失败解决方案
mysql重启命令: [root@wshCentOS centOS7Share]# service mysqld stopRedirecting to /bin/systemctl stop mys ...