鼠标控制c语言扫雷程序,【源码项目】C语言/C+开发,打造一个小项目扫雷小游戏!...
一直说写个几百行的小项目,于是我写了一个控制台的扫雷,没有想到精简完了代码才200行左右,不过考虑到这是我精简过后的,浓缩才是精华嘛,我就发出来大家一起学习啦,看到程序跑起来能玩,感觉还是蛮有成就感的~哈哈
扫雷应该属于一款大众游戏,从我初中使用计算机开始,它就被集成到了windows系统中,虽然他是这么经典,我还是要介绍一下他的玩法,然后再考虑在控制台中怎么实现它。
1、游戏的主界面,是一个一个小方格,在小方格上单击左键,可以翻开小方格看看后面有什么。
2、在这些小方格的背后隐藏着雷,如果不幸点中了雷,那么就GameOver了。
如果点中的不是一个雷,那么就是一块空地,这个时候会出现两种情况:
1)用鼠标点中的空地周围八个点内有雷,那么就显示雷的个数
2)用鼠标点中的空地周围没有雷,这个时候就将周围的空地全部显示出来,遇到该显示数字的空地,就将数字显示出来。(仔细观察你会发现,数字会将空地围起来,这是一句废话,但是也值得想一想这是为什么)
3、在小方格上,点击鼠标的右键,可以将一个空地标记为雷,当然这个功能只是为了方便你记忆你之前确定是雷的地方。(还有左右键都点,和点击右键出现?标记,这里就不谈啦)
4、当空地上剩余的格子数和雷的个数一样多,那么这个时候就应该算是胜利啦。
OK~游戏流程说完了,这个时候该谈谈如何实现了。
1、首先需要一张地图,一般情况下我们都可以用一个二维数组表示一个地图,每一个元素代表着扫雷中的一个小方格。相应元素存储0,那么地图上的这个位置就是空地,相应元素存储1,那么就代表这个位置就一颗雷。
2、在控制台上依照二维数组长度和宽度,打印相应的小方块。
3、然后就用鼠标点击那些小方块,对于控制台来讲,在黑框框的区域中是有坐标的,可以使用一些函数捕获到你点击了屏幕的哪一个坐标。
4、对于控制台来说,打印一个字符,有的字符横向占一个位置比如普通的字母数字,有的字符横向占两个位置比如一些图形字符: ■◆等等,这点在控制台编程的时候要注意。
5、当点击屏幕的时候,获取到点击的坐标后,去二维数组中查看相应的位置是雷还是空地,从而做相应的处理。
1)假如点击到了雷,那么就控制游戏结束
2)假如点击到了空地有两种情况
1.点击的空地周围有雷,那么就将雷的个数显示出来
2.假如点击的空地周围没有雷,那么就使用递归的方法去探测周围的点,探测出与其相连的所有周围有雷的点。
这个是我实现的效果,下面就是代码啦:
// saolei.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#define Boom 10
int a[10][10] = ;
COORD TempPos[100] =;
int nSign = 0;
点击播放 GIF 0.0M
/************************************
函数名 : WriteWchar
函数作用: 在控制台相应的坐标上显示一串字符
返回值 : void
参数 : int x 横坐标
参数 : int y 纵坐标
参数 : char szString[] 要显示的字符串
说明 :
************************************/
void WriteWchar(int x,int y,char szString[])
{
HANDLE hOut= GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = ;
SetConsoleCursorPosition(hOut,pos);
printf("%s",szString);
}
/************************************
函数名 : DrawNumber
函数作用: 在相应的坐标上,根据传入的数字,打印相应的数字字符
返回值 : void
参数 : COORD pos 要打印的位置
参数 : int nNumber 要打印的数字
说明 :
************************************/
void DrawNumber(COORD pos,int nNumber)
{
switch (nNumber)
{
case 1:
WriteWchar(pos.X,pos.Y,"");
break;
case 2:
WriteWchar(pos.X,pos.Y,"");
break;
case 3:
WriteWchar(pos.X,pos.Y,"");
break;
case 4:
WriteWchar(pos.X,pos.Y,"");
break;
case 5:
WriteWchar(pos.X,pos.Y,"");
break;
case 6:
WriteWchar(pos.X,pos.Y,"");
break;
case 7:
WriteWchar(pos.X,pos.Y,"");
break;
case 8:
WriteWchar(pos.X,pos.Y,"");
break;
default:
break;
}
}
/************************************
函数名 : GetNumber
函数作用: 获取一个点的四周有几颗雷
返回值 : int
参数 : COORD pos 要探测的点的坐标
说明 :
************************************/
int GetNumber(COORD pos)
{
int nCount = 0;
for(int i = pos.X-1;i
for (int j = pos.Y-1;j
{
if (a[j][i] == Boom)
{
nCount++;
}
}
return nCount;
}
/************************************
函数名 : Drawmap
函数作用: 打印一下地图
返回值 : void
说明 :
************************************/
void Drawmap()
{
for (int i =0;i
{
for (int j =0;j
{
WriteWchar(j,i,"■");
}
}
}
/************************************
函数名 : Init
函数作用: 随机生成10个地雷,然后存到数组中
返回值 : void
说明 :
************************************/
void Init()
{
srand(time(NULL));
for (int i =0;i
{
int Temp_x = rand()%10;
int Temp_y = rand()%10;
//判断这个地方是不是已经生成一个雷了,如果没有,赋值为雷
if (a[Temp_x][Temp_y]!=Boom)
{
a[Temp_x][Temp_y] = Boom;
}
//如果是雷,就相当于本次生成没有发生过。。。。。
else
{
i--;
}
}
Drawmap();
}
点击播放 GIF 0.0M
/************************************
函数名 : IsClose
函数作用: 判断是不是已经探测过的点,由于使用的8方向递归的探测,这样避免重复
返回值 : bool
参数 : COORD posTemp
说明 :
************************************/
bool IsClose(COORD posTemp)
{
for (int i =0;i
{
if(TempPos[i].X == posTemp.X&&TempPos[i].Y == posTemp.Y)
return true;
}
return false;
}
/************************************
函数名 : IsKongdi
函数作用: 判断一个点是空地,还是雷,如果是空地,需要做其他处理
返回值 : void
参数 : COORD pos
说明 :
************************************/
bool IsKongdi(COORD pos)
{
int nNumber = 0;
//1 如果是雷,就直接返回一个false说明要挂了
if (a[pos.Y][pos.X] == Boom)
{
return false;
}
//2 如果不是雷,那么就做后续处理
else
{
//2.1先判断一下周围有几颗雷
nNumber = GetNumber(pos);
if (nNumber!=0){
//有几颗雷,就打印这个数字
DrawNumber(pos,nNumber);
return true;
}
else
{
//如果没有雷,那就先画空地出来,然后向周围扩散去探测其他点
WriteWchar(pos.X,pos.Y," ");
}
}
//2.2点到了空地,但是周围没有雷的情况的处理,继续去探测周围8个点
for(int i = -1;i
for (int j = -1;j
{
COORD posTemp = ;
//是不是越界了
if (i==0&&j==0||posTemp.X==-1||posTemp.Y==-1||posTemp.X==10||posTemp.Y==10)
continue;
//这个点是不是已经探测过了
if (IsClose(posTemp))
continue;
//这个点没有探测过,就将其加入到数组中,然后使其在以后的探测中,存入
TempPos[nSign++] =posTemp;
IsKongdi(posTemp);
}
return true;
}
/************************************
函数名 : GetMousePosition
函数作用: 获取鼠标点击的位置,假如没有获取到,就返回(-1,-1)
返回值 : COORD 鼠标点击的坐标
说明 :
************************************/
COORD GetMousePosition()
{
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD stcInput = ;
DWORD buffer;
COORD pos = {-1,-1};
ReadConsoleInput(hIn,&stcInput,1,&buffer);
if (stcInput.EventType == MOUSE_EVENT)
{
MOUSE_EVENT_RECORD stcMouseEnent = stcInput.Event.MouseEvent;
if (stcMouseEnent.dwButtonState ==FROM_LEFT_1ST_BUTTON_PRESSED )
{
pos = stcMouseEnent.dwMousePosition;
pos.X/=2;
}
}
return pos;
}
int _tmain(int argc, _TCHAR* argv[])
{
Init();
COORD pos;
//开始游戏
while(1)
{
//获取鼠标点击位置
pos = GetMousePosition();
if (pos.X!=-1)
{
//如果鼠标点击的位置被探测过了,就开始下一次循环
if (IsClose(pos))
{
continue;
}
TempPos[nSign++] =pos;
bool bIskongdi = IsKongdi(pos);
//点到雷了,就直接退出游戏了。
if (false ==bIskongdi)
{
system("cls");
WriteWchar(20,10,"you lose");
getchar();
break;
}
//检测是不是赢了,赢的条件就是没有被探测的点的个数和雷的个数相等
if (nSign ==90)
{
system("cls");
WriteWchar(20,10,"you win");
}
}
}
return 0;
}
项目不是很长,但是注释我写的还算明白,估计大家都可以看得懂,希望对于新手们有一定的帮助,谢谢大家的支持!!!
看到这里你是不是又学到了很多新知识呢~
鼠标控制c语言扫雷程序,【源码项目】C语言/C+开发,打造一个小项目扫雷小游戏!...相关推荐
- c语言字符动画源码下载,C语言动画程序源码.docx
C语言动画程序源码 C语言动画程序#include #include #include #include #define pi 3.1415926535 double ca3mm1(double m1 ...
- 小程序源码:登录已修复零象垃圾废品回收微信小程序源码下载,V2.8.2完整全开源前端+后端
零象垃圾废品回收小程序源码,V2.8.2完整全开源安装包+小程序前端, 是一款专注于垃圾回收小程序源码,支持协议定期企业废品回收,垃圾分类小区物业定期回收. 关于程序 运行环境:微擎+PHP+MYSQ ...
- 微信小程序:全新强大的恋爱话术微信小程序源码土味情话视频号or自媒体操作项目
你猜的不错,这就是一款恋爱话术小程序 该款小程序相对来说还是挺强大的 而且还融合了小编前段时间发布的一款土味情话在里面 这款小程序基本分段都是和外面几千块几百块的分段是一样的 如有分段是: 开场阶段丨 ...
- 小程序源码:修复图片音频全新升级带特效喝酒神器小游戏微信小程序
这是一款全新升级带特效喝酒神器小游戏微信小程序源码 小编发现很多喝酒神器小程序都不带特效和音效的 感觉差了那么一点意思而且感觉也不炫酷 所以小编今天给大家带来一款带特效,音效炫酷的喝酒神器 该款神器由 ...
- 小程序源码:修复图片音频全新升级带特效喝酒神器小游戏-多玩法安装简单
这是一款全新升级带特效喝酒神器小游戏微信小程序源码 小编发现很多喝酒神器小程序都不带特效和音效的 感觉差了那么一点意思而且感觉也不炫酷 所以小编今天给大家带来一款带特效,音效炫酷的喝酒神器 该款神器由 ...
- 小程序源码:星座运势,周公解梦流量主微信小程序
这是一款以星座运势查询,周公自定义解梦为主的一款小程序 内支持流量主模式插入 多个功能包含如下: 星座查询 星座运势查询 十二生肖查询 生肖运势查询 星座配对 生肖配对 配对排行榜 星盘查询 周公解梦 ...
- 小程序源码:宅男必备福利壁纸大全自动采集微信小程序
这是一款可以说是宅男的最爱 也可以说是专门给宅男准备的一款小程序吧 里面支持动态视频,静态壁纸,情侣头像等多种分类 保存内容支持每天激励视频解锁保存 全内容自动采集,内附含了数不清的小姐姐,二次元,各 ...
- 小程序源码:全新独家云开发微群人脉小程序源码下载社群空间站
今天给大家带来一款云开发版本的微群人脉小程序源码 该版本属于采集版本(群二维码自动采集) 该版本属于云开发版本(免服务器和域名) 这是一款不怕封小程序版本 PS:支持用户自主发布那一款还是有点危险因为 ...
- 小程序源码:2022虎年背景全新UI头像框制作微信小程序源码下载-多玩法安装简单
内包含了虎年虎娃多种分类头像框模板,全是和2022虎年有关 每一种分类都包含了多种模板制作 虎娃的小编个人感觉那个卡通也是挺可爱的! 另外整个小程序的背景UI都是以虎年为背景,所以总体的感觉还是很不错 ...
- 小程序源码:全新独家云开发微群人脉-多玩法安装简单
今天给大家带来一款云开发版本的微群人脉小程序源码 该版本属于采集版本(群二维码自动采集) 该版本属于云开发版本(免服务器和域名) 这是一款不怕封小程序版本 PS:支持用户自主发布那一款还是有点危险因为 ...
最新文章
- 递归算法转换为非递归算法的技巧
- IOS判断用户的网络类型(2/3/4G、wifi)
- jupyter怎么安装jieba_AI工具:Anaconda中Jupyter不能import已安装module问题解决
- 【数据预测】基于matlab双向长短时记忆(biLSTM)数据预测【含Matlab源码 1793期】
- Elite Model的NetSuite ERP国内成功实例!
- 无线打印机服务器安装教程,网络打印服务器怎么安装和使用?
- uniapp点击复制文本
- 如何在阿里云上购买域名并备案Iot studio
- 穿山甲广告。swift穿山甲广告40001报错
- 七、系统架构 - 伸缩性架构设计
- 2020web前端学习路线
- Python matplotlib绘图,使用鼠标滚轮放大/缩小图像
- FaceBoxes —— CPU上实时的人脸检测
- 码农+码农=码农 ?
- WPA_CLI 的介绍:介绍如何使用wpa_cli连接WiFi的方法
- 一篇入门电容的选择和使用
- 记一次rsync日志报错directory has vanished
- 读取文件夹内的文件名来检查哪个学生没有交作业
- 大灰狼的故事-大灰狼和小乌龟
- 基于PHP+小程序(MINA框架)+Mysql数据库的驾校考试小程序系统设计与实现