扫雷游戏的实现
一、基本实现过程
1、菜单的打印。
2、创建两个二维数组作为棋盘,并且初始化。
3、两个棋盘分别用于布置雷、存放雷。
4、排雷。
5、判断是否踩雷。
6、未踩雷时判断周围雷数。
7、判断雷是否排尽。
二、过程实现
1、游戏实现逻辑
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Game()
{
char MineBoard[ROWS][COLS] = { 0 };//布置雷
char ShowBoard[ROWS][COLS] = { 0 };//存放雷
//初始化棋盘
InitBoard(MineBoard, ROWS, COLS, '0');
InitBoard(ShowBoard, ROWS, COLS, '#');
//打印棋盘
//
PlantBoard(ShowBoard, ROW, COL);
//布置雷
SetMine(MineBoard, ROW, COL);
//PlantBoard(MineBoard, ROW, COL);
//排查雷
FindMine(MineBoard,ShowBoard, ROW, COL);
}
void menu()
{
printf("**************************\n");
printf("* 扫 雷 游 戏 *\n");
printf("**************************\n");
printf("*********1、PLAY**********\n");
printf("*********0、EXIT**********\n");
printf("**************************\n");
}
int main()
{
int input;
//srand((unsigned)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
system("cls");
Game();
break;
case 0:
printf("退出游戏.....\n");
break;
default:
printf("选择错误,请重新选择.....\n");
break;
}
}
while(input);
return 0;
}
2、打印菜单
void menu()
{
printf("**************************\n");
printf("* 扫 雷 游 戏 *\n");
printf("**************************\n");
printf("*********1、PLAY**********\n");
printf("*********0、EXIT**********\n");
printf("**************************\n");
}
3、棋盘初始化
创建11X11的二维数组,游戏的棋盘为9X9,为什么初始化为11X11的呢?
创建为11X11为的是,在玩家排雷时能更好的找到所要排雷的坐标。
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set)
{
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j)
{
Board[i][j] = set;
}
}
}
4、棋盘的打印
void PlantBoard(char Board[ROWS][COLS], int row, int col)
{
for (int i = 0; i <= row; ++i)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; ++i)
{
printf("%d ", i);
for (int j = 1; j <= col; ++j)
{
printf("%c ", Board[i][j]);
}
printf("\n");
}
}
5、布雷
设置棋盘中雷的个数
#define LEVEL 10
要使雷在棋盘中随机放入,利用srand(time(0))生成随机数种子,雷用‘1’来表示.
void SetMine(char Board[ROWS][COLS], int row, int col)
{
int set = LEVEL;
srand(time(0));//用当前时间来设定rand函数所用的随机数产生演算法的种子值
while (set)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (Board[x][y] == '0')
{
Board[x][y] = '1';
set--;
}
}
}
6、排雷
排雷两种状态:1、踩到雷,游戏结束。2、未踩到雷,输出该坐标附近的雷数
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x, y;
int win=0;
while (win<ROW*COL-LEVEL)
{
printf("请输入要排查的坐标:>");
scanf("%d %d", &x, &y);
//判断是否坐标合法
if ((x<1 || x>row) && (y<1 || y>col))
{
printf("坐标非法,请重新输入!\n");
}
//是否踩到雷
if (mine[x][y] == '1')
{
PlantBoard(mine, ROW, COL);
printf("很遗憾,你被炸死了..\n");
break;
}
//统计雷数
int count = GetMine(mine, x,y);
show[x][y] = count + '0';
//PlantBoard(show, ROW, COL);
win++;
system("cls");
PlantBoard(show, ROW, COL);
}
if (win >= ROW * COL - LEVEL)
{
PlantBoard(show, ROW, COL);
printf("恭喜你排雷成功\n");
}
}
未踩到雷时,统计周围雷数。
int GetMine(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';
}
三、游戏实现过程中的难点
1、雷的随机分布
srand(time(0));//用当前时间来设定rand函数所用的随机数产生演算法的种子值
2、雷的放置
棋盘是用存放雷棋盘中用‘#’表示棋盘初始化状态,在布置雷棋盘中’1‘表示雷,’0‘表示安全区。
3、周围雷数的统计
通过返回在布置雷棋盘中输入坐标周围8个坐标的ASCLL码值减去字符8个’0’值。并在该坐标输出雷数。
4、坐标输入一定要正确!!!
四、不足
在排雷过程中,不能出现扫雷游戏中那种大面积,目前能力有限,只能输出周围8个位置的雷数。初学者第一次,技术不足,有待提高,冲冲冲!!