文章前言:
本文主要介绍了扫雷的简单实现。既然是简单实现,那只能实现基本逻辑:判断某个位置是否有雷以及周围的雷的个数。
具体实现:
思路先行:
我想用两个数组分别表示“雷区”的两个状态:
mine:游戏答案,可以一眼知道雷区的雷点。1表示有雷,0表示此处无雷。
show:玩家所看到的雷区。
1、先初始化两个数组
2、对于mine,设置指定的地雷数量
3、判断是否踩雷以及周围有多少地雷
4、判断是否成功
还有的是,对于这个小游戏,我想用三个文件来实现。
1、game.h : 头文件
2、game.c: 函数的具体实现
3、CleanMine.c: 程序的主干
数组的初始化:
//初始化数组
//sign是指定要初始化的字符
void init(char arr[ROWS][COLS], int row, int col, char sign)
{
for (int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
{
arr[i][j] = sign;
}
}
}
“雷区”的打印:
//打印数组
void Print(char arr[ROWS][COLS], int row, int col)
{
//加上标尺以更清晰表示坐标
for (int i = 0; i <= row; i++)
{
printf(" %d ", i);
if (i == 0)
{
printf(" ");
}
}
printf("\n\n\n");
for (int i = 1; i <= row; i++)
{
printf(" %d ", i);
for (int j = 1; j <= col; j++)
{
printf(" %c ", arr[i][j]);
}
printf("\n");
}
printf("___________________________________________\n");
}
设置雷:
//根据不同的模式而设置不同个数的雷
//不过这个版本只能设置一个模式而已
void setMine(char arr[ROWS][COLS], int row, int col, int count)
{
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
正式扫雷并返回周围雷的个数:
int cleanMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
printf("请输入要排查的坐标:\n");
scanf("%d %d", &x, &y);
if (mine[x][y] != '1')
{
mineCount(mine, show, x, y);
}
else
{
printf("你已经被雷炸死\n");
return 0;
}
//没被雷炸死就继续
return 1;
}
//返回周围雷的个数
//将mind初始化为'0'以及雷为'1'的好处
void mineCount(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
int n = 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';
show[x][y] = n + '0';
//printf("%d\n", n);
}
判断是否成功:
int judge = 1;
while (count < (ROW * COL) - Easy_Mode && judge == 1)
{
judge = cleanMine(mind, show, ROW, COL);
if (judge != 0)
{
Print(show, ROW, COL);
Print(mind, ROW, COL);
}
count++;
}
if (judge == 1)
{
printf("恭喜你,扫雷成功!!!\n");
}
整合代码:
//game.h
#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_Mode 80
void init(char arr[ROWS][COLS], int row, int col, char sign);
void Print(char arr[ROWS][COLS], int row, int col);
void setMine(char arr[ROWS][COLS], int row, int col,int count);
void mineCount(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
int cleanMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//game.c
#include "game.h"
//初始化数组
void init(char arr[ROWS][COLS], int row, int col, char sign)
{
for (int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
{
arr[i][j] = sign;
}
}
}
//打印数组
void Print(char arr[ROWS][COLS], int row, int col)
{
//加上标尺以更清晰表示坐标
for (int i = 0; i <= row; i++)
{
printf(" %d ", i);
if (i == 0)
{
printf(" ");
}
}
printf("\n\n\n");
for (int i = 1; i <= row; i++)
{
printf(" %d ", i);
for (int j = 1; j <= col; j++)
{
printf(" %c ", arr[i][j]);
}
printf("\n");
}
printf("___________________________________________\n");
}
//根据不同的模式而设置不同个数的雷
//不过这个版本只能设置一个模式而已
void setMine(char arr[ROWS][COLS], int row, int col, int count)
{
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
//正式扫雷
int cleanMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
printf("请输入要排查的坐标:\n");
scanf("%d %d", &x, &y);
if (mine[x][y] != '1')
{
mineCount(mine, show, x, y);
}
else
{
printf("你已经被雷炸死\n");
return 0;
}
//没被雷炸死就继续
return 1;
}
//返回周围雷的个数
void mineCount(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
int n = 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';
show[x][y] = n + '0';
//printf("%d\n", n);
}
//CleanMine.c
#include "game.h"
void menu()
{
printf("*****************************************\n");
printf("************ 1、play *************\n");
printf("************ 0、exit *************\n");
printf("*****************************************\n");
}
void test()
{
int count = 0;
srand(time(NULL));
int mode = Easy_Mode;
char mind[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
init(mind, ROWS, COLS, '0');
init(show, ROWS, COLS, '*');
//Print(mind, ROW, COL);
Print(show, ROW, COL);
setMine(mind, ROW, COL, mode);
Print(mind, ROW, COL);
int judge = 1;
while (count < (ROW * COL) - Easy_Mode && judge == 1)
{
judge = cleanMine(mind, show, ROW, COL);
if (judge != 0)
{
Print(show, ROW, COL);
Print(mind, ROW, COL);
}
count++;
}
if (judge == 1)
{
printf("恭喜你,扫雷成功!!!\n");
}
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("进入游戏:\n");
test();
break;
case 0:
printf("退出程序:\n");
break;
default:
printf("非法输入:\n");
break;
}
} while (input);
return 0;
}