定义两个二维数组:mine用来布雷、show用来显示扫雷情况、mine初始化为’0’、show初始化为’*’;
开始扫雷输入坐标、如果有雷、提示你踩雷了,本轮游戏结束,如果没雷继续扫直到扫完所有没有雷的地方,没扫一次会提示其周围有几个雷。因为统计四周,边缘位置不好实现,所以把二维数组的行和列都加二,这样无论是否在边缘都可以当做一种情况来实现。
1.game.h(声明函数)
#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
# pragma warning(disable:4996)
#define MineNum 20
#define ROW 10
#define COL 10
void setMines(char mine[][COL + 2], int row, int col);
int getMines(char mine[][COL + 2], int row, int col, int x, int y);
void display(char board[][COL + 2], int row, int col);
void game();
#endif
2.主函数main.c
#include "game.h"
//打印菜单栏
void menu()
{
printf("#####################################\n");
printf("####### 1.play #########\n");
printf("####### 2.exit #########\n");
printf("#####################################\n");
printf("Please select:");
}
int main()
{
do{
int select = 0;
menu();
scanf("%d", &select);
switch (select){
case 1:
game();
break;
case 2:
exit(0);
break;
default:
break;
}
} while (1);
system("pause");
return 0;
}
3.game.c
#include "game.h"
//生成随机数的函数
static int getRandomNum(int start, int end)
{
return rand() % (end - start + 1) + start;
}
//布雷函数
void setMines(char mine[][COL+2],int row,int col)
{
int num = MineNum;
srand((unsigned long)time(NULL));//随机布雷
do{
int x = getRandomNum(1,ROW);
int y = getRandomNum(1,COL);
if (mine[x][y] == '0'){
mine[x][y] = '1';
num--;
}
} while (num);
}
//获得周围雷的函数
int getMines(char mine[][COL + 2], int row, int col, int x, int y)
{
return (mine[x - 1][y - 1] - '0') + (mine[x - 1][y] - '0') +
(mine[x - 1][y + 1] - '0') + (mine[x][y + 1] - '0') +
(mine[x + 1][y + 1] - '0') + (mine[x + 1][y] - '0') +
(mine[x + 1][y - 1] - '0') + (mine[x][y - 1] - '0');
}
//显示函数
void display(char board[][COL + 2], int row, int col)
{
printf(" ");//空三个字符开始写数字
int i = 1;
for (; i <= COL; i++){
printf("%3d", i);//输出第一行的10个数字
}
printf("\n");
for (i = 0; i <= COL; i++){
printf("---");//输出第一行横线
}
printf("\n");
for (i = 1; i <= ROW; i++){
printf("%2d|",i);
int j = 1;
for (; j <= COL; j++){
printf("%3c", board[i][j]);
}
printf("\n");
}
}
void game()
{
char mine[ROW + 2][COL + 2];
char show[ROW + 2][COL + 2];
memset(show, '*',(ROW+2)*(COL+2));//把内存按字节进行初始化,即把show初始化为*
memset(mine, '0', (ROW + 2)*(COL + 2));//把雷数组初始化为字符0;0代表无雷,1代表有雷
setMines(mine, ROW + 2, COL + 2);//设置雷区(显示去也就绪)
int win = 0;
do{
int x, y;
display(show, ROW + 2, COL + 2);//显示show数组的棋盘
printf("Please input<x,y>:");
scanf("%d%d", &x, &y);
if ((x >= 1) && (x <= ROW)&&(y>=1)&&(y<=COL)){
if (mine[x][y] == '1'){
printf("Game Over!\n");
display(mine, ROW + 2, COL + 2);//踩雷之后显示雷区
break;
}
else{
int count = getMines(mine, ROW + 2, COL + 2, x, y);//输入正确后从雷区获得周围的雷
show[x][y] = count + '0';//将雷的个数写在show区对应的位置上+‘0’是将字符转为整形
//表示已成功排除一个雷
win++;
if (win==ROW*COL-MineNum){
printf("You win!\n");
display(mine, ROW + 2, COL + 2);
break;
}
}
}
else{
printf("Enter error,try agin!\n");
}
} while (1);
}