hello大家好!今天我们来一起写一下扫雷的简单代码。
扫雷是大家从小到大常玩的一款游戏,虽然游戏本身比较简单,但是其中存在的知识也是比较适合初学者学习并且编写的。
一、扫雷的规则
1、点击方格,如果是地雷,游戏失败,所有方格全部点击都不是地雷则游戏胜利
2、如果点击的方格不是地雷,则显示周围有几个地雷,通过提示标记地雷
ok,规则已经讲清楚了,接下来就开始写代码吧。
二、设计思路
首先设置两个二维数组 mine show 分别显示棋盘
mine数组存放布置好的雷,show数组是放在明面上的,用来存放排查出来的雷的信息
接下来将两个数组初始化、随机放雷、打印棋盘、开始游戏
三、代码实现
在这里我们创建三个文件:
game.h需要写函数声明
game.c用来写游戏主体函数的内容
main.c用来写游戏菜单以及整体大致框架的内容
3.1 整体框架
首先在main函数里将游戏框架搭建,通过mune将菜单打印出来,并使用do while和switch选择是否进行游戏。
在这里选择1表示进行游戏,选择0表示退出游戏,如果选择其他会提示“输入错误,重新输入”。
我们可以看到现在代码整体思路已经没什么问题,接下来我们需要将”开始游戏“替换成game函数并把游戏内容写入其中。
3.2 game函数
在game函数中需要对棋盘进行一系列操作
1、创建棋盘
我们需要创建两个二维数组,可以在头文件中定义数组的行和列,这样在以后修改棋盘的时候可以更加方便快捷。
2、初始化
3、打印棋盘
我们可以先把两个棋盘都打印出来看一看有没有什么问题
4、放雷
这里利用rand函数随机放置10个雷
5、排查雷
这一段代码较多也比较复杂,也是比较出问题的地方
四、总结
遇到问题不必慌张,可以慢慢调试找到问题所在,一些简单实用的调试技巧可以看我上一篇博客。
对于初学者而言,扫雷是一个适合上手并具有一定难度的过程
相信大家一点点将代码敲出来并且成功运行后会产生极大的满足感
希望大家在看完本篇博客后能有一些收获,大家一起努力从小白成为大佬!!!
五、源码
5.1 game.h(函数的声明)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define COUNT 10//雷的数量
#define ROW 9//行
#define COL 9//列
#define ROWS ROW+2
#define COLS COL+2
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 board[ROWS][COLS],int row,int col);//放雷
void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷
5.2 game.c(函数的实现)
#include"game.h"
void InitBoard(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)
{
int i = 0;
printf("------扫雷游戏------\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
//随机布置10颗雷
int count = COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[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 FineMine(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 - COUNT)
{
printf("请输入排雷坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("此处是雷,游戏失败\n");
DisplayBoard(mine, ROW, COL);
break;
}
else//该地点不是雷,统计此处周围雷的数量
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf("非法输入,请重新输入\n");
}
}
if (win == row * col - COUNT)
{
printf("排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}
5.3 main.c(整体框架搭建)
#include"game.h"
void menu()
{
printf("********************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("********************\n");
}
void game()
{
char mine[ROWS][COLS];//存放布置好的雷
char show[ROWS][COLS];//存放排查出的雷的信息
//初始化棋盘
//mine数组最开始全是'0'
//show数组最开始全是'*'
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盘
//DisplayBoard(mine, ROW, COL);
DisplayBoard(show, ROW, COL);
//放雷
SetMine(mine, ROW, COL);
//排查雷
FineMine(mine, show, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}