前言

经过学习数组、函数、循环语句、选择语句等C语言的一些基础知识后,我想借助编写扫雷小游戏来对所学知识进行一个巩固。游戏只会实现一些基本的功能,展开、标记雷、取消雷等不实现(还不会)。


1.游戏编写思路

分模块进行代码书写:测试模块(test.c) 游戏模块(game.c 和 game.h)

实现游戏菜单

创建两个扫雷棋盘并初始化棋盘

打印棋盘

布置雷区

查找雷


1.分模块书写代码

创建测试模块用于代码的测试。创建游戏模块的game.c源文件用于实现游戏部分的内容。创建game.h头文件用于存放引用库函数的头文件、自定义函数声明、定义#define常量,我们只要在源文件中引用game.h就可以了。分模块编写代码方便我们进行维护以及隐藏部分函数。


3.实现游戏菜单

下面我们在测试模块中实现简易版游戏菜单:

//测试模块 test.c//这里引用的是我创建的头文件,里面存放了引用库函数的头文件名
#include"game.h"//基础菜单函数
void menu()
{printf("*********************************\n");printf("************* 1.play ************\n");printf("************* 0.exit ************\n");printf("*********************************\n");
}//游戏函数
void game()
{printf("扫雷游戏\n");
}//测试函数
void test()
{int input = 0;
//这里程序运行至少会进入一次菜单界面,所以我们使用do while循环 do{menu();printf("请选择:>");scanf("%d",&input);switch (input){default:printf("输入不合法,请重试\n");break;case 1:game();break;case 0:printf("退出游戏\n");break;}} while (input);
}//主函数
int main()
{test();return 0;
}

我们按control+f5让代码跑起来:

可以看到游戏菜单模块的基本逻辑已经实现,下面就是游戏模块的编写了。


3.扫雷棋盘的创建并初始化,打印扫雷棋盘

首先是一些关于棋盘创建的一些思路

游戏是在9*9棋盘上进行,但是实际需要一个11*11的二维数组用法游戏模块的实现。我们将mine棋盘初始化全是'0' ,show棋盘初始化成全是'*'。

接下来是三个文件的代码以及对数组初始化值的验证

//game.h#include<stdio.h>//游戏的行和列值
#define ROW 9
#define COL 9//实际的行和列值
#define ROWS ROW+2
#define COLS COL+2//函数的声明
void Init(char board[ROWS][COLS], int rows, int cols, char set);
void DisplayBoard(char board[ROWS][COLS], int rows, int cols);
//game.c#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//初始化棋盘函数
void Init(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}//打印棋盘函数
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("-----------扫雷-----------\n");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+1);//打印行号for (j = 1; j <= col; j++){printf("%c ",board[i][j]);}printf("\n");}printf("--------------------------\n");
}
//test.c#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化两个数组Init(mine, ROWS, COLS, '0');Init(show, ROWS, COLS, '*');//打印棋盘信息DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);
}

代码书写到这里,让程序跑起来验证一下

可以看到我们实现了两个棋盘的创建并初始化棋盘,打印棋盘信息。


4.布置雷区

实现思路:创建#define常量控制设置雷的个数,通过随机数来生成下标,生成后进行判断是否重复。将生成的雷的过程放入循环中,通过count变量控制循环进行。

//game.h#define MINENUM 10//game.c//布置雷
void SetMine(char board[ROWS][COLS],int row,int col)
{int count = MINENUM;int x = 0;int y = 0;while (count){    //在test.c的test函数内声明srand((unsigned int)time(NULL))//注意这里的time函数返回值为time_t,所以需要进行一个强制转换。x = rand() % 9 + 1;y = rand() % 9 + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}


5.查找雷

实现思路:首先我们要明白排查的过程是一个重复的过程,只有两种情况会跳出这个重复的过程,踩雷或把所有不是雷的位置全部排查了。所以我们需要一个循环来实现,循环的判断条件就是未排查的非雷位置的个数。我们还需要判断输入合法性以及判断是否重复排查同一坐标。当我们排查到了个非雷坐标,则显示周围雷的数量。

//统计周围雷个数
int MineCount(char mine[ROWS][COLS], int x, int y)
{//通过返回的ASC值加上'0'就是改坐标附近雷的个数return (mine[x-1][y-1]+ mine[x - 1][y ]+ mine[x - 1][y + 1]+mine[x ][y - 1] + mine[x][y+1] +mine[x+1][y-1] + mine[x+1][y] + 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 goal = 0;//存放排查次数//当排查完所有非雷坐标后结束循环while (goal < row * col - MINENUM){printf("请输入排查的坐标:>");scanf("%d %d",&x,&y);if (show[x][y] != '*')//判断是否重复排查{printf("改坐标已经排查过了\n");continue;}//判断输入合法性if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾你被炸死了\n");DisplayBoard(mine,row,col);break;}else{int n = MineCount(mine,x,y);show[x][y] = '0' + n;DisplayBoard(show, row, col);goal++;}}else{printf("输入坐标不合法\n");}}//终止循环后判断扫雷成功的条件if (goal == row * col - MINENUM){printf("恭喜你扫雷成功");}
}

6.完整代码以及测试

//test.c
#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 };//初始化两个数组Init(mine, ROWS, COLS, '0');Init(show, ROWS, COLS, '*');//打印棋盘信息DisplayBoard(show, ROW, COL);//布置雷SetMine(mine);//排查雷FindMine(mine,show,ROW,COL);}void test()
{srand((unsigned int)time(NULL));//通过时间戳来生成一个随机数int input = 0;do{menu();printf("请选择:>");scanf("%d",&input);switch (input){default:printf("输入不合法,请重试\n");break;case 1:game();break;case 0:printf("退出游戏\n");break;}} while (input);
}int main()
{test();return 0;
}
//game.c
#include"game.h"void Init(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("-----------扫雷-----------\n");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");}printf("--------------------------\n");
}//布置雷
void SetMine(char board[ROWS][COLS])
{int count = MINENUM;int x = 0;int y = 0;while (count){x = rand() % 9 + 1;y = rand() % 9 + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}//统计周围雷个数
int MineCount(char mine[ROWS][COLS], int x, int y)
{return (mine[x-1][y-1]+ mine[x - 1][y ]+ mine[x - 1][y + 1]+mine[x ][y - 1] + mine[x][y+1] +mine[x+1][y-1] + mine[x+1][y] + 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 goal = 0;while (goal < row * col - MINENUM){printf("请输入排查的坐标:>");scanf("%d %d",&x,&y);if (show[x][y] != '*'){printf("改坐标已经排查过了\n");continue;}if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾你被炸死了\n");DisplayBoard(mine,row,col);break;}else{int n = MineCount(mine,x,y);show[x][y] = '0' + n;DisplayBoard(show, row, col);goal++;}}else{printf("输入坐标不合法\n");}}if (goal == row * col - MINENUM){printf("恭喜你扫雷成功");}
}
//game.h
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<time.h> //游戏的行和列值
#define ROW 9
#define COL 9//实际的行和列值
#define ROWS ROW+2
#define COLS COL+2//雷的个数
#define MINENUM 10//函数声明
void Init(char board[ROWS][COLS], int rows, int cols, char set);
void DisplayBoard(char board[ROWS][COLS], int rows, int cols);
void SetMine(char board[ROWS][COLS]);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

这里测试我将雷的个数设置成79个并输出雷的坐标来进行程序的逻辑测试:


总结

本文章分享的仅仅是扫雷小游戏的基础框架以及基本的程序逻辑,文中代码仅供参考,如有错误请指正。等完善其他的一些小功能后,会再次与你分享。希望我们一起进步。

C语言扫雷游戏(简易版)相关推荐

  1. c语言扫雷源代码简单版,C语言扫雷游戏源代码

    C语言扫雷游戏源代码 /* 模拟扫雷游戏 */ #include #include #include #include #include #include #include union REGS re ...

  2. C与C++游戏项目练习9:接金币游戏简易版

    ## C与C++游戏项目练习9:接金币游戏简易版 还是只能在devC++里面运行,不要用VS!!! 还是只能在devC++里面运行,不要用VS!!! 还是只能在devC++里面运行,不要用VS!!!* ...

  3. python棋类项目规划一——五子棋游戏简易版——项目一

    五子棋游戏简易版 目前只能人人对战 o 代表黑棋 x 代表白棋 . 代表无棋子 以下是代码: def nemBoard():'''初始化棋盘''' board = [[0 for i in range ...

  4. java控制台扫雷_java实现扫雷游戏控制台版

    本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(grid): 属性:内容(content).状态(typ ...

  5. java扫雷雷区的统计数据代码_java实现扫雷游戏控制台版

    本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(Grid): 属性:内容(content).状态(typ ...

  6. 【C语言】扫雷游戏——控制台版

    目录: 1.设计思路 1.1函数概要设计 1.2流程 2.函数实现 3.文件及函数布置 1.设计思路 1.1流程 扫雷游戏,首先让玩家知晓如何进入游戏,退出游戏,这里需要给玩家提示,设计一个菜单选项函 ...

  7. 【C语言扫雷游戏详解及如何实现递归展开】

    提示:全文已采用物理深色模式,请放心观看 文章目录 一.整体框架 1.设计思路 2.实现细节 二.主要函数 1.打印棋盘 2.递归展开 三.其他函数 一.整体框架 1.设计思路 基础难度的扫雷游戏含有 ...

  8. 扫雷游戏网页版_做游戏,单人行动可行吗(3.让我试试扫雷)

    17年底,三国依然在线稳定运行.一个偶然的机会发现了一个网页的扫雷游戏(mienfield),是一个无限边界的扫雷游戏,全世界所有人玩一盘没有边界的扫雷.看着非常酷,我搜索了一下各大手机平台,没有同款 ...

  9. c语言扫雷游戏计时功能_C语言实现扫雷游戏(可以自动展开)

    前言 本篇博客主要介绍如何使用C语言实现扫雷游戏. 一.游戏规则 在一张ROW行COL列的地图上存在MINE_COUNT个地雷.玩家输入坐标翻开格子,若没有踩雷,则计算此格子周围8个格子的地雷总数,并 ...

最新文章

  1. 在此iphone上尚未受信任_苹果中国官网开启限购!每款iphone每人限购两部
  2. 世界大学排名:12所中国大学科研实力进百强
  3. 【Todo】Zookeeper系列文章
  4. nodejs启动机制分析
  5. 漫画:什么是人工智能
  6. python openpyxl模块追加数据_python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据...
  7. mysql -u root -p 解释
  8. Gridiew——表的内容居中
  9. c++tcp接收文件缓存多大合适_要是有人问我 TCP, 我能怎么扯
  10. VS2010中的顺序图
  11. Android:自定义滚动边缘(EdgeEffect)效果
  12. mysqlbinlog: unknown variable 'default-character-s
  13. MyISAM如何查看哪个session持有表锁
  14. 大规模图搜索和实时计算在阿里反作弊系统中的应用
  15. Linux通过Smb与Windows共享目录
  16. windows上面运行jar文件,Windows服务器后台运行jar包
  17. python右对齐_Python中print函数输出时的左右对齐问题
  18. jQuery fadeIn淡入的使用
  19. 计算机配置里面没有网络选项,解决win10网络设置中没有以太网的方法
  20. java wildcard_java泛型 wildcard

热门文章

  1. 学Java 这样入门 28天轻松掌握
  2. 我认为这种计算机卖的很好英语翻译,英语翻译
  3. wp8 导出短信 到android,如何从outlook同步联系人头像以及管理短信呢
  4. 面向接口编程:打印机
  5. fgo显示服务器内部错误,fgo服务器数据库异常
  6. 一个电脑板绘初学者的自述,设计基础
  7. 用python的tkinter做游戏(七)—— 双人射击游戏Demo(类的应用) 篇
  8. 立体匹配中的全局匹配——动态规划笔记
  9. 电子表整点报时怎么取消_不用睁眼,让手机自动为你报时
  10. 【吴恩达】机器学习作业-ex2data2--逻辑回归曲线(python)