<>扫雷小游戏

*
首先我我们分析一下扫雷的玩法,点中格子,有炸弹游戏结束,没有炸弹需要提示这个格子的四周一圈又多少个雷,并且把这个数字写在格子里。最后排出所有雷,游戏胜利。
需要创建的文件有
test.c : 用来书写主函数和开始的选择菜单部分
game.c:函数的实现放在此处
game.h :函数的声明和需要引用的头文件
<>游戏实现思路

*
创建两个二维数组,来模拟两个棋盘,第一个mine棋盘11x11是没有炸弹的。之所以是11x11我们是希望未来在计算炸弹个数的,不会越界,因为展现的棋盘的规模是9x9

* 第二个show棋盘是用来存放炸弹的,随机的存放10个炸弹,并且它将来是需要打印给玩家看的。

*
接下来玩家需要排查炸弹,排查炸弹是需要统计格子周围的炸弹数目,如果有炸弹炸死,游戏结束。如果没有炸弹,需要得到周围炸弹的个数并且将它打印在show的棋盘中展现给用户。
<>具体实现代码

test.c文件
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "game.h" void
menu() { printf(" ******* 1开始游戏 **********\n"); printf(" ******* 0退出游戏
**********\n\n"); } void game() { //创建存储雷的两个数组 char mine[ROWS][COLS] = { 0 };
//布置雷的棋盘 char show[ROWS][COLS] = { 0 }; // 排查后显示雷的棋盘 //初始化两个棋盘的函数 InitBoard(mine
,ROWS,COLS,'0'); InitBoard(show, ROWS, COLS, '*'); //打印棋盘看看
//DisplayBoard(mine, ROW, COL ); //DisplayBoard(show, ROW, COL); //放置炸弹 SetMine(
mine, ROW, COL); //DisplayBoard(mine, ROW, COL); //打印看看炸弹 DisplayBoard(show ,ROW
, COL); //排查炸弹 FindMine(mine,show, ROW, COL); } void test () { int input = 0;
srand((unsigned int)time(NULL)); //得到一个随机数 后面放置炸弹需要 do { menu(); printf("请选择:");
scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf(
"退出游戏"); printf("\n"); break; default: system("cls"); break; } } while (input);
} int main() { test(); }
game.h文件
#define _CRT_SECURE_NO_WARNINGS 1 #define ROW 9 //期望棋盘规模 目前是9x9 #define COL 9 #
define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 //放置炸弹的个数 目前是10个 #
include <stdio.h> #include<time.h> #include <stdlib.h> void InitBoard(char board
[ROWS][COLS], int rows, int cols,char set); //初始化棋盘 void DisplayBoard(char board
[ROWS][COLS], int row, int col); // 打印棋盘 void SetMine(char mine[ROWS][COLS], int
row, int col); //放置炸弹 void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS]
,int row,int col); // 排除炸弹
game.c文件
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void InitBoard(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
DisplayBoard(char board[ROWS][COLS], int row, int col) //传的是11的棋盘,但是只打印99棋盘 {
int i = 0; int j = 0; for (i = 0; i <= col; i++) //打印棋盘的横坐标 方便查看 { printf("%d ",
i); } 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
-9坐标 int y = rand() % col + 1; if (mine[x][y] == '0')//放置炸弹到 { mine[x][y] = '1';
count--; } } } int GetMineCount(char mine[ROWS][COLS], int x, int y)//统计周围炸弹个数
{ return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y -
1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] -
8 * '0'); //一开始炸弹是字符数字 字符数字 减去字符零 才是数字 } void FindMine(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 (x >= 1 && x <= row && y >= 1 && y <= col) { if
(mine[x][y] == '1') //放'1'的位置代表炸弹 { printf("噼里啪啦,被炸倒了,游戏结束\n"); DisplayBoard(
mine, row, col); break; } else { int count = GetMineCount(mine, x, y);
//统计雷的个数环绕一圈 show[x][y] = count + '0'; //数字加字符零 = 字符数字 将雷的个数存在show棋盘中 system(
"cls"); DisplayBoard(show, row, col); //排一次雷 打印一次结果 win++; //统计排雷次数 } } else {
printf("输入坐标有误,请重新输入!\n"); } } if (win == row * col - EASY_COUNT) //游戏结束的条件 {
printf("恭喜你,排雷成功\n"); DisplayBoard(mine, row, col); } }
<>运行结果

技术
©2019-2020 Toolsou All rights reserved,
01-C语言之父:丹尼斯·里奇为什么 Python 不是面向未来的编程语言?利用Python处理Excel数据——xlrd,xlwt库# C# 学习笔记(4) 类C语言中四种取整方式、取余/取模的运算以及负数取模的问题java两个对象比较属性值初学者学Python一定要知道他的基础算法有哪些?作用是什么?面试经常被问到-拉链表C++实现简单的通讯录管理系统利用Python处理Excel数据——pandas库