文章目录
一、基本思路和步骤
需要两个相同大小的棋盘(我的代码中分别命名为mine和show),用mine来实现对雷的操作,把show数组打印在屏幕上,需要把玩家对show数组的处理变成对mine数组的处理
步骤
1.用一个简易的菜单来选择开始或退出游戏
2.初始化mine数组和show数组
3.对mine数组操作,布下雷
4.打印show数组,扫雷并判断输、赢或继续游戏
二、代码实现
1.用一个简易的菜单来选择开始或退出游戏
这一部分与我之前的博客《C语言实现三子棋》中相同,此处不再赘述
代码如下(示例):
void menu()
{
printf("************************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("************************\n");
}
int main()
{
int input;
do
{
menu();
printf("请选择\n");
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
}
case 0:
{
break;
}
default:
{
printf("输入错误,请重新输入\n");
break;
}
}
} while (input);
return 0;
}
2.初始化mine数组和show数组
初始化mine数组考虑用’0’ (注意是字符0,而不是数字0)表示该处为空
(后续将体现出其方便之处)
初始化show数组的每一个元素初始化为’*’
代码如下(示例):
#define ROW 9
#define COL 9
#define ROWS (ROW+2)//由于扫雷是需要打印出某个位置周围8个位置的雷的数量
#define COLS (COL+2)//如果按照ROW、COL设定数组可能会发生越界
//所以在数组上下左右个多出一行一列,这样访问数组是不会发生越界
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{//注意最后一个参数char set,这样可以将两个棋盘用一个函数初始化
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
printf("------------------------\n");//分割线
int i, j;
for (i = 0; i <= row; 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");//分割线
}
3.对mine数组操作,布雷
代码如下(示例):
#define EASY_COUNT 10//设置特定难度下雷的数量
void SetMine(char board[ROWS][COLS], int row, int col, int count)
{//参数中的count是将要放的雷的总数
while (count)
{
int x = rand() % ROW + 1;
int y = rand() % COL + 1;
if (board[x][y] == '0')//该处是空位
{
board[x][y] = '1';//置为雷
//**注意是字符1**
count--;//成功布雷后雷数减一
}
}
}
4.打印show数组,开始扫雷
将show数组打印在屏幕上,下面是玩家看到的棋盘
用户输入雷的坐标,由于show与mine大小相同且mine数组已包含雷的信息,所以玩家对show数组的操作可直接用来处理mine数组
代码如下(示例):
void FindMine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
int x, y;
int win = 0;
while (win < row * col - EASY_COUNT)
//row * col - EASY_COUNT就是剩余的空格的数量
//如果排出的空格小于这个数就继续排雷
{
printf("请输入坐标\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')//注意这里是用mine数组判断
{
printf("你踩到雷了,游戏失败\n");
DisplayBoard(mine, row, col);
break;
}
else
{//这里是统计某一个不是雷的位置周围八个位置的雷的个数
int i, j, sum = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
//两层循环遍历周围8个位置
{
sum += mine[i][j] - '0';
//如果是雷,'1' - '0' = 1
//如果不是雷,'0' - '0' = 0
}
}
show[x][y] = sum + '0';//展示这个位置周围八个位置的雷的个数
DisplayBoard(show, row, col);
win++;
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, row, col);
}
}
三、全部代码
test.c
#include "game.h"
void game()
{
char mine[ROWS][COLS];
char show[ROWS][COLS];
//初始化
InitBoard(mine, ROWS, COLS, '0');
//打印
//DisplayBoard(mine, ROW, COL);
InitBoard(show, ROWS, COLS, '*');
DisplayBoard(show, ROW, COL);
SetMine(mine, ROW, COL, EASY_COUNT);
DisplayBoard(mine, ROW, COL);
FindMine(show, mine, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int input;
do
{
menu();
printf("请选择\n");
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
}
case 0:
{
break;
}
default:
{
printf("输入错误,请重新输入\n");
break;
}
}
} while (input);
return 0;
}
game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS (ROW+2)
#define COLS (COL+2)
#define EASY_COUNT 10
//打印菜单
void menu();
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int row, int col, char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//埋雷
void SetMine(char board[ROWS][COLS], int row, int col, int count);
//扫雷
void FindMine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col);
game.c
#include "game.h"
void menu()
{
printf("************************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("************************\n");
}
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
printf("------------------------\n");
int i, j;
for (i = 0; i <= row; 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");
}
void SetMine(char board[ROWS][COLS], int row, int col, int count)
{
while (count)
{
int x = rand() % ROW + 1;
int y = rand() % COL + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
void FindMine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
int x, y;
int win = 0;
while (win < row * col - EASY_COUNT)
{
printf("请输入坐标\n");
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 i, j, sum = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
sum += mine[i][j] - '0';
}
}
show[x][y] = sum + '0';
DisplayBoard(show, row, col);
win++;
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, row, col);
}
}