如何用C语言来实现简易的扫雷游戏呢?让我们一起看看吧!
文章目录
- 扫雷【C语言】
- 前言
- 一、基本步骤
- 二、具体实现
- 1,菜单界面
- 2,创建雷盘并初始化
- 3,打印
- 4,放置雷
- 5,查找雷
- 二、完整代码
- test.c
- game.c
- game.h
- 总结
前言
如果你是C语言入门不久,我们可以来简易实现扫雷
一、基本步骤
- 菜单界面选择开始或者退出游戏。
- 创建并初始化。
- 打印棋盘。
- 放置雷
- 查找雷
- 判定胜负关系。
- 如果胜负已分则打印结果结束游戏,返回菜单界面。
游戏开始时会提供玩家选择开始还是结束游戏,使得玩家结束游戏后能再次进行游戏;
代码如下:
void menu(){
printf("******************************************n");
printf("*********** 1.play ***********n");
printf("*********** 0.exit ***********n");
printf("******************************************n");
}
2,创建雷盘并初始化
首先我们需要一个二维数组,我们可以人为规定“0”表示没有雷,“1“表示放置了雷,但是!!!如果我们玩过扫雷游戏我们就会明白如果该点坐标不是雷并且周围一周雷的个数会放在该位置,如果这个坐标周围是1个雷后,那么电脑就会表示:”你这到底是个什么QWQ!“,电脑不明白这时的”1“是雷还是雷的个数,编译器表示:”我好难。“。那我们不妨设置两个数组,一个我们放雷一个我们向玩家显示。
这里初始化了两个棋盘一个初始化为‘0’,玩家展示初始化为”*“,所以初始化函数我们可以将初始化内容作为一个形参传入,这样就可以实现一个函数来初始化两个数组
代码如下:
//主函数内:
char mine[ROWS][COLS] = { '0' };
char show[ROWS][COLS] = { '0' };
void Initborade(char borade[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++){
borade[i][j] = set;
}
}
}
3,打印
每次我们查找完一个坐标后,玩家要知道这个位置是不是雷,显示周围几个雷
代码如下
void Printborade(char borade[ROWS][COLS], int row, int col){
int i = 0;
int j = 0;
printf("*************扫雷游戏********************n");
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 ", borade[i][j]);
}
printf("n");
}
printf("*************扫雷游戏********************n");
}
4,放置雷
一开始创建了两个数组,可以在初始化为”0“的数组中存放地雷,为了游戏性,地雷放置位置应该是随机的这里我们放置10个地雷这里通过#define EASY_COUNT 10 来定义数量这样可以在后续测试程序时比较便,其实也可改进让玩家自行输入游玩个数。
void Setmine(char borade[ROWS][COLS], int row, int col){
int count = EASY_COUNT;
while (count){
int x = rand() % row + 1;
int y = rand() % row + 1;
if ( borade[x][y] == '0'){
borade[x][y] = '1';
count--;
}
}
}
5,查找雷
我们需要明确几点:
- 首先玩家输入查找坐标,如果是雷,打印存放雷的数组,并结束游戏;
- 如果不是雷,其坐标一周雷的个数显示到该位置
- 如果周围都没有雷,我们在分别查找各个坐标周围,实现爆炸式展开,
//坐标一周雷的个数
int Mine_count(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');
}
//爆炸式展开
int scan(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y){
if (x==0||y==0||x==ROWS-1||y==COLS-1){
return ;
}
if (show[x][y] != '*'){
return;
}
int count = Mine_count(mine, x, y);
if (count == 0){
show[x][y] = ' ';
scan(mine, show, x - 1, y-1);
scan(mine, show, x - 1, y);
scan(mine, show, x - 1, y + 1);
scan(mine, show, x, y - 1);
scan(mine, show, x, y + 1);
scan(mine, show, x + 1, y - 1);
scan(mine, show, x + 1, y);
scan(mine, show, x + 1, y + 1);
}
else{
if (count > 0){
show[x][y] = count + '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&&show[x][y] == '*'){
if (mine[x][y] == '1'){
printf("菜!n");
Printborade(mine, ROW, COL);
break;
}
else{
win++;
int ret = Mine_count(mine, x, y);
if (ret + '0' > '0'){
show[x][y] = ret + '0';
}
else{
scan(mine, show, x, y);
}
Printborade(mine, ROW, COL);
Printborade(show, ROW, COL);
}
}
else{
printf("坐标非法,请重新输入;n");
}
}
if (win == row*col - EASY_COUNT){
printf("恭喜你取得胜利!n");
}
}
二、完整代码 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' };
Initborade(mine,ROWS,COLS,'0');
Initborade(show, ROWS, COLS, '*');
Setmine(mine,ROW,COL);
Printborade(mine, ROW, COL);
Printborade(show, ROW, COL);
Findmine(mine, show, ROW, COL);
}
int main(){
int input = 0;
srand((unsigned int)time(NULL));
do{
menu();
scanf("%d",&input);
switch (input){
case 1:
printf("开玩n");
game();
break;
case 0:
printf("退出游戏n");
break;
default:
printf("输入错误,请重新输入n");
break;
}
} while (input);
return 0;
}
game.c
#include"game.h"
void Initborade(char borade[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++){
borade[i][j] = set;
}
}
}
void Printborade(char borade[ROWS][COLS], int row, int col){
int i = 0;
int j = 0;
printf("*************扫雷游戏********************n");
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 ", borade[i][j]);
}
printf("n");
}
printf("*************扫雷游戏********************n");
}
void Setmine(char borade[ROWS][COLS], int row, int col){
int count = EASY_COUNT;
while (count){
int x = rand() % row + 1;
int y = rand() % row + 1;
if ( borade[x][y] == '0'){
borade[x][y] = '1';
count--;
}
}
}
int Mine_count(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');
}
int scan(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y){
if (x==0||y==0||x==ROWS-1||y==COLS-1){
return ;
}
if (show[x][y] != '*'){
return;
}
int count = Mine_count(mine, x, y);
if (count == 0){
show[x][y] = ' ';
scan(mine, show, x - 1, y-1);
scan(mine, show, x - 1, y);
scan(mine, show, x - 1, y + 1);
scan(mine, show, x, y - 1);
scan(mine, show, x, y + 1);
scan(mine, show, x + 1, y - 1);
scan(mine, show, x + 1, y);
scan(mine, show, x + 1, y + 1);
}
else{
if (count > 0){
show[x][y] = count + '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&&show[x][y] == '*'){
if (mine[x][y] == '1'){
printf("菜!n");
Printborade(mine, ROW, COL);
break;
}
else{
win++;
int ret = Mine_count(mine, x, y);
if (ret + '0' > '0'){
show[x][y] = ret + '0';
}
else{
scan(mine, show, x, y);
}
Printborade(mine, ROW, COL);
Printborade(show, ROW, COL);
}
}
else{
printf("坐标非法,请重新输入;n");
}
}
if (win == row*col - EASY_COUNT){
printf("恭喜你取得胜利!n");
}
}
game.h
#include#include #include #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 //初始化 void Initborade(char borade[ROWS][COLS], int row, int col,char set); //打印 void Printborade(char borade[ROWS][COLS], int row, int col); //放置雷 void Setmine(char borade[ROWS][COLS], int row, int col); //查找雷 void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
总结
我们只要理解功能,我们就可以按照功能一步一步利用所学知识来完成,注意函数使用,例如:rand(),srand(),time();等等。



