test.c 扫雷游戏的测试逻辑

game.h游戏函数的声明

game.c游戏函数的实现

1.菜单

与之前的三子棋游戏一样先打印一个菜单,选择玩还是不玩

还是与先前的三子棋一样,写一步测试一步

2.创建棋盘

创建两个二维数组

  • 用于排查雷的信息(假如点开一个显示位1,说明周围八个坐标有一个雷)(show)
  • 用于存放10个雷(mine)

但是会发现如果要排查靠边上的地方,会发生数组越界访问,所以我们要比我们要展示的棋盘多两行两列才不会发生数组越界访问

故创建两个11*11的二维数组

有雷的地方--->显示1,没雷的地方--->显示0

mine数组初始化 ' 0 ',布置雷的时候,改为 ‘ 1 ’

show数组初始化 ‘ * ’ ,排查雷后,具体位置改为对应的数字字符

虽然我们创建11*11的二维数组,但是我们只用中间9*9的二维数组

为什么不用其他的字符表示?

假设用 * 表示没有雷的地方,# 表示有雷的地方

这时只需要要一个二维数组即可

第一,当打印的时候需要判断一下是否是雷,能不能打印,如果是雷怎么打印,如果不是雷,又怎么打印,相对0和1来说比较麻烦,如果把雷的坐标暴露,就不能玩游戏了

第二,不便于统计周围雷的个数(用1和0表示,将周围坐标相加便可得到雷个数)

3.打印棋盘

打印棋盘的时候我们最好展示一下行号和列号,这样方便观察,并且打印棋盘是给用户展示,所以打印的9*9的棋盘

打印两个二维数组,只是为例观察我们打印的对不对,我们不能把雷的信息告诉玩家,我们要给玩家展示show数组,所以不展示mine数组

4.布置雷

雷只布置在中间9*9的格子里

因为这个二维数组是11*11,但是我们又只用9*9,所以在布置雷的过程中,下标是从1开始,下标的范围是1-9

  • 1.布置雷的个数

布置成功一个count--,并且随机生成坐标

  • 2.排雷

无论是布置雷还是排雷都是在中间9*9的格子中进行的

3.游戏结束

  • 1)10个雷都排查完(9*9的格子中有71个非雷的位置),把这71非雷的位置找出来,排雷成功
  • 2)踩雷,也结束

注意:当坐标重复排查时,win也会++,所以要判断一下,这个坐标表是否被排查过

整体代码的实现:

test.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{printf("************************\n");printf("*****    1.play   ******\n");printf("*****    0.exit   ******\n");printf("************************\n");}
void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化数组//mine数组用于放雷的信息。初始化‘0’//show数组用于给玩家展示,初始化‘*’init_board(mine, ROWS, COLS, '0');init_board(show, ROWS, COLS, '*');//打印棋盘//display_board(mine, ROW, COL);display_board(show, ROW, COL);//这里打印数组是为了检查我们初始化对不对,,我们想要给玩家玩,不能把雷怎么布置告诉玩家//所以我们只要打印show数组即可//布置雷(布置好雷,才能排雷)//随机布置雷//给mine数组布置雷//并且只在中间9*9的格子中布置雷set_mine(mine, ROW,COL);//display_board(mine, ROW, COL);//排雷find_mine(mine, show, ROW, COL);//在mine数组中查找,然后把雷的信息放到show数组中}
int main()
{int input = 0;srand((unsigned int)time(NULL));do {menu();printf("请玩家选择:>\n");scanf("%d", &input);switch (input){case 1:game(); break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择:>\n");break;}} while (input);
}

game.h

#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define EASY_COUNT 10//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col);//布置雷
void set_mine(char board[ROWS][COLS], int row, int col);//排雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void init_board(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}
void display_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;//打印列号for (j = 0; j <= col; 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 set_mine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return(mine[x - 1][y - 1] +mine[x - 1][y + 1] +mine[x-1][y]+mine[x][y - 1] + mine[x][y + 1] +mine[x + 1][y - 1] +mine[x + 1][y + 1] +mine[x+1][y]- 8 * '0');
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col-EASY_COUNT){printf("请输入要排查的坐标:>");scanf("%d %d", &x, &y);if (show[x][y] == '*'){if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] == '1'){printf("很遗憾,你被炸死了\n");display_board(show, ROWS, COLS);break;}else{int count = get_mine_count(mine, x, y);//统计mine在(x,y)的周围有多少个雷show[x][y] = count + '0';display_board(show, ROW, COL);//每次排完雷都需要打印一下,告知玩家排的对不对,并告知周围有几个雷win++;}}else{printf("坐标非法,请重新输入坐标\n");}}else{printf("坐标已经被排查过了,请重新输入:\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");display_board(mine, ROW, COL);}
}

扫雷游戏(基础版本)相关推荐

  1. 小心踩雷!手把手教你制作扫雷游戏简单版本

    扫雷游戏----C语言必写游戏之一 扫雷游戏 背景 起源与玩法 基本实现思路 涉及语言的主要内容 具体实现步骤 1.基本框架 2.菜单页面的实现 3.初始化棋盘 4.在屏幕中显示棋盘 5.布置好棋盘中 ...

  2. 帮我写一个网页扫雷游戏基本的版本

    好的,我来帮你写一个基本版本的网页扫雷游戏. 首先,你需要熟悉 HTML.CSS 和 JavaScript 等前端技术,并了解二维数组.循环.判断语句等编程基础知识. 以下是简单的代码实现: HTML ...

  3. 【C语言基础学习---扫雷游戏】(包含普通版+递归炼狱版)

    游戏背景介绍 扫雷游戏是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 扫雷在科技历史上也扮演了相似的角 ...

  4. C/C++基础讲解(九十一)之游戏篇(模拟扫雷游戏)

    C/C++基础讲解(九十一)之游戏篇(模拟扫雷游戏) 程序之美 前言 很多时候,特别是刚步入大学的学子们,对于刚刚开展的计算机课程基本上是一团迷雾,想要弄明白其中的奥秘,真的要花费一些功夫,我和大家一 ...

  5. (初阶版本)扫雷游戏(C语言)娱乐教程

    预祝梅西第七座金球!!!!!!你们说会是梅老七吗? 1.游戏分成三部分来写 game.c里面进行实现函数 game.h声明函数头文件宏定义等 test.c写程序的主体部分 2.实现效果展示 3.全部代 ...

  6. 【Pygame小游戏】扫雷游戏50多岁了,但这款我能玩一年~(三个版本集合)

    前言 哈喽,我是栗子吖--爬虫的内容我又放一段时间了! (很多版权问题文章发不了,感觉有点儿白写了,呜呜呜呜.......) 还是给大家研究研究其他的吧,能发的爬虫内容我尽量修改修改再修改争取一次过! ...

  7. 扫雷游戏(利用最基础的C语言实现)

    扫雷 扫雷游戏 1.菜单 2.初始化棋盘 3.打印棋盘 4.布置雷 5.排查雷 6.整体效果展示 7.代码分享 7.1 test.c 7.2 game.c 7.3 game.h 扫雷游戏 今天我们就要 ...

  8. c语言游戏 人物素材,代码女神编写的C语言版本扫雷游戏,场面失控,速来围观...

    前言: <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输.扫雷在科技历史上也扮演了相似 ...

  9. [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向

    从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...

最新文章

  1. 创建OPPM的12个步骤
  2. Ubuntu上安装TensorFlow(python2.7版)
  3. SEO | 重新认识一下Meta标签
  4. Linux 命令之 typeset -- 声明 shell 变量,设置变量的属性
  5. .12-浅析webpack源码之NodeWatchFileSystem模块总览
  6. WordPress更改“固定链接”后 页面404原因及解决方法(Nginx版)
  7. Oracle索引树的结构
  8. javascript里的几种常见的数组方法
  9. Netty服务器无限循环给客户端发送数据
  10. educoder MongoDB 文档的高级查询操作
  11. Microsoft SQL Server 2000 索引碎片整理最佳实践(上)
  12. php 使用redis队列简单实用
  13. 系统辨识与自适应控制
  14. pano2vr导出html看不,【答疑】pano2vr6导出的全景,是空白的,打不开,? - 视频教程线上学...
  15. [NOI Online 2021 入门组] 切蛋糕
  16. 成人世界的人际交往中有哪些潜规则?
  17. RSA创新沙盒盘点|BastionZero——零信任基础设施访问服务
  18. 【100个 Unity实用技能】☀️ | Unity中 检查当前设备网络状态 的几种方法整理
  19. 【ThreadX全家桶】GuiX移植之DMA2D
  20. MYSQL查询选修三门以上课程_SQL高级查询的练习题

热门文章

  1. 第4周编程题在线测试
  2. MySQL高性能索引设计
  3. 计算机组装要哪些硬件,电脑配件,小编教你电脑组装需要哪些配件
  4. 正常卸载Microsoft Office后无法重新安装?
  5. 微信公众号网页授权--前端获取code及用户信息(vue)【简单详细版】
  6. PyQt5,一个好的qt教程。
  7. colorFormat颜色转换插件
  8. Fiddler+雷电模拟器进行APP抓包
  9. three good things
  10. 吉度盘点机PDA盘点生成的条码和数量导入库存Excel表