前言
随着学习C语言的深入,现在我将在这篇文章中展示简易扫雷的实现,如有疏漏,敬请指正。
正文
一、扫雷的玩法
扫雷是在棋盘上放置一定数量的雷,玩家通过输入坐标来排查雷,若选择的坐标位置上存在雷则游戏失败,若选择的位置没有雷,则该位置显示周围8个格子中雷的个数,直至玩家排查出所有的雷即获得游戏的胜利。
二、扫雷过程实现代码示例
1.初始菜单
这个菜单最普通不过了,1开始游戏,0退出游戏,需要注意的是需要将菜单放入do while循环内。
代码如下:
void menu()
{
printf("*******************\n");
printf("*****1. play *****\n");
printf("*****0. exit *****\n");
printf("*******************\n");
}
2.设置棋盘和雷的个数
设置棋盘大小应使用#define定义的常变量,以便于增强代码的可移植性。同时考虑到后续需要计算雷的个数,防止出现数组越界访问的情况,应在棋盘外再加一圈便于以后查找。
代码如下:
#define ROW 9
#define COL 9
#define ROWS ROW+2//多一圈
#define COLS COL+2//多一圈
#define EASY_MODE 10//简易模式10个雷
接下来设置棋盘。
代码如下:
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)//此处rows,cols是布置时全要布置
{
int i = 0;
int j = 0;
for(i = 0;i<rows;i++)
{
for(j=0;j<cols;j++)
{
board[i][j] = set;
}
}
}
char mine[ROWS][COLS];
char show[ROWS][COLS];
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
3.展示棋盘
将棋盘打印,检查是否正确。
代码如下:
void DisplayBoard(char board[ROWS][COLS],int row,int col)//此处的row,col是打印时只需要展示中间部分
{
printf("------扫雷游戏------\n");
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");
}
printf("------扫雷游戏------\n");
}
DisplayBoard(mine,row,col);
DisplayBorad(show,row,col);
效果如下:
4.布置雷
通过生成随机坐标的方式布置雷,通过rand()%num+1实现坐标范围为1-num,注意若生成的位置不是‘0’,则需要重新生成坐标。
代码如下:
void SetMine(char mine[ROWS][COLS], int row, int col, int number)//number为雷的个数
{
while (number)
{
//横纵坐标1-row
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
number--;
}
}
}
设置好后不需要打印,不然就没法玩了。
5.排查雷
用户输入坐标进行排查雷。
代码如下:
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int win = 0;
while (win< row*col-EASY)
{
printf("请输入要排查的坐标:>");
int x = 0;
int y = 0;
scanf("%d%d", &x, &y);
//1、坐标合法性
//2、该坐标是不是雷?不是雷,统计周围雷的个数
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 - EASY)
{
printf("恭喜你,排雷成功!\n");
DisplayBoard(mine,row,col);
}
}
6.计算雷的个数
当输入的坐标合法且不是雷是,需要统计周围8个坐标里雷的个数总和。
Tips:1、字符1和字符0相减的值为1
2、可利用周围的1减去8*’0‘或者用循环包括自身减去9*’0‘
代码如下:
int GetMineCount(char mine[ROWS][COLS], int x, int y)//统计mine数组x,y坐标周围有几个雷
{
return
mine[x - 1][y + 1] +
mine[x][y + 1] +
mine[x + 1][y + 1] +
mine[x - 1][y] +
mine[x + 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] - 8 * '0';
// 或者两重循环相加-9*‘0’
/*
int GetMineCount(char mine[ROWS][COLS],int row,int col)
int i = 0;
int j = 0;
char count;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= ocl; j++)
{
count+=mine[i][j];
}
}
int ret = count - 9*'0';
return ret;
*/
}
三、测试游戏运行情况
测试截图如下:
正常排雷:
踩到雷:
总结
以上就是今天要讲的内容,本文仅仅简单介绍了C语言实现三子棋的方法,关于连续展开一片无雷区域可考虑使用递归实现。