扫雷游戏想必我们都有玩过,那么今天就用C语言来简单实现“扫雷”小游戏!
目录
一.游戏规则
扫雷是非常经典的一款游戏,给出一张棋盘,根据自己选择的位置来判断该位置是否有雷,如果有雷则游戏结束,如果没有雷,则该位置显示附近区域的雷的个数,并继续选择位置,直至排除所有的雷为止。
以上是扫雷的游戏规则,但我们自己实现时,也同样需要给出自己所设计的规则。
1.在定义棋盘时,定义9*9的棋盘,以二维数组来实现;
2.布雷时,‘0’代表该位置没有雷,‘1’代表该位置有雷(以‘1’代表有雷是为了方便后面对于所选位置周围雷数的计算);
3.由于该程序只是简易版本,因此不能像电脑上的扫雷小游戏那样,可以一次排除点击位置附近所有可排位置,只能一个一个位置的去输入判断。
二.基本思路介绍
1.首先创建一个用户交互界面,方便进行游戏;
2.定义出显示棋盘,用来给用户看的,棋盘大小为9*9,以二维数组来定义出棋盘;
3.定义出实际操作棋盘,即用来实现埋雷、扫雷、计算所选位置雷数等功能的棋盘,该棋盘需要设置大小为11*11,这样方便后续对于棋盘的操作;
4.初始化棋盘,显示棋盘全部初始化为‘*’,实际操作棋盘全部初始化为‘0’;
5.进行埋雷,我们设置雷的个数为10个,利用随机播种来随机生成雷的位置,将埋雷的位置赋值为‘1’;
6.开始排雷,直至碰到雷 or 排除所有雷为止,游戏结束。
三.各功能代码实现
1.创建用户交互界面
int main(int argc, char* argv[])
{
int select = 1;
while (select)
{
printf("*******扫雷小游戏*******\n");
printf("* 1.Play *\n");
printf("* 0.Exit *\n");
printf("************************\n");
printf("请输入你的选择:>");
scanf("%d", &select);
if (select == 0)
break;
if (select != 1)
{
printf("输入有误,请重新输入...\n");
continue;
}
StartGame();
}
printf("退出游戏,欢迎下次使用...\n");
return 0;
}
2.初始化棋盘函数
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
3.埋雷函数
利用srand函数随机播种,生成雷的位置
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
srand(time(0));
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
4..显示棋盘函数
根据传入不同的棋盘来显示
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
for (int i = 0; i <= col; 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.排雷函数
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int win = 0;
int x, y;
while (win < col * row - EASY_COUNT)
{
printf("请输入排雷的位置:>");
scanf("%d %d", &x, &y);
if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
{
if (mine[x][y] == '1')
{
DisplayBoard(mine, ROW, COL);
printf("很遗憾,排雷失败,你被炸糊了...\n");
break;
}
int n = GetMineCount(mine, x, y);
show[x][y] = n + '0';
system("cls");
DisplayBoard(show, ROW, COL);
win++;
}
else
printf("非法输入,请重新输入...\n");
}
if (win >= col * row - EASY_COUNT)
{
printf("恭喜你,排雷成功...\n");
DisplayBoard(mine, ROW, COL);
}
}
四.完整代码
#define _CRT_SECURE_NO_WARNINGS
#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 StartGame();
void InitBoard(char board[ROWS][COLS], int row, int col, char set);
void SetMine(char mine[ROWS][COLS], int row, int col);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);
int GetMineCount(char mine[ROWS][COLS], int x, int y);
int main(int argc, char* argv[])
{
int select = 1;
while (select)
{
printf("*******扫雷小游戏*******\n");
printf("* 1.Play *\n");
printf("* 0.Exit *\n");
printf("************************\n");
printf("请输入你的选择:>");
scanf("%d", &select);
if (select == 0)
break;
if (select != 1)
{
printf("输入有误,请重新输入...\n");
continue;
}
StartGame();
}
printf("退出游戏,欢迎下次使用...\n");
return 0;
}
void StartGame()
{
char show[ROWS][COLS];
char mine[ROWS][COLS];
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');//字符0代表无雷,1代表雷
InitBoard(show, ROWS, COLS, '*');
//埋雷
SetMine(mine, ROW, COL);
//显示棋盘
DisplayBoard(show, ROW, COL);
//扫雷
FindMine(mine, show, ROW, COL);
}
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
srand(time(0));
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
for (int i = 0; i <= col; 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");
}
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int win = 0;
int x, y;
while (win < col * row - EASY_COUNT)
{
printf("请输入排雷的位置:>");
scanf("%d %d", &x, &y);
if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
{
if (mine[x][y] == '1')
{
DisplayBoard(mine, ROW, COL);
printf("很遗憾,排雷失败,你被炸糊了...\n");
break;
}
int n = GetMineCount(mine, x, y);
show[x][y] = n + '0';
system("cls");
DisplayBoard(show, ROW, COL);
win++;
}
else
printf("非法输入,请重新输入...\n");
}
if (win >= col * row - EASY_COUNT)
{
printf("恭喜你,排雷成功...\n");
DisplayBoard(mine, ROW, COL);
}
}
int GetMineCount(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');
}
五.程序运行展示