作者介绍:友友们好我是沐曦希,可以叫我小沐
作者主页:沐曦希的个人博客主页.
作者的gitee:https://gitee.com/muxi-c-language.
零基础学习C语言系列:
https://blog.csdn.net/m0_68931081/category_11742786.html.
小沐和友友们一样喜欢编辑,天天敲代码,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步,成为合格的卷王。✨如果文章有错误,欢迎在评论区✏️指正。那么开始今天的学习吧!
大家都应该玩过扫雷游戏,上图是通过代码编写的雷盘,通过输入坐标进行扫雷。例如:
输入坐标(1,1),显示1,表示该坐标附近有一个雷,如此下去,直到把所有的没有雷的位置全部翻完或者踩到雷,则游戏结束。
以下用test.c来测试游戏的逻辑,并打印游戏菜单。
game.h作为游戏的头文件,进行函数的声明。
game.c作为游戏的功能实现,是游戏代码实现的核心。
#include
void meau()
{
printf("**********************************\n");
printf("********* 1.开始游戏 ********\n");
printf("********* 0.退出游戏 *******\n");
printf("**********************************\n");
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
meau();
printf("请输入选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始扫雷!\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
}
通过建立两个二维数组,一个初始为*供玩家扫雷,并存储玩家游玩的过程,另一个初始化为0,该数组不能进行打印,存储布置雷的信息。
//game.h
#include
void meau();
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define count 10
void Initbord(char board[ROWS][COLS], int rows, int cols, char set);
void DisPaly(char board[ROWS][COLS], int row, int col);
//test.c
#include"game.h"
void game()
{
char mine[ROWS][COLS] ;//存放布置好的雷的信息
char show[ROWS][COLS] ;//存放排查好的雷的信息
Initbord(mine, ROWS, COLS,'0');//初始化布置好的雷的数组全为‘0’,雷则为‘1’
Initbord(show, ROWS, COLS,'*');//初始化排查好的雷的信息,全为‘*’,数字表示该数字周围有多少个雷。
}
//game.c
void Initbord(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 DisPaly(char board[ROWS][COLS], int row, int col)
{
int j = 0;
printf("-----扫雷游戏-----\n");
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
int i = 0;
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 x = 0;
int y = 0;
int a = count;
while (a)
{
x = rand() % row+1;
y = rand() % col+1;
if (board[x][y] == '0')
{
board[x][y] = '1';
a--;
}
}
}
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 - count)
{
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] != '*')
{
printf("该坐标已被排除,不能重复排除!\n");
}
else
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了!\n");
DisPaly(mine, row, col);
break;
}
else
{
win++;
int set = get_mine_conut(mine, x, y);
show[x][y] = set + '0';
DisPaly(show, row, col);
int c = 0;
printf("是否需要标记雷的位置,如果需要请输入1,不需要输入0!请输入:>");
scanf("%d", &c);
if (c == 1)
{
Mark(show, row, col);
}
}
}
}
else
{
printf("输入的坐标超出范围,请重新输入!\n");
}
}
if (win == row * col - count)
{
printf("恭喜你,挑战成功!\n");
DisPaly(mine, row, col);
}
}
void Mark(char show[ROWS][COLS], int row, int col)
{
int input = 0;
DisPaly(show, row, col);
int x = 0;
int y = 0;
printf("请输入需要标记的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] == '*')
{
show[x][y] = '/';
DisPaly(show, row, col);
}
else
{
printf("该坐标已被排除过,请重新输入。\n");
}
}
else
{
printf("输入的坐标超出范围,请重新输入。\n");
}
printf("是否需要继续标记,如果需要请输入1,不需要请输入0。请输入选择:>");
scanf("%d", &input);
if (input == 1)
{
Mark(show, row, col);
}
}
int get_mine_conut(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';
}
void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{
if (row >= 1 && row <= ROW && col >= 1 && col <= COL)
{
int a = sum(board, row, col);
if (a != 0)
{
show[row][col] = a + '0';
}
else if (show[row][col] != '_')
{
show[row][col] = '_';
int i = 0, j = 0;
for (i = row - 1; i <= row + 1; i++)
{
for (j = col - 1; j <= col + 1; j++)
{
Openboard(show, board, i, j);
}
}
}
else
{
return;
}
}
}
#include
#include
#include
void meau();
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define count 10
void Initbord(char board[ROWS][COLS], int rows, int cols, char set);
void DisPaly(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
void Openboard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
void Mark(char show[ROWS][COLS], int row, int col);
#include"game.h"
void game()
{
char mine[ROWS][COLS] ;
char show[ROWS][COLS] ;
Initbord(mine, ROWS, COLS,'0');
Initbord(show, ROWS, COLS,'*');
SetMine(mine, ROW, COL);
DisPaly(show, ROW, COL);
FindMine(mine, show, ROW, COL);
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
meau();
printf("请输入选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始扫雷!\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
}
#include"game.h"
void meau()
{
printf("**********************************\n");
printf("********* 1.开始游戏 ********\n");
printf("********* 0.退出游戏 *******\n");
printf("**********************************\n");
}
void Initbord(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 SetMine(char board[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int a = count;
while (a)
{
x = rand() % row+1;
y = rand() % col+1;
if (board[x][y] == '0')
{
board[x][y] = '1';
a--;
}
}
}
void DisPaly(char board[ROWS][COLS], int row, int col)
{
int j = 0;
printf("-----扫雷游戏-----\n");
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
int i = 0;
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-----扫雷游戏-----\n");
}
int get_mine_conut(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';
}
void Mark(char show[ROWS][COLS], int row, int col)
{
int input = 0;
DisPaly(show, row, col);
int x = 0;
int y = 0;
printf("请输入需要标记的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] == '*')
{
show[x][y] = '/';
DisPaly(show, row, col);
}
else
{
printf("该坐标已被排除过,请重新输入。\n");
}
}
else
{
printf("输入的坐标超出范围,请重新输入。\n");
}
printf("是否需要继续标记,如果需要请输入1,不需要请输入0。请输入选择:>");
scanf("%d", &input);
if (input == 1)
{
Mark(show, row, col);
}
}
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 - count)
{
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] != '*')
{
printf("该坐标已被排除,不能重复排除!\n");
}
else
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了!\n");
DisPaly(mine, row, col);
break;
}
else
{
win++;
int set = get_mine_conut(mine, x, y);
show[x][y] = set + '0';
DisPaly(show, row, col);
int c = 0;
printf("是否需要标记雷的位置,如果需要请输入1,不需要输入0!请输入:>");
scanf("%d", &c);
if (c == 1)
{
Mark(show, row, col);
}
}
}
}
else
{
printf("输入的坐标超出范围,请重新输入!\n");
}
}
if (win == row * col - count)
{
printf("恭喜你,挑战成功!\n");
DisPaly(mine, row, col);
}
}
void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{
if (row >= 1 && row <= ROW && col >= 1 && col <= COL)
{
int a = sum(board, row, col);
if (a != 0)
{
show[row][col] = a + '0';
}
else if (show[row][col] != '_')
{
show[row][col] = '_';
int i = 0, j = 0;
for (i = row - 1; i <= row + 1; i++)
{
for (j = col - 1; j <= col + 1; j++)
{
Openboard(show, board, i, j);
}
}
}
else
{
return;
}
}
}
那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。
你的❤️点赞是我创作的动力的源泉
你的✨收藏是我奋斗的方向
你的关注是对我最大的支持
你的✏️评论是我前进的明灯
创作不易,希望大佬你支持一下小沐吧
下一期见了!