一.扫雷游戏介绍
扫雷游戏可谓是我的童年。当上电脑课没有网络的时候,百无聊赖之际都会打开扫雷小游戏随便乱点,但是那个时候并不知道扫雷小游戏怎么玩的。我也是最近才知道游戏规则(汗颜)。但是这不影响我用我拙劣的C语言能力写出一个拙劣的扫雷小游戏!哈哈不愧是我。
二.扫雷主函数游戏模块
首先主函数的功能就是为了实现主逻辑。当你选择1时候,玩游戏,选择0时退出游戏。游戏的逻辑封装在game()函数中。
void menu()
{
printf("**********************************\n");
printf("********* 1.play *************\n");
printf("********* 0.exit *************\n");
printf("**********************************\n");
}
int main()
{
int input=0;
do
{
menu();
printf("请选择:>");
scanf("%d", input);
switch (input)
{ case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
} while (1);
}
三、初始化函数的实现。
分析中为了能够更好的区分和实现扫雷游戏。因此在游戏逻辑中我们需要定义两个字符型的二维数组,char mine 用于布置雷,而 char show 用于储存雷的信息。太好了。所以我们就想先对这两个数组进行初始化。将mine数组内的元素初始化为‘0’,而将show数组中的元素初始化为‘*’。
void InitBorad(char board[ROWS][COLS], int rows,int cols,char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
四、打印棋盘函数的实现
既然我们把初始化数组实现好了后,我们是不是特别想看看棋盘的初试化是不是符合我们我的预期,因此我们需要一个打印棋盘的函数来将棋盘的布局打印出来。当然为了这个棋盘好看点,我们不仅仅需要将二维数组打印出来,还需要将棋盘的行和列显示出来,为了我们方便下棋。注意:我们初始化函数的棋盘是将11✖11的棋盘都初始化。而打印棋盘的时候我们只需要将9✖9的棋盘打印出来。
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("---------扫雷游戏-----------\n");
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");
}
printf("---------扫雷游戏-----------\n");
}
此时的效果图如下:
五、布置雷
好了,接下来我们就要开始往mine这个二维数组中布置雷了。注意只在9✖9中间的几个格子中随机布置10个雷。
void setmine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;//布置的雷的个数
while (count)
{
int x = rand() % row + 1;//只在9*9格子中随机布置雷
int y = rand() % col + 1;
board[x][y] = '1';
count--;
}
}
六、排查雷
我们布置雷好后,要排查雷。所谓排查雷就是你输入一个坐标,如果这个坐标是雷,那你就被炸死了。如果这个坐标不是雷,那么就把这个坐标周围有几个雷显示出来。注意:在mine数组中排查雷,然后将排查雷的信息放入show数组中。当然你不可能无限制的去排查雷。当你把所有非雷的信息找出来后,你就赢了!因此,你需要设定一个赢的判定。
static int get_mine_count(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 FineMine(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- EASY_COUNT)
{
printf("请输入你排查的坐标>:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("boooooooooooooooooom!\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
int count = get_mine_count(mine, x, y); //得到周围雷的信息
show[x][y] = count+'0';
DisplayBoard(show, ROW, COL);
win++;
}
}
else
printf("坐标非法!请重新输入!");
}
}
七、整体代码
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("**********************************\n"); printf("********* 1.play *************\n"); printf("********* 0.exit *************\n"); printf("**********************************\n"); } void game() { char mine[ROWS][COLS]; char show[ROWS][COLS]; InitBorad(mine,ROWS,COLS,'0'); //初始化 InitBorad(show, ROWS, COLS ,'*'); //DisplayBoard(mine, ROW, COL); //打印棋盘 DisplayBoard(show, ROW, COL); setmine(mine, ROW, COL); // 布置雷 // DisplayBoard(mine, ROW, COL); FineMine(mine, show, ROW, COL);//排查雷 } int main() { srand((unsigned int)time(NULL)); int input=0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏!\n"); break; default: printf("选择错误,请重新输入!\n"); break; } } while (input); }
game.h
#pragma once #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 InitBorad(char board [ROWS][COLS],int rows,int cols,char set); void DisplayBoard(char board[ROWS][COLS], int row, int col); void setmine(char board[ROWS][COLS],int row, int col); void FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void InitBorad(char board[ROWS][COLS], int rows,int cols,char set) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } } void DisplayBoard(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf("---------扫雷游戏-----------\n"); 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"); } printf("---------扫雷游戏-----------\n"); } void setmine(char board[ROWS][COLS], int row, int col) { int count = EASY_COUNT;//布置的雷的个数 while (count) { int x = rand() % row + 1;//只在9*9格子中随机布置雷 int y = rand() % col + 1; board[x][y] = '1'; count--; } } static int get_mine_count(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 FineMine(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- EASY_COUNT) { printf("请输入你排查的坐标>:\n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("boooooooooooooooooom!\n"); DisplayBoard(mine, ROW, COL); break; } else { int count = get_mine_count(mine, x, y); //得到周围雷的信息 show[x][y] = count+'0'; DisplayBoard(show, ROW, COL); win++; } } else printf("坐标非法!请重新输入!\n"); } }