今天来写一个小项目-怎么实现简易版扫雷,大家都玩过扫雷吧,在写扫雷这个小项目之前我是不会玩扫雷的,O(∩_∩)O哈哈~,之后才有了玩的想法。现在我们来看一下如何实现吧。
项目思路:
首先,我们要玩扫雷要有一个简单的游戏菜单供用户选择,这就需要一个菜单函数menu( )。
其次,要有两个数组,一个用来隐藏的显示雷的数组,另一个就是真正显示界面的数组。数组定义好后要进行初始化啊,显示雷的数组用 0 初始化,真正显示数组用 * 初始化。效果如下图

然后,给雷数组设置雷,要随机生成雷,最后就可以玩游戏了。
代码:
先在头文件里定义一下所需要的的函数
#define ROW 10
#define COL 10
#define MINE_COUNT 98
//设置雷
void set_mine(char mine[ROW + 2][COL + 2], int row, int col);
void reset_mine(char mine[ROW + 2][COL + 2], int x, int y, int count);
//显示
void display_board1(char mine[ROW + 2][COL + 2], int row, int col);//用于调试时显示雷分布
void display_board(char board[ROW + 2][COL + 2], int row, int col);
void expand_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2], int x, int y);
//统计雷个数
int get_mine_count(char board[ROW + 2][COL + 2], int x, int y);
//玩游戏
void play_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2]);
接下来是我们扫雷游戏的测试函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#include "扫雷.h"
int menu(void)
{
int choose;
printf("********************\n");
printf(" 0.退出 \n");
printf(" 1.玩游戏 \n");
printf("********************\n");
printf("choose:");
scanf("%d", &choose);
return choose;
}
int chance_mine(void)
{
int number = 0;
printf("请选择雷数:");
scanf("%d", &number);
return number;
}
void game()
{
int ret = 0;
int x = 0, y = 0;
int num = 0;
char mine[ROW + 2][COL + 2]; //定义两数组显示雷数组
char board[ROW + 2][COL + 2];
//自定义选择雷的数量chance_mine()
//初始化两个数组
memset(mine, '0', (ROW + 2)*(COL + 2)*(sizeof mine[0][0]));
memset(board, '*', (ROW + 2)*(COL + 2)*(sizeof board[0][0]));
//init_mine(mine,board);
//显示雷数组,界面数组
//display_board(board, ROW + 2, COL + 2);
//设置雷
set_mine(mine, ROW + 2, COL + 2);
display_board1(mine, ROW + 2, COL + 2);//测雷
display_board(board, ROW + 2, COL + 2);
//玩游戏
play_mine(mine, board);
get_mine_count(mine, x, y);
}
int main()
{
int choose = 0;
srand((unsigned int)time(NULL));
do{
choose = menu();
switch (choose)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (choose);
system("pause");
return 0;
}
最后就是扫雷中各个部分如何去实现了,其中各个函数实现如下:
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 10
#define COL 10
#define MINE_COUNT 98
#include<stdio.h>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#include "扫雷.h"
//显示雷阵,看不见雷
void display_board(char board[ROW + 2][COL + 2], int row, int col)
{
printf("-------------\n");
int i = 0, j = 0;
printf(" ");
for (i = 1; i < col - 1; i++)//打印1-10的heng标
{
printf("%d ", i);
}
printf("\n\n");
for (i = 1; i < row - 1; i++)//打印1-10的shu标
{
printf("%-1d ", i);
for (j = 1; j < col - 1; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
printf("\n"); //改成-------------
}
}
void display_board1(char mine[ROW + 2][COL + 2], int row, int col)
{
int i = 0, j = 0;
printf(" ");
for (i = 1; i < col - 1; i++)//打印1-10的heng标
{
printf("%d ", i);
}
printf("\n\n");
for (i = 1; i < row - 1; i++)//打印1-10的shu标
{
printf("%-1d ", i);
for (j = 1; j < col - 1; j++)
{
printf("%c ", mine[i][j]);
}
printf("\n");
printf("\n");
}
}
void set_mine(char mine[ROW + 2][COL + 2], int row, int col)
{
int count = MINE_COUNT;
while(count)
{
int x = 0, y = 0;
x = (rand() % (row - 2)) + 1;//随机数生成,范围在(0--9)+1 即(1--10)
y = (rand() % (col - 2)) + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
void reset_mine(char mine[ROW + 2][COL + 2], int x, int y, int count)
{
while (count)
{
int x = 0, y = 0;
x = (rand() % (ROW)) + 1;//随机数生成,范围在(0--9)+1 即(1--10)
y = (rand() % (COL)) + 1;
if (mine[x][y] = '0')
{
mine[x][y] = '1';
count--;
}
}
}
//统计雷个数
int get_mine_count(char mine[ROW + 2][COL + 2], int x, int y)
{
int count = 0;
count = (mine[x - 1][y - 1] - '0') + (mine[x - 1][y] - '0')
+ (mine[x - 1][y + 1] - '0') + (mine[x][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');
return count;
}
//展开雷
void expand_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2], int x, int y)
{
int i = 0, j = 0;
for (i = (x - 1); i <= (x + 1); i++)
{
for (j = (y - 1); j <= (y + 1); j++)
{
if (mine[i][j] == '0')
{
board[i][j] = get_mine_count(mine, i, j) + '0';
}
if (board[i][j] == '0')
{
board[i][j] = ' ';
}
}
}
}
//判断雷是否找完
int is_win(char board[ROW + 2][COL + 2])
{
int i = 0, j = 0;
int c = 0;
for (i = 1; i <= ROW; i++)
{
for (j = 1; j <= COL; j++)
{
if (board[i][j] != '*')
{
c++;
}
}
}
return c;
}
//玩游戏
void play_mine(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2])
{
int first = 0;
int x = 0, y = 0;
int leicount = 0;
while (1)
{
//输入坐标
printf("请输入坐标:");
scanf("%d%d", &x, &y);
//坐标合法性
if ((1 <= x && x <= 10) && (1 <= y && y <= 10))
{
first++;
if (mine[x][y] == '1')
{
if (first == 1)
{
reset_mine(mine, x, y, 1);
display_board(mine, ROW + 2, COL + 2);
int ret = 0;
ret = get_mine_count(mine, x, y);
board[x][y] = ret + '0'; //数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII
display_board(board, ROW + 2, COL + 2);
//display_board1(mine, ROW + 2, COL + 2);//测雷
}
else if (mine[x][y] == '1')
{
printf("你踩雷了\n");
//set_mine(board, x, y);
display_board(mine, ROW + 2, COL + 2);
break;
}
}
else
{
int ret = 0;
ret = get_mine_count(mine, x, y);
board[x][y] = ret + '0'; //数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII
if (ret == 0)
{
expand_mine(mine, board, x, y);
}
display_board(board, ROW + 2, COL + 2);
}
}
else
{
printf("输入坐标错误,请重新输入\n");
}
if (is_win(board) == ROW * COL - MINE_COUNT)
{
printf("雷全部找出\n");
display_board(mine, ROW + 2, COL + 2);
break;
}
}
}
在写这个扫雷的过程中,我发现了我的很多问题,很多细节及知识点都不会,人丑还是多看书吧。