void menu()//这里用一个函数封装起来
{
printf("******************\n");
printf("***欢迎来到扫雷***\n");
printf("*******1: play****\n");
printf("*******0: exit****\n");
printf("******请选择******\n");
}
我们需要创建两个数组,一个数组布置雷,另一个数组来记录排雷的数据。
扫雷规格是9 * 9.但我们要创建的两个数组是11行11列的,也就是规格11 * 11,因为我们要注意排查边上的周围如果创建11行11列的数组可以不越界。
黑色表格是9 * 9规格,如果说在这个规格下在图中画星的四周排查一定会越界,所以说我们要创建11行11列的数组
char bomb[ROWS][COLS];// 用于布置雷
char show[ROWS][COLS];// 用于记录数据
void initial(char arry[ROWS][COLS], int rows, int cols,char ch)//自定义函数初始化
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
arry[i][j] = ch;
}
}
}
//调用函数
initial(bomb, ROWS, COLS,'0');//初始化‘0’
initial(show, ROWS, COLS,'*');//初始化‘*’
void print(char arry[ROWS][COLS], int row, int col)//自定义打印函数
{
int i = 0;
for (i = 0; i <= 9; i++)//这里打印的是列0-9
printf("%d ", i);
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印行1-9
for (int j = 1; j <= col; j++)
{
printf("%c ", arry[i][j]);//打印对应字符
}
printf("\n");
}
}
printf("棋盘\n");
print(show, ROW, COL);//调用打印函数
printf("************\n");
srand((unsigned int)time(NULL));//这里要在int main{}中写,不然出错
//封装了一个放置雷的函数
void layout(char bomb[ROWS][COLS], int row, int col)//放置炸弹
{
int count = BOMB;
while (count)
{ //通过两个rand()来控制x,y坐标的随机值,rand()%9是0-8,我们要在1-9行与列里排雷,所以要加上1,x,y范围就变成了1-9
int x = (rand() % row) + 1;//行
int y = (rand() % col) + 1;//列
if (bomb[x][y] == '0')
{
bomb[x][y] = '1';
count--;
}
}
}
layout(bomb, ROW, COL);//调用放置雷的函数
void FBOMB(char bomb[ROWS][COLS], char show[ROWS][COLS], int row, int col)//判断是否是雷的函数
{
int count = 0;
int x = 0;//这里x y作为横坐标 纵坐标。
int y = 0;
while (count < (row*col - BOMB))//扫雷游戏要把所以没有雷的地方找到
{ //所以每次bomb[x][y]定位的地方是‘0’,就会count++
//<号右边row*col是9*9规格,雷也是在9*9规格布置的,在减去炸弹正好是没有炸弹的数量,所以循环条件是count < (row*col - BOMB,当count是71退出循环。
printf("请输入坐标>:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (bomb[x][y] == '1')
{
printf("很遗憾你被炸死!!!\n");
print(bomb, row, col);
break;
}
else
{
int c = search(bomb, x, y);//搜索坐标四周雷的数据
show[x][y] = c + '0';//接收排雷数据,下文有解释
print(show, ROW, COL);
count++;
}
}
else
{
printf("输入错误,请重新输入");
}
}
if (count == row * col - BOMB)//循环条件结束后,我们要做一个判断,是炸死了,退出循环,排雷成功退出的循环,排雷成功要把没有雷71个位置都要找到,所以当count==71,游戏胜利,这判断出排雷成功
{
printf("游戏胜利");
}
}
``
```c
int search(char bomb[ROWS][COLS], int x, int y)//排查排雷数据函数
{
return (bomb[x - 1][y] +bomb[x - 1][y - 1] +bomb[x][y - 1] +bomb[x + 1][y - 1] +bomb[x + 1][y] +bomb[x + 1][y + 1] +bomb[x][y + 1] +bomb[x - 1][y + 1] - 8 * '0');
}
return (bomb[x - 1][y] +bomb[x - 1][y - 1] +bomb[x][y - 1] +bomb[x + 1][y - 1] +bomb[x + 1][y] +bomb[x + 1][y + 1] +bomb[x][y + 1] +bomb[x - 1][y + 1] - 8 * ‘0’);
代码意义:调用函数传输了x,y,坐标,排查四周数据,返回一个整型给int c,注意这里算的是数字,char show[ROWS][COLS]是字符数组,把数子化成字符,字符数字-字符0=数字,数字=字符+字符0
举例:‘1’-‘0’=1;
因为0ASCLL码是48,1是49。
FBOMB(bomb, show, ROW, COL);
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("******************\n");
printf("***欢迎来到扫雷***\n");
printf("*******1: play****\n");
printf("*******0: exit****\n");
printf("******请选择******\n");
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;//这里创建一个变量,来控制循环,并且也能控制switch语句,根据输入的数字给定提升信息
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("退出游戏!\n欢迎下次来玩\n");
break;
}
default:
{
printf("输入错误!请重新输入");
break;
}
}
} while (input);
return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void initial(char arry[ROWS][COLS], int rows, int cols,char ch)//初始化
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
arry[i][j] = ch;
}
}
}
void print(char arry[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i <= 9; i++)
printf("%d ", i);
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", arry[i][j]);
}
printf("\n");
}
}
void layout(char bomb[ROWS][COLS], int row, int col)//放置炸弹
{
int count = BOMB;
while (count)
{
int x = (rand() % row) + 1;//行
int y = (rand() % col) + 1;//列
if (bomb[x][y] == '0')
{
bomb[x][y] = '1';
count--;
}
}
}
int search(char bomb[ROWS][COLS], int x, int y)
{
return (bomb[x - 1][y] +bomb[x - 1][y - 1] +bomb[x][y - 1] +bomb[x + 1][y - 1] +bomb[x + 1][y] +bomb[x + 1][y + 1] +bomb[x][y + 1] +bomb[x - 1][y + 1] - 8 * '0');
}
void FBOMB(char bomb[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int count = 0;
int x = 0;
int y = 0;
while (count < (row*col - BOMB))
{
printf("请输入坐标>:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (bomb[x][y] == '1')
{
printf("很遗憾你被炸死!!!\n");
print(bomb, row, col);
break;
}
else
{
int c = search(bomb, x, y);
show[x][y] = c + '0';
print(show, ROW, COL);
count++;
}
}
else
{
printf("输入错误,请重新输入");
}
}
if (count == row * col - BOMB)
{
printf("游戏胜利");
}
}
void game(void)//游戏实现核心放置
{
char bomb[ROWS][COLS];// 用于布置雷
char show[ROWS][COLS];// 用于存放排雷数据
initial(bomb, ROWS, COLS,'0');//初始化‘0’
initial(show, ROWS, COLS,'*');//初始化‘*’
printf("棋盘\n");
print(show, ROW, COL);
printf("************\n");
//print(show, ROW, COL);
layout(bomb, ROW, COL);
//print(bomb, ROW, COL);//炸弹示意图
FBOMB(bomb, show, ROW, COL);
}
game.h
#pragma once
#include
#include
#include
#include
#define BOMB 80 //炸弹
#define ROW 9 //行
#define COL 9 //列
#define ROWS ROW+2
#define COLS COL+2
void game(void);
//初始化数组
void initial(char arr[ROWS][COLS], int rows, int cols,char ch);
//布置雷
void layout(char arr[ROWS][COLS], int row, int col);
//搜雷
void FBOMB(char bomb[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//打印棋盘
void print(char arry[ROWS][COLS], int row, int col);