扫雷小游戏是电脑自带的一个趣味小游戏,相信许多小伙伴对它都有所了解,那么如和使用C语言来编写出一个扫雷游戏呢?
接下来,我将详细为大家讲解如和用C语言来实现一个简化版扫雷小游戏,如果觉得内容对你有所帮助,请点个赞支持一下吧!💓
代码如下:(代码中附有讲解)
#define _CRT_SECURE_NO_WARNINGS
#include "扫雷.h"
int main()
{int input = 0;srand((unsigned int)time(NULL));do{//打印菜单menu();//玩家选择游戏状态printf("请选择:>");scanf("%d", &input);//游戏状态实现switch (input){case 0:printf("退出游戏!");break;case 1:game();break;default:printf("输入错误,请重新输入!n");break;}} while (input);return 0;
}
定义一个menu()函数来实现菜单的打印:
void menu()
{printf("****************************n");printf("********** 1.play **********n");printf("********** 0.exit **********n");printf("****************************n");
}
char a[ROWS][COLS] = { 0 };
char b[ROWS][COLS] = { 0 };
由于计算排查坐标周围雷的数量时,当排查边上的坐标时会发生数组越界,所以在定义数组时,将数组扩大一圈。
init_board(a, ROWS, COLS, '0');
init_board(b, ROWS, COLS, '*');
set_a(a, ROW, COL);
display_board(b, ROW, COL);
find_a(a, b, ROW, COL);
代码如下:
void game()
{//定义两个数组,一个(a)用来存放布置好的雷的信息,另外一个(b)用来存放排查出的雷的信息char a[ROWS][COLS] = { 0 };char b[ROWS][COLS] = { 0 };//初始化棋盘//a初始化为全'0'//b初始化为全'*'init_board(a, ROWS, COLS, '0');init_board(b, ROWS, COLS, '*');//布置雷set_a(a, ROW, COL);//打印棋盘display_board(b, ROW, COL);//排雷find_a(a, b, ROW, COL);
}
定义两个函数init_board和display_board,分别用于初始化棋盘和棋盘的打印:
//初始化棋盘
void init_board(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 display_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;//打印列号for (j = 0; j <= col; j++){printf("%d ", j);}printf("n");for (i = 1; i <= row; i++){//打印行号printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("n");}
}
定义一个函数set_a,用来在数组a中布置雷:
布置雷可以用rand()函数生成两个随机数来当作布置雷的坐标;使用rand()之前需要在主函数中调用srand()生成时间戳,使用系统时间初始化!
void set_a(char a[ROWS][COLS], int row, int col)
{//随机布置10个雷int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;//在未被占用的格子中放置雷if (a[x][y] == '0'){a[x][y] = '1';count--;}}
}
定义一个函数find_a,用来进行排雷
void find_a(char a[ROWS][COLS], char b[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;//总共有81个格子,当排除71个格子都没有被炸死,则游戏胜利while (win < (row * col - EASY_COUNT)){printf("请输入要排查的坐标:>");scanf("%d %d", &x, &y);//判断坐标的合法性以if (x >= 1 && x <= row && y >= 1 && y <= col){//判断坐标是否被排查过if (b[x][y] == '*'){//判断是否踩雷if (a[x][y] == '1'){printf("很遗憾,你被炸死了!n");display_board(a, ROW, COL);break;}else{int count = get_a_count(a, x, y);b[x][y] = count + '0';display_board(b, ROW, COL);win++;}}else{printf("该坐标已经被排查过了!n");}}else{printf("该坐标非法,请重新输入!n");}}if (win == (row * col - EASY_COUNT)){printf("恭喜你,排雷成功!n");display_board(a, ROW, COL);}
}
定义一个函数get_a_count,用来计算排查坐标周围的雷的数量:
注意:二维数组中所存的值是字符型,通过将周围的八个字符型加起来后减去八个‘0’的ARC2码值将其转换为整型
int get_a_count(char a[ROWS][COLS], int x, int y)
{return (a[x - 1][y - 1] +a[x - 1][y] +a[x - 1][y + 1] +a[x][y + 1] +a[x + 1][y + 1] +a[x + 1][y] +a[x + 1][y - 1] +a[x][y - 1] - 8 * '0');
}
将所用到的函数在扫雷. h 文件中进行声明:
#define ROW 9 //扫雷时打印在屏幕上的行数
#define COL 9 //扫雷时打印在屏幕上的列数
#define ROWS ROW+2 //数组的行数
#define COLS COL+2 //数组的列数#define EASY_COUNT 10 //布置雷的个数#include<stdio.h>//菜单
void menu();//玩游戏
void game();//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col);//布置雷
void set_a(char a[ROWS][COLS], int row, int col);//计算周围有几颗雷
int get_a_count(char a[ROWS][COLS], int x, int y);//排雷
void find_a(char a[ROWS][COLS], char b[ROWS][COLS], int row, int col);
1. 扫雷.h文件
#define ROW 9 //扫雷时打印在屏幕上的行数
#define COL 9 //扫雷时打印在屏幕上的列数
#define ROWS ROW+2 //数组的行数
#define COLS COL+2 //数组的列数#define EASY_COUNT 10 //布置雷的个数#include<stdio.h>//菜单
void menu();//玩游戏
void game();//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col);//布置雷
void set_a(char a[ROWS][COLS], int row, int col);//计算周围有几颗雷
int get_a_count(char a[ROWS][COLS], int x, int y);//排雷
void find_a(char a[ROWS][COLS], char b[ROWS][COLS], int row, int col);
2. 扫雷.c文件
#define _CRT_SECURE_NO_WARNINGS#include "扫雷.h"//打印菜单
void menu()
{printf("****************************n");printf("********** 1.play **********n");printf("********** 0.exit **********n");printf("****************************n");
}//玩游戏
void game()
{//游戏数据存储需要两个 9*9 的数组,但为了防止使用时数组越界,使用 11*11 的数组//一个(a)用来存放布置好的雷的信息,另外一个(b)用来存放排查出的雷的信息char a[ROWS][COLS] = { 0 };char b[ROWS][COLS] = { 0 };//初始化棋盘//a初始化为全'0'//b初始化为全'*'init_board(a, ROWS, COLS, '0');init_board(b, ROWS, COLS, '*');//打印棋盘//display_board(a,ROWS,COLS);//display_board(b,ROWS,COLS);////布置雷set_a(a, ROW, COL);//打印棋盘//display_board(a, ROW, COL);display_board(b, ROW, COL);//排雷find_a(a, b, ROW, COL);
}//初始化棋盘
void init_board(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 display_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;//打印列号for (j = 0; j <= col; j++){printf("%d ", j);}printf("n");for (i = 1; i <= row; i++){//打印行号printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("n");}
}//布置雷
void set_a(char a[ROWS][COLS], int row, int col)
{//随机布置10个雷int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;//在未被占用的格子中放置雷if (a[x][y] == '0'){a[x][y] = '1';count--;}}
}//计算周围有几颗雷
int get_a_count(char a[ROWS][COLS], int x, int y)
{return (a[x - 1][y - 1] +a[x - 1][y] +a[x - 1][y + 1] +a[x][y + 1] +a[x + 1][y + 1] +a[x + 1][y] +a[x + 1][y - 1] +a[x][y - 1] - 8 * '0');
}//排雷
void find_a(char a[ROWS][COLS], char b[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;//总共有81个格子,当排除71个格子都没有被炸死,则游戏胜利while (win < (row * col - EASY_COUNT)){printf("请输入要排查的坐标:>");scanf("%d %d", &x, &y);//判断坐标的合法性if (x >= 1 && x <= row && y >= 1 && y <= col){//判断坐标是否被排查过if (b[x][y] == '*'){//判断是否踩雷if (a[x][y] == '1'){printf("很遗憾,你被炸死了!n");display_board(a, ROW, COL);break;}else{int count = get_a_count(a, x, y);b[x][y] = count + '0';display_board(b, ROW, COL);win++;}}else{printf("该坐标已经被排查过了!n");}}else{printf("该坐标非法,请重新输入!n");}}if (win == (row * col - EASY_COUNT)){printf("恭喜你,排雷成功!n");display_board(a, ROW, COL);}
}
3. test.c文件
#define _CRT_SECURE_NO_WARNINGS#include "扫雷.h"int main()
{int input = 0;srand((unsigned int)time(NULL));do{//打印菜单menu();printf("请选择:>");scanf("%d", &input);//游戏实现switch (input){case 0:printf("退出游戏!n");break;case 1:game();break;default:printf("输入错误,请重新输入!n");break;}} while (input);return 0;
}
最后,如果觉得内容对你有所帮助,就请点个赞支持一下吧!
本文发布于:2024-01-31 05:22:39,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170664976025862.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |