扫雷小游戏:
游戏最终效果:
1.先写一下游戏开始的简单界面。
用一个函数来写一下
cpp
void menu()
{
printf(" ---------------------------- \n");
printf("| 1.play |\n");
printf("| 0.exit |\n");
printf(" ---------------------------- \n");
}
这里的功能(说明):
输入 1 代表游戏开始;
输入 0 代表游戏结束,并退出页面;
既然写扫雷,那地图中的地雷应该是随机出现的,那我们可以用一个srand函数让它随机出现生成地雷。
srand((unsigned int)time(NULL)); //生成随机数的一个函数
具体用法可以百度一下,简单的概括就是生成一个随机数字。
cpp
int main()
{
srand((unsigned int)time(NULL));
int input = 0; //用与while函数循环的选择
do { //也就是刚开始说的界面选择开始或结束的选项
menu();
printf("请选择>");
scanf("%d", &input); //这里的input就是游戏开始或结束的选择
switch (input) //再循环里面嵌套一个switch
{
case 1: // 当输入1的时候,那就进入游戏开始的逻辑
printf("游戏开始!\n");
system("cls"); // :这里是系统函数,用于清空控制台的消息与文字
game(); // 这个是游戏开始的函数接口
break;
case 0: // 当选择0的时候,即退出游戏退出循环,并程序结束。
printf("\n即将退出游戏!\n");
break;
default : //因为只有输入0/1,否则就是输入错误,需要重新输入
printf("您的选择有误,请重新输入:\n");
}
} while (input);
return 0;
}
当我们选择play时,我们将进入游戏,之后就是游戏逻辑的代码了。
cpp
#define ROW 9 //棋盘 行
#define COL 9 //棋盘 列
#define ROWS ROW+2 //判断-棋盘 行
#define COLS COL+2 //判断-棋盘 列
#define COUNT 10 //地雷个数
扫雷,我们需要创建两个二维数组,之后的操作与逻辑都是围绕这两个棋盘来写
一个用来展示覆盖与否的画面(代码中的 show数组):
一个用来记载着地雷的位置与判断(代码中的mine数组) :
cpp
void game()
{
char mine[ROWS][COLS]; //注: ROWS COLS 为头文件define出来的行和列
char show[ROWS][COLS];
//初始化数据
Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');
//棋盘打印
Displayboard(show, ROW, COL);
//布置雷
Setmine(mine, ROW, COL);
//排查雷
Findmine(mine, show, ROW, COL);
//Displayboard(show, ROW, COL);
}
之后我们需要先把两个二维数组给初始化一下:
这里我们写一个函数Initboard
cpp
//初始化棋盘
void Initboard(char borad[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
borad[i][j] = set;
}
}
}
我们将mine的二维数组都初始化为'0'
将show二维数组都初始化为'*'
注:我们展示出来的一般都是show的二维数组
所以我们需要写一个格式函数
cpp
//打印棋盘 //并设置格式
void Displayboard(char borad[ROWS][COLS], int row, int col)
{
printf("======扫雷游戏======\n");
int i = 0;
for (i = 0; i <= row; i++)
{
printf("%d ", i);
}
printf("\n");
for (int a = 1; a <=row; a++)
{
printf("%d ", a);
for (int b = 1; b <= col; b++)
{
Sleep(10);
printf("%c ", borad[a][b]);
}
printf("\n");
}
printf("======扫雷游戏======\n");
}
展示出来就是这个样子。
游戏页面的大概就展示出来了,接下来我们需要写一下游戏判断逻辑了
首先我们需要埋雷,但雷的位置是随机的,所以我们需要用一下srand函数,把雷随机的放进mine二维数组中,就是随机生成一个坐标
注:mine二维数组中 "0"代表该位置是安全的坐标
"1"代表该位置是埋有地雷的坐标)
cpp
//布置雷
void Setmine(char mine[ROWS][COLS], int row, int col)
{
int count = COUNT; //COUNT代表的雷的个数,可以自己设置
while (count)
{
int x = rand() % row + 1; //随机生成x坐标
int y = rand() % col + 1; //随机生成y坐标
if (mine[x][y] =='0')
{
mine[x][y] = '1'; //把mine二维数组的该位置改为1
count--;
} //代表着埋入地雷
}
}
接下来就是输入坐标来排查雷的步骤了
cpp
//排查雷
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int a = 0;
int b= 0;
int win = 0;
while(win<row*col-COUNT){
printf("请输入您的坐标:");
scanf("%d", &a); //输入坐标x和y
scanf("%d", &b);
if ((a <= row + 1 && a > 0) && (b <= col + 1 && b > 0))
{ //这里需要用if来判断一下x和y的值是否大于坐标,不在这个范围就需要重新输入坐标
if (mine[a][b] == '1') //这里判断的是如果坐标刚好在雷的位置,游戏就结束了
{
system("cls"); //清空屏幕
printf("很抱歉,您被炸死了。\n");
Displayboard(mine, ROW, COL); //当炸死后,这里在打印一下mine的棋盘
Sleep(1000); //提示一下并答应雷的位置告诉玩家这里是雷
break; //游戏结束后这里需要break一下结束这一层的循环
}
else
{
int count=Getminecount(mine,a,b);//Getminecount函数排查这个坐标周围有多少颗雷
show[a][b] = count+'0';
system("cls");
Displayboard(show, ROW, COL);
win++;
}
}
else //当不在取值范围内就需要重新输入一下 并输出一个坐标有误的提示
{
printf("您输入的坐标有误,请重新输入:\n ");
}
}
if (win == row * col - COUNT) 当把雷的排完后,就获胜了!
{
printf("恭喜你,排雷成功。\n");
Displayboard(show, ROW, COL);
}
}
该函数用于统计坐标周围有多少颗雷。
cpp
//统计周围雷的个数
int Getminecount(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] +
mine[x - 1][y] - 8 * '0');
}
下面是全代码:
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define ROW 9 //棋盘 行
#define COL 9 //棋盘 列
#define ROWS ROW+2 //判断-棋盘 行
#define COLS COL+2 //判断-棋盘 列
#define COUNT 10 //地雷个数
//初始化棋盘
void Initboard(char borad[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
borad[i][j] = set;
}
}
}
//打印棋盘 //并设置格式
void Displayboard(char borad[ROWS][COLS], int row, int col)
{
printf("======扫雷游戏======\n");
int i = 0;
for (i = 0; i <= row; i++)
{
printf("%d ", i);
}
printf("\n");
for (int a = 1; a <=row; a++)
{
printf("%d ", a);
for (int b = 1; b <= col; b++)
{
Sleep(10);
printf("%c ", borad[a][b]);
}
printf("\n");
}
printf("======扫雷游戏======\n");
}
//布置雷
void Setmine(char mine[ROWS][COLS], int row, int col)
{
int count = COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] =='0')
{
mine[x][y] = '1';
count--;
}
}
}
//排查雷
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int a = 0;
int b= 0;
int win = 0;
while(win<row*col-COUNT){
printf("请输入您的坐标:");
scanf("%d", &a);
scanf("%d", &b);
// a = a / a * a;
// b = b / b * b;
if ((a <= row + 1 && a > 0) && (b <= col + 1 && b > 0))
{
if (mine[a][b] == '1')
{
system("cls");
printf("很抱歉,您被炸死了。\n");
Displayboard(mine, ROW, COL);
Sleep(1000);
break;
}
else
{
int count=Getminecount(mine,a,b);
show[a][b] = count+'0';
system("cls");
Displayboard(show, ROW, COL);
win++;
}
}
else
{
printf("您输入的坐标有误,请重新输入:\n ");
}
}
if (win == row * col - COUNT)
{
printf("恭喜你,排雷成功。\n");
Displayboard(show, ROW, COL);
}
}
//统计周围雷的个数
int Getminecount(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] +
mine[x - 1][y] - 8 * '0');
}
void menu()
{
printf(" ---------------------------- \n");
printf("| 1.play |\n");
printf("| 0.exit |\n");
printf(" ---------------------------- \n");
}
void game()
{
char mine[ROWS][COLS];
char show[ROWS][COLS];
//初始化数据
Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');
//棋盘打印
//Displayboard(mine, ROW, COL);
Displayboard(show, ROW, COL);
//布置雷
Setmine(mine, ROW, COL);
//排查雷
Findmine(mine, show, ROW, COL);
//Displayboard(show, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do {
menu();
printf("请选择>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始!\n");
Sleep(1000);
system("cls");
game();
break;
case 0:
printf("\n即将退出游戏!\n");
break;
default :
printf("您的选择有误,请重新输入:\n");
}
} while (input);
return 0;
}