扫雷这个游戏大家都一定玩过,那今天我们一起来实现它。
安排!
首先我们先了解其思路
1.我们得有两个一模一样的棋盘,一个棋盘来布置我们的雷,相当于幕后黑手,叫mine。另一个棋盘来显示我们排除出雷的信息,干的都是露脸的活,叫show。
我们所展示的棋盘是一个9*9的棋盘,但我们在设计的时候要把它设计成11*11的棋盘,为的是防止在以后找雷的时候数组越界。
2.对幕后黑手mine数组操作
放雷,为了随机我们用rand()函数。
3.找雷,两个数组都要用上,一个将扫到雷的信息存储,一个用来展示。
目录
为了代码的可读性,我们把代码放在三个文件中1.test.c 2.game.c 3.game.h
一.初始化界面(test.c)
让玩家选择界面
#include"game.h"
void mean()
{
printf("*****************\n");
printf("*** 1.play ****\n");
printf("*** 0.exit ****\n");
printf("*****************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
mean();
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 1:
//game();
break;
case 0:
printf("退出游戏\n");
default:
printf("请输入正确的格式");
break;
}
} while (input);
return 0;
}
game()函数
void game()
{
char mine[Hnags][Lies];//用来存放布置好的雷
char show[Hnags][Lies];//用来存放排查出雷的信息
//先初始化
InitBoard(mine, Hnags, Lies,'0');
InitBoard(show, Hnags, Lies,'*');
//布置雷
SetMine(mine, Hang, Lie);
//PrintBoard(mine, Hang, Lie);
//打印棋盘
/*PrintBoard(mine, Hang, Lie);*///注意改变行和列
PrintBoard(show, Hang, Lie);
//排查雷
FindMine(mine,show, Hang, Lie);
PrintBoard(show, Hang, Lie);
}
二.打印棋盘(game.c)
先初始化棋盘内容,mine里放' 0 ',show里放' * '。
void InitBoard(char board[Hnags][Lies], int hangs, int lies,char set)
{
int i = 0;
int j = 0;
for (i = 0; i < hangs; i++)
{
for (j = 0; j < lies; j++)
{
board[i][j] = set;
}
}
}
分为两步走 1. 打印 行标,列标 2.打印初始化的内容
效果图
//打印棋盘
void PrintBoard(char board[Hnags][Lies], int hang, int lie)
{
int i = 0;
int j = 0;
printf("-----扫雷游戏-----\n");
for (j = 0; j <= lie; j++)
{
printf("%d ", j);//打印列标
}
printf("\n");
for (i = 1; i <=hang; i++)
{
printf("%d ", i);//打印行标
for (j =1; j <= lie; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
三.设计放雷(game.c)
放好后的效果
//布置雷
void SetMine(char mine[Hnags][Lies], int hang, int lie)
{
int count = EASY_COUNT;//设置雷的个数,EASY_COUNT是为了方便后期修改雷
int x = 0;
int y = 0;
while (count)
{
x = rand() % hang + 1;
y = rand() % lie + 1;
if (mine[x][y] == '0')//为了重复放雷,加一个条件
{
mine[x][y] = '1';
count--;//count不能放在{ }外,防止置雷失败
}
}
}
四.排查雷(game.c)
void FindMine(char mine[Hnags][Lies],char show[Hnags][Lies],int hang, int lie)
{
int x = 0;
int y = 0;
int count = 0;//用count来记录玩家扫过不是雷的个数
//hang* lie - EASY_COUNT就是不是雷的位置
while (count < hang*lie-EASY_COUNT)
{
printf("请输入想要排查的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <=hang && y >= 1 && y <= lie)//判断坐标是否合理
{
if (mine[x][y] == '1')
{
printf("哈哈哈,你被炸死了!\n");
break;
}
else
{
// Getmine是统计周围雷的个数的函数
int count = Getmine(mine, x, y);
show[x][y] = count+ '0';
//count+ '0' 就是将得到的结果转化为字符型
//输入坐标正确后,再打印一次棋盘,方便玩家下一步判断
PrintBoard(show, hang, lie);
count++;
}
}
else
{
printf("坐标输入错误,请重新输入!\n");
}
}
if (count == hang * lie - EASY_COUNT)
{
printf("恭喜你,排雷成功!\n");
}
}
为了更好地服务FindMine()函数,我们还写了一个Getmine()函数来统计排查位置周围雷的个数。Getmine()函数的返回值是int 型的
int Getmine(char mine[Hnags][Lies], int x, int y)
{
return ( mine[x-1][y]+
mine[x-1][y-1] +
mine[x][y-1] +
mine[x+1][y-1] +
mine[x+1][y] +
mine[x+1][-1] +
mine[x+1][y] +
mine[x][y+1] -
8 * '0');
}
game.h
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#define Hang 9
#define Lie 9
#define Hnags Hang+2
#define Lies Lie+2
#define EASY_COUNT 10
//先初始化
void InitBoard(char board[Hnags][Lies],int hangs,int lies,char set);
//打印棋盘
void PrintBoard(char board[Hnags][Lies], int hang, int lie);
//布置雷
void SetMine(char mine[Hnags][Lies], int hang, int lie);
//查雷
void FindMine(char mine[Hnags][Lies], char show[Hnags][Lies],int hang, int lie);
总代码
#include"game.h"
//先初始化
void InitBoard(char board[Hnags][Lies], int hangs, int lies,char set)
{
int i = 0;
int j = 0;
for (i = 0; i < hangs; i++)
{
for (j = 0; j < lies; j++)
{
board[i][j] = set;
}
}
}
//打印棋盘
void PrintBoard(char board[Hnags][Lies], int hang, int lie)
{
int i = 0;
int j = 0;
printf("-----扫雷游戏-----\n");
for (j = 0; j <= lie; j++)
{
printf("%d ", j);//打印列标
}
printf("\n");
for (i = 1; i <=hang; i++)
{
printf("%d ", i);//打印行标
for (j =1; j <= lie; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//布置雷
void SetMine(char mine[Hnags][Lies], int hang, int lie)
{
int count = EASY_COUNT;//设置雷的个数,EASY_COUNT是为了方便后期修改雷
int x = 0;
int y = 0;
while (count)
{
x = rand() % hang + 1;
y = rand() % lie + 1;
if (mine[x][y] == '0')//为了重复放雷,加一个条件
{
mine[x][y] = '1';
count--;//count不能放在{ }外,防止置雷失败
}
}
}
void FindMine(char mine[Hnags][Lies],char show[Hnags][Lies],int hang, int lie)
{
int x = 0;
int y = 0;
int count = 0;//用count来记录玩家扫过不是雷的个数
//hang* lie - EASY_COUNT就是不是雷的位置
while (count < hang*lie-EASY_COUNT)
{
printf("请输入想要排查的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <=hang && y >= 1 && y <= lie)
{
if (mine[x][y] == '1')
{
printf("哈哈哈,你被炸死了!\n");
break;
}
else
{
// Getmine是统计周围雷的个数的函数
int count = Getmine(mine, x, y);
show[x][y] = count+ '0';
//count+ '0' 就是将得到的结果转化为字符型
//输入坐标正确后,再打印一次棋盘,方便玩家下一步判断
PrintBoard(show, hang, lie);
count++;
}
}
else
{
printf("坐标输入错误,请重新输入!\n");
}
}
if (count == hang * lie - EASY_COUNT)
{
printf("恭喜你,排雷成功!\n");
}
}
int Getmine(char mine[Hnags][Lies], int x, int y)
{
return ( mine[x-1][y]+
mine[x-1][y-1] +
mine[x][y-1] +
mine[x+1][y-1] +
mine[x+1][y] +
mine[x+1][-1] +
mine[x+1][y] +
mine[x][y+1] -
8 * '0');
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#define Hang 9
#define Lie 9
#define Hnags Hang+2
#define Lies Lie+2
#define EASY_COUNT 10
//先初始化
void InitBoard(char board[Hnags][Lies],int hangs,int lies,char set);
//打印棋盘
void PrintBoard(char board[Hnags][Lies], int hang, int lie);
//布置雷
void SetMine(char mine[Hnags][Lies], int hang, int lie);
//查雷
void FindMine(char mine[Hnags][Lies], char show[Hnags][Lies],int hang, int lie);
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void mean()
{
printf("*****************\n");
printf("*** 1.play ****\n");
printf("*** 0.exit ****\n");
printf("*****************\n");
}
void game()
{
char mine[Hnags][Lies];//用来存放布置好的雷
char show[Hnags][Lies];//用来存放排查出雷的信息
//先初始化
InitBoard(mine, Hnags, Lies,'0');
InitBoard(show, Hnags, Lies,'*');
//布置雷
SetMine(mine, Hang, Lie);
//PrintBoard(mine, Hang, Lie);
//打印棋盘
/*PrintBoard(mine, Hang, Lie);*///注意改变行和列
PrintBoard(show, Hang, Lie);
//排查雷
FindMine(mine,show, Hang, Lie);
PrintBoard(show, Hang, Lie);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
mean();
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
default:
printf("请输入正确的格式");
break;
}
} while (input);
return 0;
}