目录

前言

游戏实现

一、游戏的开始与退出的实现

二、初始化并打印雷区

三、在雷区中随机产生雷

四、玩家排雷

五、清除周围没有雷的坐标

代码汇总

一、game.h———函数的声明,头文件引用,标识符常量的定义

二、game.c———包含函数的实现

三、test.c———包含主函数与游戏实现


前言

扫雷曾是一个火遍大江南北的游戏,在国内上线后获得众多好评,但如今win10已不在自带扫雷游戏了,想玩怎么办?今天我将用c语言带你重温扫雷游戏!

游戏实现

一、游戏的开始与退出的实现

void meau()//菜单函数
{printf("*********************************\n");printf("******   1. play     ************\n");printf("*********************************\n");printf("******   0. exit     ************\n");printf("*********************************\n");}
int main()
{int input = 0;//输入选项的变量srand((unsigned int)time(NULL));//srand函数可以确定rand函数的随机值下限do{meau();//打印菜单printf("请输入选项>:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("游戏结束\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);//如果input输入的值为0,循环会停止return 0;
}

二、初始化并打印雷区

void InitBoard(char board[ROWS][COLS], int row, int col, char set)//第四个参数为期望把数组设置成的字符
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = set;}}
}
void PrintBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (j = 0; j <= row; j++)printf("%d ", j);printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}

三、在雷区中随机产生雷

void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//雷的数目while (count){int x = rand() % row + 1;//产生1到row的随机数int y = rand() % col + 1;//产生1到col的随机数if (mine[x][y] == '0')//如果该坐标没有被设置过地雷则将其设置为地雷{mine[x][y] = '1';//地雷用字符1来表示count--;}}
}

四、玩家排雷

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int win = 0;while (win < row*col - EASY_COUNT)//row*col - EASY_COUNT为需要有效扫雷的次数,每一次没扫到雷都会使win+1{int x = 0;int y = 0;printf("请输入排查的坐标>:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否合法{if (show[x][y] == '*')//判断坐标是否被扫过,防止重复扫相同位置导致win多加了{if (mine[x][y] == '1')//判断坐标在地雷数组里是否为雷{printf("GAME OVER\n");PrintBoard(mine, ROW, COL);break;}else{remove_NoMine(mine,show, x, y);//显示周围雷的个数PrintBoard(show, ROW, COL);win++;//每一次扫到的不是雷都会使win++}}elseprintf("该坐标已被排除,不能重复排除\n");}elseprintf("输入坐标非法,请重新输入\n");}if (win == row * col - EASY_COUNT)//当win++到等于要扫的次数时,则游戏胜利{printf("恭喜你扫雷成功\n");PrintBoard(show, ROW, COL);}
}

五、清除周围没有雷的坐标

char get_mine_count(char mine[ROWS][COLS], int x, int y)//求周围有多少雷的函数
{int i = 0;int j = 0;char count = 0;for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){//因为字符在内存中以ascii码的形式存储,所以如果周围有雷则可以用字符1减去字符0,得到ascii码值为1//然后将这些ascii码相加得到一个值count += mine[x + i][y + j] - '0';}}return count;//返回这个值
}
//链式反应,如果输入坐标周围没有雷,则清除该坐标
void remove_NoMine(char mine[ROWS][COLS],char show[ROWS][COLS], int x, int y)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//判断坐标是否合法{int i = 0;int j = 0;show[x][y] = get_mine_count(mine, x, y) + '0';//将展示的数组里坐标更改为周围雷的个数if (show[x][y] == '0'){show[x][y] = ' ';//如果周围雷的个数为0,则设置此坐标为“空格”//判断此坐标周围坐标是否还有可设为空格的坐标 for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){if (show[x+i][y+j] == '*')remove_NoMine(mine, show, x + i, y + j);//递归}}}}
}

代码汇总

一、game.h———函数的声明,头文件引用,标识符常量的定义

#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9//二维数组显示出来的行数
#define COL 9//二维数组显示出来的列数#define ROWS ROW+2//二维数组的行数
#define COLS COL+2//二维数组的列数#define EASY_COUNT 10//雷的个数void InitBoard(char board[ROWS][COLS], int row, int col, char set);//初始化两个二维数组void PrintBoard(char board[ROWS][COLS], int row, int col);//打印数组void SetMine(char mine[ROWS][COLS], int row, int col);//放置雷char get_mine_count(char mine[ROWS][COLS], int x, int y);//获取一个坐标周围雷的个数void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//玩家找雷void remove_NoMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);//链式反应,如果输入坐标周围没有雷,则清除该坐标

二、game.c———包含函数的实现

#include "game.h"void InitBoard(char board[ROWS][COLS], int row, int col, char set)//第四个参数为期望把数组设置成的字符
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = set;}}
}
void PrintBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (j = 0; j <= row; j++)printf("%d ", j);printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//雷的数目while (count){int x = rand() % row + 1;//产生1到row的随机数int y = rand() % col + 1;//产生1到col的随机数if (mine[x][y] == '0')//如果该坐标没有被设置过地雷则将其设置为地雷{mine[x][y] = '1';//地雷用字符1来表示count--;}}
}
char get_mine_count(char mine[ROWS][COLS], int x, int y)//求周围有多少雷的函数
{int i = 0;int j = 0;char count = 0;for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){//因为字符在内存中以ascii码的形式存储,所以如果周围有雷则可以用字符1减去字符0,得到ascii码值为1//然后将这些ascii码相加得到一个值count += mine[x + i][y + j] - '0';}}return count;//返回这个值
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int win = 0;while (win < row*col - EASY_COUNT)//row*col - EASY_COUNT为需要有效扫雷的次数,每一次没扫到雷都会使win+1{int x = 0;int y = 0;printf("请输入排查的坐标>:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否合法{if (show[x][y] == '*')//判断坐标是否被扫过,防止重复扫相同位置导致win多加了{if (mine[x][y] == '1')//判断坐标在地雷数组里是否为雷{printf("GAME OVER\n");PrintBoard(mine, ROW, COL);break;}else{remove_NoMine(mine,show, x, y);//显示周围雷的个数PrintBoard(show, ROW, COL);win++;//每一次扫到的不是雷都会使win++}}elseprintf("该坐标已被排除,不能重复排除\n");}elseprintf("输入坐标非法,请重新输入\n");}if (win == row * col - EASY_COUNT)//当win++到等于要扫的次数时,则游戏胜利{printf("恭喜你扫雷成功\n");PrintBoard(show, ROW, COL);}
}
//链式反应,如果输入坐标周围没有雷,则清除该坐标
void remove_NoMine(char mine[ROWS][COLS],char show[ROWS][COLS], int x, int y)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//判断坐标是否合法{int i = 0;int j = 0;show[x][y] = get_mine_count(mine, x, y) + '0';//将展示的数组里坐标更改为周围雷的个数if (show[x][y] == '0'){show[x][y] = ' ';//如果周围雷的个数为0,则设置此坐标为“空格”//判断此坐标周围坐标是否还有可设为空格的坐标 for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){if (show[x+i][y+j] == '*')remove_NoMine(mine, show, x + i, y + j);//递归}}}}
}

三、test.c———包含主函数与游戏实现

#include "game.h"
void meau()//菜单函数
{printf("*********************************\n");printf("******   1. play     ************\n");printf("*********************************\n");printf("******   0. exit     ************\n");printf("*********************************\n");}
void game()
{char mine[ROWS][COLS] = { 0 };//地雷数组char show[ROWS][COLS] = { 0 };//展示时的数组InitBoard(mine, ROWS, COLS,'0');//地雷数组初始化为字符0InitBoard(show, ROWS, COLS, '*');//展示时的数组初始化为字符*SetMine(mine, ROW, COL);//放置雷到地雷数组printf("--------扫雷-----------\n");PrintBoard(show, ROW, COL);FindMine(mine,show, ROW, COL);//玩家找雷
}
int main()
{int input = 0;//输入选项的变量srand((unsigned int)time(NULL));//srand函数可以确定rand函数的随机值下限do{meau();//打印菜单printf("请输入选项>:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("游戏结束\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);//如果input输入的值为0,循环会停止return 0;
}

win10不自带扫雷,想玩扫雷怎么办?自己造一个扫雷相关推荐

  1. “蚂蚁牙黑”太火,想玩就用ModelArts做一个!

    摘要:本文将介绍如何借力一站式 AI 开发平台,"傻瓜式"操作实现生成"蚂蚁牙黑"小视频. 作者:华为云EI专家胡琦 一夜之间,朋友圈都在"蚂蚁牙黑& ...

  2. 怎样才能让学生用计算机玩游戏,让孩子通过游戏就能了解电脑的计算原理!大人看了都想玩...

    原标题:让孩子通过游戏就能了解电脑的计算原理!大人看了都想玩 "它看起来是一个超级有趣的教育游戏,也许有一天当所有电脑都关闭时,你也可以用它来管理图书,这很可能会发生.. 众所周知,让儿童过 ...

  3. 如何用计算机玩扫雷,扫雷怎么玩_玩好扫雷游戏的技巧是什么【图文】-太平洋电脑网PConline-太平洋电脑网...

    扫雷怎么玩,扫雷技巧是什么,如何玩好扫雷游戏?这三大疑问一直是Win7扫雷游戏爱好者最想弄明白的.扫雷是每台电脑上都会自带的游戏,这款游戏虽然简单,但是却会吸引很多人去玩,但是看着一个一个的方格,却不 ...

  4. 一个扫雷小游戏带你初识VUE3和typescript

    一个扫雷小游戏带你初识VUE3和typescript 阅读本文你会了解到: vue3的部分新特性 typescript的基本使用 部分es6语法 基础部分 为什么要使用ref和reactive来声明变 ...

  5. 利用win10笔记本自带Camera玩人脸识别

    利用win10笔记本自带Camera玩人脸识别 1.安装Python 2.安装opencv-python 附:彻底更换软件源的办法 3.修改及运行test3.py文件 4.test3.py文件,xml ...

  6. # 利用Win10自带功能,玩转系统备份恢复 -- 系统备份

    利用Win10自带功能,玩转系统备份&恢复 – 系统备份 不知不觉,Windows 10系统已经进入秋季创意者更新版本(1709)了, 之前类似一键还原精灵之类的软件,对win10及SSD硬盘 ...

  7. 一个计算机爱好者的不完整回忆(十五)自带游戏你玩过么?

    Windows自带的小游戏小软件你们都玩过么? Windows捆绑的最古老的程序是啥我不知道,我知道的是纸牌游戏,知道windows做这个游戏干什么么?是为了让大家练习鼠标操作的,你会用到拖动.双击等 ...

  8. 如何开发一个扫雷小游戏?

    如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...

  9. Xbox Game Bar 实时显示帧数方法| Win10开启自带FPS显示

    对于喜欢玩游戏的win10系统用户来说,Xbox Game Bar应该不陌生,同时这个功能里面还有一项实时帧率(FPS)工具.但是有些用户打开的时候,这项功能反而显示不出来.由于权限的缘故,首次使用往 ...

  10. 点击空白处遮罩层关闭_如何手动关闭win10系统自带的windows defender

    windows defender简称WD,是win10系统自带的一款杀毒软件,也是微软的"亲儿子",从win8开始,微软就对这个"亲儿子"狠下功夫,争取让它早日 ...

最新文章

  1. io获取 pcl_点云数据可视化之PCL滤波学习
  2. Android多线程:这是一份全面 详细的线程池(ThreadPool)讲解教程
  3. 帝国cms微信小程序多语言相亲交友制作记录难点使用的小程序组件分析
  4. gets scanf以及缓冲区域的问题
  5. Python中字符串切片详解
  6. 轨迹预测演变(第1/2部分)
  7. Codeforces Round #614 (Div. 2) D. Aroma‘s Search 暴力 + 思维
  8. Django中使用Pagination的分页范例源码
  9. windows2003安全设置
  10. 怎么利用linux来操作手机,Linux_在Linux操作系统下操作蓝牙手机的方法,所谓操作,到现在只是通过蓝 - phpStudy...
  11. JavaScript之判断用户登录信息
  12. Retrofit2源码分析(一)
  13. 零基础带你学习MySQL—创建数据库(一)
  14. 字节跳动武汉招聘 2000 人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划...
  15. 替代YY语音,自行搭建语音实时服务器
  16. 用户画像第四章(企业级360°用户画像_标签开发_挖掘标签_用户购物性别模型-USG)
  17. 常用cdn jq layui
  18. 2018.12.31 NOIP训练 czy的后宫6(线性dp)
  19. flex的常用用法二十条
  20. matlab 径向偏振光,一种产生椭圆形径向偏振光束的涡旋半波片及系统的制作方法...

热门文章

  1. 米思齐 Mixly 解决函数模块无法上下连接。
  2. IT大学生成长周报 | 第 1 期
  3. 浅谈国内软件信息化项目项目立项管理办法
  4. java开源cad_.Net开源项目(包含CAD支持)
  5. DTCloud 报表开发
  6. chrome浏览器插件安装步骤
  7. python日历模块_日历模块---calendar
  8. iOS开发实例 | Demo:数独小游戏
  9. Android车牌识别sdk开发包,【车牌识别SDK 车牌识别SDK开发包 车牌识别系统】 - 太平洋安防网...
  10. 达梦单机搭建及简单使用