扫雷

一、问题前述。
二、基本流程。
三、具体步骤。
1.创建菜单。
2.创建地图。
3.初始化地图。
4.打印地图。
5.玩家输入坐标进行翻开。
6.判断是否踩到地雷。
7.更新地图。
8.判定胜负。
四、实现代码。

一、问题前述。

手机偶遇许久未见的扫雷,就用C语言实现一下简易版扫雷。

二、基本流程。

1.创建菜单界面。
2.创建地图 (两个地图,一个玩家可见地图,一个地雷分布图)。
3.初始化地图(随机分布地雷在地图上)。
4.打印地图。
5.程序读取玩家输入的要翻开位置的坐标,并校验。
6.如果不是地雷,统计当前位置周围雷的个数, 并显示到地图上.。
7.判定游戏是否胜利。

三、具体步骤。

1.创建菜单。

int menu() {printf("················\n");printf("················\n");printf("·····1.开始游戏······\n");printf("·····0.退出游戏······\n");printf("················\n");printf("················\n");int choice = 0;printf("请选择\n");scanf("%d", &choice);return choice;
}

2.创建地图。

我们需要两张地图,所以需要创建两个二维数组。
第一个二维数组,表示玩家看到的地图。(show)
第二个二维数组,表示当前位置是不是地雷(1表示是地雷,0表示不是地雷)。(mine)

此处使用宏定义:
目的是
1.推高代码可读性,后续代码中遇到9,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。

#define MAX_ROW 9
#define MAX_COL 9
char show[MAX_ROW][MAX_COL] = { 0 };char mine[MAX_ROW][MAX_COL] = { 0 };

3.初始化地图。

用 ‘*’ 表示未翻开的地方。
show刚开始全是 * 。
mine由0,1组成。0表示此处没地雷,1表示此处是地雷。
电脑随机生成地雷。此处地雷使用宏定义,方便更改和表示。

#define MINE_COUNT 10
void init(char show[MAX_ROW][MAX_COL],char mine[MAX_ROW][MAX_COL]) {for (int row = 0; row < MAX_ROW; row++) {for (int col = 0; col < MAX_COL; col++) {show[row][col] = '*';//初始化为0,之后随机生成1.mine[row][col] = '0';}}//使用当前时间作为随机种子。srand((unsigned int)time(0));int n = MINE_COUNT;while (n > 0) {//生成随机地雷。int row = rand() % MAX_ROW;int col = rand() % MAX_COL;if (mine[row][col] == '1') {continue;}mine[row][col] = '1';n--;}
}

4.打印地图。

void print(char themap[MAX_ROW][MAX_COL]) {printf("+---+---+---+---+---+---+---+---+---+\n");for (int row = 0; row < MAX_ROW; row++) {printf("|");for (int col = 0; col < MAX_COL; col++) {printf(" %c |", themap[row][col]);}printf("\n+---+---+---+---+---+---+---+---+---+\n");}

看看简易地图效果

5.玩家输入坐标进行翻开。

玩家通过输入坐标翻开地图土地。

注意:
1.坐标要输入在地图有效范围内,错误提示玩家重新输入。
2.不能翻开已经翻开的地方。

int row = 0;int col = 0;printf("请输入要翻开的坐标\n");scanf("%d %d", &row, &col);//print(show);if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {printf("您输入的坐标有误,请重新输入\n");continue;}if (show[row][col] != '*') {printf("坐标已翻开,请重新输入.\n");continue;}

6.判断是否踩到地雷。

如果翻开的位置在mine上显示为1,那么翻到地雷了,输出被炸死,打印地雷地图,让玩家死得明白。
如果翻开的位置上在mine上不是1,那么继续下一次翻开操作。

if (mine[row][col] == '1') {printf("您已阵亡,游戏结束,再见。\n");print(mine);printf("\n");break;}

7.更新地图。

//根据row,col坐标位置显示九宫格内雷数。
//更新显示在show地图中
void update(char show[MAX_ROW][MAX_COL],char mine[MAX_ROW][MAX_COL],int row,int col) {int count = 0;for (int r = row - 1; r <= row + 1; r++) {for (int c = col - 1; c <= col + 1; c++) {if (r < 0 || r >= MAX_ROW || c < 0 || c >= MAX_COL) {continue;}if (r == row && c == col) {continue;}if (mine[r][c] == '1') {count++;}}}//此时 count 里面就已经存好了 row, col 周围 八个格子 的雷的个数// 把这个结果写到 show 中即可. // 需要把数字 count 转成对应的字符show[row][col] = '0' + count;
}

8.判定胜负。

定义一个变量,表示已翻开的土地,每次更新。当翻开数等于土地数减去地雷数。表示胜利。

int opened = 0;
update(show, mine, row, col);opened++;if (opened == MAX_ROW * MAX_COL - MINE_COUNT) {printf("已排除所有雷.\n");print(mine);break;}

四、实现代码。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10int menu() {printf("················\n");printf("················\n");printf("·····1.开始游戏······\n");printf("·····0.退出游戏······\n");printf("················\n");printf("················\n");int choice = 0;printf("请选择\n");scanf("%d", &choice);return choice;
}void init(char show[MAX_ROW][MAX_COL],char mine[MAX_ROW][MAX_COL]) {for (int row = 0; row < MAX_ROW; row++) {for (int col = 0; col < MAX_COL; col++) {show[row][col] = '*';mine[row][col] = '0';}}srand((unsigned int)time(0));int n = MINE_COUNT;while (n > 0) {int row = rand() % MAX_ROW;int col = rand() % MAX_COL;if (mine[row][col] == '1') {continue;}mine[row][col] = '1';n--;}
}void print(char themap[MAX_ROW][MAX_COL]) {printf("+---+---+---+---+---+---+---+---+---+\n");for (int row = 0; row < MAX_ROW; row++) {printf("|");for (int col = 0; col < MAX_COL; col++) {printf(" %c |", themap[row][col]);}printf("\n+---+---+---+---+---+---+---+---+---+\n");}
}//根据row,col坐标位置显示九宫格内雷数。
//更新显示在show地图中
void update(char show[MAX_ROW][MAX_COL],char mine[MAX_ROW][MAX_COL],int row,int col) {int count = 0;for (int r = row - 1; r <= row + 1; r++) {for (int c = col - 1; c <= col + 1; c++) {if (r < 0 || r >= MAX_ROW || c < 0 || c >= MAX_COL) {continue;}if (r == row && c == col) {continue;}if (mine[r][c] == '1') {count++;}}}
//此时 count 里面就已经存好了 row, col 周围 八个格子 的雷的个数
// 把这个结果写到 show 中即可.
// 需要把数字 count 转成对应的字符show[row][col] = '0' + count;
}void game() {char show[MAX_ROW][MAX_COL] = { 0 };char mine[MAX_ROW][MAX_COL] = { 0 };init(show, mine);int opened = 0;while (1) {system("cls");print(show);int row = 0;int col = 0;printf("请输入要翻开的坐标\n");scanf("%d %d", &row, &col);if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {printf("您输入的坐标有误,请重新输入\n");continue;}if (show[row][col] != '*') {printf("坐标已翻开,请重新输入.\n");continue;}if (mine[row][col] == '1') {printf("您已阵亡,游戏结束,再见。\n");print(mine);printf("\n");break;}update(show, mine, row, col);opened++;if (opened == MAX_ROW * MAX_COL - MINE_COUNT) {printf("已排除所有雷.\n");print(mine);break;}}
}int main() {while (1) {int choice = menu();if (choice == 1) {game();}else if (choice == 0) {printf("已退出,再见\n");break;}else {printf("请重新输入您的选择\n");continue;}}system("pause");return 0;
}

扫雷(C语言实现简易版)相关推荐

  1. c语言小游戏 精简_C语言开发简易版扫雷小游戏

    C 语言开发简易版扫雷小游戏 本文给大家分享的是一个使用 C 语言开发的命令行下的简易版扫雷小游戏, 本身没有什么太 多的技术含量, 只不过是笔者的处女作, 所以还是推荐给大家, 希望对大家学习 C ...

  2. busybox的实现原理分析(C语言实现简易版的busybox)

    1.linux中实现命令的两种方式 1.1.命令都是单独的可执行程序 aston:~$ ls -l /bin/ls -rwxr-xr-x 1 root root 138208 2鏈 8 2022 /b ...

  3. Java 语言实现简易版扫码登录

    基本介绍 相信大家对二维码都不陌生,生活中到处充斥着扫码登录的场景,如登录网页版微信.支付宝等.最近学习了一下扫码登录的原理,感觉蛮有趣的,于是自己实现了一个简易版扫码登录的 Demo,以此记录一下学 ...

  4. 【C语言】简易版扫雷游戏(play game)

    目录 扫雷游戏

  5. C语言实现简易版的扫雷游戏

    目录 在正式讲内容之前先说一说扫雷游戏的规则 首先看一下test.c: 接下来是game.h: 接下来是game.c: 在正式讲内容之前先说一说扫雷游戏的规则 游戏规则很简单,点击方格,如果是地雷,游 ...

  6. C实现扫雷小游戏(简易版)

    你知道,有些鸟儿是注定不会被关在牢笼里的,它们的每一片羽毛都闪耀着自由的光辉.--<肖申克的救赎> 目录 1.设计框架 2.设计流程 2.1菜单 2.2初始化雷阵 2.3生成雷 2.4玩家 ...

  7. c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏

    本文实例为大家共享了C语言实现三子棋游戏的详细代码,供大家参考,详细内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与 ...

  8. 扫雷小游戏(简易版)

    写个小游戏娱乐娱乐! 目录:1.简要分析            2.实现扫雷游戏细节             3.总代码 1.简要分析 一般写这种小游戏要分为两个模块:头文件,源文件.头文件中声明各种 ...

  9. 用JavaScript语言制作简易版轮播图

    //代码示例如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  10. 【C语言】简易版_飞机小游戏

    目录 前言 正文 一.利用scanf控制飞机移动 二.getch控制飞机移动 三.显示复杂的飞机图案 四.发射激光 五.打靶练习 写在最后 前言 在前面弹跳小球 的基础上实现一个简单的飞机游戏,主要包 ...

最新文章

  1. arduino蓝牙通讯代码_「Arduino」OLED屏使用教程,显示内容听谁的?我不管,听我的...
  2. php设置404返回302,java - 服务器访问应用返回302或者404状态码
  3. Navicat 创建mysql事件
  4. 公链史记 | 从鸿蒙初辟到万物生长的十年激荡
  5. 开源日志系统log4cplus(三)
  6. mysql8.0数据回滚_大企业数据库服务首选!AliSQL这几大企业级功能你不可不知
  7. 未能创建可接受的游标。
  8. BZOJ 5277 IQ题orz
  9. 信息论实验-信源编码算法 (Huffman and Shannonn Fano编码C++实现)
  10. 免费股票数据接口api接口应该如何区分?
  11. 如何利用Tempo BI大数据分析工具快速完成数据同环比分析?
  12. littleVGL开发:littleVGL的介绍
  13. 读书笔记-项目计划、进度与控制
  14. Pygame:外星人入侵
  15. 微信公众平台搜索文章会调用搜狗百科内容?
  16. 炉石传说 历代无面斩杀宇宙龙术
  17. 【Docker】Docker安装
  18. YesPlayMusic 0.4.0中文版:一款mac用户必备的网易云音乐客户端
  19. go 拉取仓库依赖报错:fatal: could not read Username for ‘https://code.byted.org‘: terminal prompts disabled
  20. postgresql 数据库 alter table alter column set default 的一些实践

热门文章

  1. 软件工程 -- RUB,极限编程
  2. Java 《Java 简明教程》实验报告
  3. CAS:1799316-64-5 CIN16645 阳离子脂质
  4. Cocos2d-x2.0 粒子系统深入分析三部曲(一)
  5. 感性认识和理性认识的辩证关系
  6. C# AE开发,加载sxd文件显示不了
  7. JNI ERROR (app bug): local reference table overflow (max=512)
  8. c语言爬取网页视频,爬取豆瓣信息(2)
  9. 一起深入读懂Mahony互补滤波器
  10. PADS layout 移动元件时走线不跟着拉长