当前位置: 首页 > 编程日记 > 正文

C语言-扫雷游戏

头文件

#ifndef __MINE_H__
#define __MINE_H__#define LINE 10
#define LIST 10
#define ROWS 6
#define COWS 6int game(char UserBoard[LINE+2][LIST+2], char PlayerBoard[LINE][LIST]);
void PrintBoard(char Playerboard[LINE][LIST]);
void MineLay(char UserBoard[LINE + 2][LIST + 2]);
void PrintUser(char UserBoard[LINE + 2][LIST + 2]);
int MineClear(char UserBoard[LINE + 2][LIST + 2], char PlayerBoard[LINE][LIST]);
void Blast(char UserBoard[LINE + 2][LIST + 2], char PlayerBoard[LINE][LIST]);
int Counter(char UserBoard[LINE + 2][LIST + 2], char PlayerBoard[LINE][LIST], int x, int y);#endif   //mine.h

函数文件

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include"mine.h"void MineLay(char UserBoard[LINE + 2][LIST + 2])
{int x = 0, y = 0,i = 0,j = 0;char m = '0';printf("**************************\n");printf("******* a: 十个雷 ********\n");printf("******* b: 二十雷 ********\n");printf("**************************\n");printf("请选择难度>:");fflush(stdin);scanf("%c",&m);printf("\n");if ('a' == m){j = 10;}elsej = 20;while (i < j){x = rand() % 10 + 1;y = rand() % 10 + 1;if ('0' == UserBoard[x][y]){UserBoard[x][y] = '1';i++;}}}void Blast(char UserBoard[LINE + 2][LIST + 2], char PlayerBoard[LINE][LIST])//全局输了
{int i = 0, j = 0;for (i = 1; i <=LINE; i++){for (j = 1; j <= LIST; j++){if ('1' == UserBoard[i][j]){PlayerBoard[i - 1][j - 1] = '#';}if ('*' == PlayerBoard[i - 1][j - 1])    //{                                       //PlayerBoard[i - 1][j - 1] = ' ';      //}                                          //}}
}void PrintBoard(char Playerboard[LINE][LIST])
{int i = 0, j = 0;printf("  0 1 2 3 4 5 6 7 8 9 10\n");printf("------------------------\n");for (i = 0; i < LINE; i++){printf("%2d| ",i+1);for (j = 0; j < LIST; j++){printf("%c ",Playerboard[i][j]);}printf("\n");}printf("\n");
}int MineClear(char UserBoard[LINE + 2][LIST + 2], char PlayerBoard[LINE][LIST])
{int x = 0, y = 0,num = 0,win = 0,i =0,j = 0,m = 0,n = 0,p = 0,q = 0,a = 0,b = 0;while (1){printf("请输入扫雷坐标>:");scanf("%d%d", &x, &y);a = x;b = y;i = x;j = y;m = x;n = y;p = x;q = y;if ((x > 0 && x <= 10) && (y > 0 && y <= 10)){if ('1' == UserBoard[x][y]){PlayerBoard[x-1][y-1] = '#';Blast(UserBoard, PlayerBoard);PrintBoard(PlayerBoard);printf("啊!!!!你被炸死啦!!!!\n");return 0;}if ('0' == UserBoard[x][y]){for (a = x; a >= 1; a--,b = y)//向上向左{if (0 != Counter(UserBoard, PlayerBoard, a, b))break;for (b = y; b >= 1; b--)   自加自减和for循环的初值一定要注意哦,我一开始的代码是	for (a = x; a >= 1 && '0' == UserBoard[a][b]; a--)for(; b >= 1 && '0' == UserBoard[a][b]; b--)此时{                                                        //此时,当a--时,b的值已经是上次的0了,所以下面的每次都不执行,因为判断条件是b>=1if (0 != Counter(UserBoard, PlayerBoard, a, b))break;}}for (i = x; i >= 1; i--,j = y)//向上向右数{if (0 != Counter(UserBoard, PlayerBoard, i, j))break;for (j = y; j <= LIST; j++)     //for循环里面尽量不要既执行又判断{if (0 != Counter(UserBoard, PlayerBoard, i, j))break;}}for (m = x; m <= LINE; m++,n = y)//向下向左{if (0 != Counter(UserBoard, PlayerBoard, m, n))break;for (n = y; n >= 1; n--){if (0 != Counter(UserBoard, PlayerBoard, m, n))break;}				}for (p = x; p <= LINE; p++,q = y)//向下向右{if (0 != Counter(UserBoard, PlayerBoard, p, q))break;for (q = y; q <= 4; q++){if (0 != Counter(UserBoard, PlayerBoard, p, q))break;}				}PrintBoard(PlayerBoard);//PrintUser(UserBoard);  win = 0;                 //一开始的时候这个地方没有写win = 0;这样就出现了一个问题,就是,上次输入一个坐标循环的时候win已经有大于0的值,导致循环完的最终结果不能小于3for (x = 0; x < LINE; x++){for (y = 0; y < LIST;y++)if ('*' == PlayerBoard[x][y]){win++;	}}if (win <= 3){for (x = 0; x < LINE; x++){for (y = 0; y < LIST; y++)if ('*' == PlayerBoard[x][y]){PlayerBoard[x][y] = '#';}}printf("扫雷成功,你赢了!!!\n");return 0;}}}}
}int Counter(char UserBoard[LINE + 2][LIST + 2], char PlayerBoard[LINE][LIST], int x, int y)
{int num = 0;num = (UserBoard[x - 1][y - 1] - '0') +(UserBoard[x - 1][y] - '0') +(UserBoard[x - 1][y + 1] - '0') +(UserBoard[x][y - 1] - '0') +(UserBoard[x][y + 1] - '0') +(UserBoard[x + 1][y - 1] - '0') +(UserBoard[x + 1][y] - '0') +(UserBoard[x + 1][y + 1] - '0');if (0 == num){PlayerBoard[x - 1][y - 1] = '0';}else{PlayerBoard[x - 1][y - 1] = num + '0';}return num;
}int game(char UserBoard[LINE+2][LIST+2], char PlayerBoard[LINE][LIST])
{/*int x = 0, y = 0;int i = 0, j = 0;*///PrintBoard(PlayerBoard);MineLay(UserBoard);PrintBoard(PlayerBoard);//PrintUser(UserBoard);                           ///return  MineClear(UserBoard, PlayerBoard);return 0;
}void PrintUser(char UserBoard[LINE + 2][LIST + 2])
{int i = 0, j = 0;printf("   0 1 2 3 4 5 6 7 8 9 10\n");for (i = 0; i < LINE + 2; i++){printf("%2d ", i );for (j = 0; j < LIST + 2; j++){printf("%c ", UserBoard[i][j]);}printf("\n");}printf("\n");
}


测试函数文件

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<windows.h>
#include"mine.h"
//1.第一次扫雷,扫一大片2.玩家选择难度3.插标记void menu()
{printf("***********************\n");printf("******  1.play  *******\n");printf("******  0.exit  *******\n");printf("***********************\n");printf("请选择相应的数字>:");
}int main()
{char PlayerBoard[LINE][LIST];char UserBoard[LINE + 2][LIST + 2];int input = 1, a = 0;srand((unsigned int)time(NULL));while (input){memset(PlayerBoard, '*', sizeof(char)*LINE*LIST);memset(UserBoard, '0', sizeof(char)*(LINE+2)*(LIST+2));menu();scanf("%d", &input);printf("\n");switch (input){case 1:a = game(UserBoard, PlayerBoard);break;case 0:break;    //此处break的作用是结束switchdefault:printf("你的输入不符合要求,请重新输入>:"); break;}if (0 == input){break;      //此处break的作用是跳出while循环,即结束游戏}}printf("游戏结束,欢迎再次使用!!!\n");system("pause");return 0;
}



相关文章:

PHP的命令行脚本调用

1.使用PHP命令调用php脚本接受键盘输入然后输出 1 <?php 2 fwrite(STDOUT, "Please input your name:\t"); 3 $name trim(fgets(STDIN)); 4 fwrite(STDOUT, Hello . $name); 5 ?> 2.使用PHP命令调用php脚本并接受参数 1 <?php2 if($ar…

控制输入框只能输入数字

1.将input的属性type改为number 2.这时的输入框会有小箭头&#xff0c; 去掉小箭头的方法&#xff0c;给input添加样式 input::-webkit-outer-spin-button,input::-webkit-inner-spin-button { -webkit-appearance: none;}input[type"number"] { -moz-appearan…

main函数参数,在VS中向命令行添加参数的方法

问题描述 使用main函数的参数&#xff0c;实现一个整数计算器&#xff0c;程序可以接受三个参数&#xff0c;第一个参数“-a”选项执行加法&#xff0c;“-s”选项执行减法&#xff0c;“-m”选项执行乘法&#xff0c;“-d”选项执行除法&#xff0c;后面两个参数为操作数。 例…

2.monotouch 控件的使用

1.我们打开一个xib 右下角会看到如下图所示&#xff1a; 这一部分包含了界面和各种各样的控件。选取一个控件&#xff0c;使用鼠标拖动到界面上即可使用。 2.选中一个控件&#xff0c;该控件的相关信息会在右边进行显示。做出相关设置即可。 3.设置控件属性和绑定控件事件。 首…

python视频延迟严重_【Python】改善 VideoCapture 的影像延迟

许多的范例程序大多仅介绍该如何用 VideoCapture 撷取摄影机的画面&#xff0c;却没有充分说明其隐含的问题。以下示范一个最基本的影像撷取程序。# -*- coding: utf-8 -*-import cv2# ip camera 的撷取路径URL "rtsp://admin:admin192.168.1.1/video.h264"# 建立 V…

CentOS 6.0配置pptp ××× Client和Squid透明网关

目的&#xff1a; 构建一台单网卡Linux网关&#xff08;透明代理&#xff09;&#xff0c;该网关拨入某海外服务器&#xff0c;客户端设定该网关后&#xff0c;网络出口则为海外服务器&#xff0c;实现加速访问一些网站的目的。 环境信息&#xff1a; 硬件&#xff1a;DELL机器…

mysql汉字转拼音函数

-- 创建汉字拼音对照临时表 CREATE TABLE IF NOT EXISTS t_base_pinyin (pin_yin_ varchar(255) CHARACTER SET gbk NOT NULL,code_ int(11) NOT NULL,PRIMARY KEY (code_) ) ENGINEInnoDB DEFAULT CHARSETlatin1;-- 插入数据 INSERT INTO t_base_pinyin (pin_yin_,code_) VAL…

数据挖掘的一些经典算法

数据挖掘能做以下七种不同事情&#xff08;分析方法&#xff09;&#xff1a;数据挖掘能做以下七种不同事情 分类 &#xff08;Classification&#xff09; 估计&#xff08;Estimation&#xff09; 预测&#xff08;Prediction&#xff09; 相关性分组或关联规则&#xff08;…

python cx oracle安装_python3.6的安装及cx_oracle安装

一、创建所需目录mkdir -p /home/用户名/software/python3.6.1mkdir -p /home/用户名/priv/bydmkdir -p /home/用户名/priv/byd/src/pythonmkdir -p /home/用户名/priv/byd/org二、修改byd目录的权限cd /home/用户名/priv/llchmod 777 byd/ll三、将安装包放到byd中&#xff0c;…

opencv 无法找到tbb_debug.dll

本人环境&#xff1a;vs 2010 在opencv(你的opencv install 路径)\build\common\tbb\ia32\vc10下&#xff0c;将tbb.dll 拷贝一份&#xff0c;改名为tbb_debug.dll. 并将此路径加入到系统环境变量中即可。转载于:https://blog.51cto.com/danielllf/871369

【天命奇御】成就进度62/71的通关攻略(1·开篇前言)

天命奇御于2018.8.9号在wegame上发售 先是一周目记录&#xff1a; 可以说一周目是熟悉最终boss技能后&#xff0c;靠技术过的...... 然后是二周目记录&#xff1a; 开篇前言&#xff1a; 转载于:https://www.cnblogs.com/wuduojia/p/9494700.html

使用git上传代码到github

1. github上创建项目 github是一个服务器托管商&#xff0c;我们写好的代码可以上传到github上面去 登录github的官方网站&#xff1a;http://github.com/ 注册一个自己的用户 新建一个项目&#xff0c;我这里有我自己的一个github账号&#xff0c;我直接登录上去了&am…

gpg加密命令 linux_用 PGP 保护代码完整性(五):将子密钥移到一个硬件设备中 | Linux 中国...

在这个系列教程中&#xff0c;将为你提供使用 PGP 和保护你的私钥的最佳体验。-- Konstantin Ryabitsev致谢译自 | linux.com 作者 | Konstantin Ryabitsev译者 | LCTT / qhwdw在这个系列教程中&#xff0c;将为你提供使用 PGP 和保护你的私钥的最佳体验。在本系列教程中&#…

在Android使用XML文件控制按钮文字在各种状态下的颜色

最近在项目中遇到新的需求&#xff0c;就是在按钮在选按的时候需要将文字变为白色&#xff0c;但android默认的按钮颜色为黑色&#xff0c;之前也没有考虑过类似的问题。 通过doc文档&#xff0c;发现按钮文字的处理方式和背景的处理方式很相似&#xff0c;同样可以用一份selec…

人人网 6.0 版申请页面随着滚动条拖动背景图片滚动出现的原理

第一步是考虑静态实现。整个页面分成几大块&#xff0c;比如&#xff1a; <div class"section" id"topic-a"></div> <div class"section" id"topic-b"></div> <div class"section" id"topi…

Python内部类,内部类调用外部类属性,方法

一 Python中内部类 典型定义&#xff1a; class MyOuter:age18def __init__(self,name):self.namenameclass MyInner:def __init__(self,inner_name):self.inner_nameinner_nameoutMyOuter(lqz) innerout.MyInner(lqz_inner) print(inner.inner_name) 二 内部类调用外部类的类属…

POJ 2528 Mayor's posters(线段树)

题目大意 贴海报。每张海报的高度都是一样的&#xff0c;唯独宽度不一样。每张海报只能占用整数倍的单位线段长度&#xff0c;贴了 n(n<10000) 张海报之后&#xff0c;有几张能够看见&#xff08;有一个角能看见这张海报也算被看见了&#xff09;&#xff1f;海报的宽度最大…

xmind 模板_xmind模板打包下载

500套xmind模板【分类整合】好东西分享啦&#xff01;~百度网盘下载链接&#xff1a;https://pan.baidu.com/s/1pCf8aqM8R8m4U4oWZUfOUA提取码&#xff1a;xt1j 微云盘下载连接&#xff1a; https://share.weiyun.com/5c3vehsXMind中的思维导图结构包含一个中心根主题&#xff…

Pycharm的运行和简单调试

我这里已经简单的创建了一个文件&#xff0c;为了浅显易懂&#xff0c;这里程序写的比较简单 1. 运行程序 首先&#xff0c;找到编辑窗口上面有一个向下方向的灰色箭头&#xff0c;点击它 点击之后&#xff0c;选择第一个选项edit Configurations&#xff0c;然后在弹出…

为什么百度只收录我的网站首页?

在我们做SEO的时候&#xff0c;经常碰到一个常见的问题&#xff0c;百度只收录网站的首页或者是一夜之间网站的收录变成了只剩首页。出现这种情况的原因很多&#xff0c;我们需要去检查自己的问题&#xff0c;然后去解决&#xff0c;让自己的网站重新获得更多页面的收录&#x…

Python3.5 学习十二 数据库介绍

MYSQL介绍&#xff1a; 主流三种数据库&#xff1a;Oracle、Mysql、Sqlserver Mysql安装和启动&#xff1a; windows 1安装 2启动服务 3进入bin目录&#xff0c;打开命令行 4 mysqladmin -u root password ******* 设置密码 5 mysql -u root -p 使用密码登录 显示所有数据…

github上删除一个仓库

首先进入到你需要删除的仓库&#xff0c;在这个页面的左侧或者上部找到”settings”选项 点击进入”settings”&#xff0c;然后一直往下拉&#xff0c;直到看到一个红色的横条区域&#xff0c;下面有一个”Delet this respository”&#xff0c;点击删除即可

两个线程同时访问一个变量_百战程序员:Java多线程对象及变量的并发访问

在开发多线程程序时&#xff0c;如果每个多线程处理的事情都不一样&#xff0c;每个线程都互不相关&#xff0c;这样开发的过程就非常轻松。但是很多时候&#xff0c;多线程程序是需要同时访问同一个对象&#xff0c;或者变量的。这样&#xff0c;一个对象同时被多个线程访问&a…

AE 9.3代码 升级到AE10.0

下载的代码是AE 9.3&#xff0c;本机配置是AE 10.0 &#xff0c;程序打不开&#xff0c;运行不了&#xff0c;提示找不到ESRI.ArcGIS.Controls.AxMapCongrol等等AE 控件。 具体解决方法&#xff1a; &#xff08;1&#xff09; 在引用中&#xff0c;重新添加ArcGIS引用&#xf…

mysql数据库主从同步过程详述(三)

续mysql数据库主从同步过程详述(二)在此说明下:在最后试验过程中,当查看从库状态的时候,IO_Running显示为no,从error_log中看到如下报错提示:120523 0:55:31 [Note] Slave I/O thread: connected to master rep192.168.1.5:3306, replication started in log mysql-bin.0000…

[No0000160]常用C# 正则表达式大全

正则表达式的本质是使用一系列特殊字符模式&#xff0c;来表示某一类字符串。正则表达式无疑是处理文本最有力的工具&#xff0c;而.NET提供的Regex类实现了验证正则表达式的方法。Regex 类表示不可变&#xff08;只读&#xff09;的正则表达式。它还包含各种静态方法&#xff…

在VS中,如何新建项目,如何添加类库

学习了C#基础后就自己做了一个小小的qq空间&#xff0c;感觉挺好的。之后&#xff0c;由于团队需要被分配到测试方面去了&#xff0c;虽然测试时会看C#代码&#xff0c;但终究不是自己写的&#xff0c;没有那种深究的热情&#xff0c;尽管师兄说&#xff0c;看代码是最快提升的…

Python中requests包的安装

在使用pycharm开发的时候&#xff0c;我们经常需要导入一些包&#xff0c;但是这些包&#xff0c;我们事先并没有安装&#xff0c;一个显著的现象就是我们在pycharm中导入一个包时&#xff0c;系统提示不存在&#xff0c;那就是我们没有安装这个包。举一个例子&#xff0c;我在…

python fft库有哪些_Python图像处理库PIL中快速傅里叶变换FFT的实现(一)

离散傅里叶变换(discrete Fouriertransform)傅里叶分析方法是信号分析的最基本方法&#xff0c;傅里叶变换是傅里叶分析的核心&#xff0c;通过它把信号从时间域变换到频率域&#xff0c;进而研究信号的频谱结构和变化规律。FFT是一种DFT的高效算法&#xff0c;称为快速傅立叶变…

转: Android ListView 滑动背景为黑色的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 在Android中&#xff0c;ListView是最常用的一个控件&#xff0c;在做UI设计的时候&#xff0c;很多人希望能够改变一下它的背景&#xff0c;使他能够符合整体的UI设计&#xff0c;改变背景背很简单只需要准备一张图片然…