扫雷这个小游戏大家都知道,这里讲解简单版本的扫雷,即点到一个位置显示出周围8个位置雷的数量。
首先思路:
1.
因为需要对雷进行显示,布置两个棋盘。一个棋盘用来布置雷的信息,另一个棋盘用来展示给用户看来使游戏继续进行。用二维数组来存游戏的信息。
2.
这里以9*9的棋盘为例。
为了不越界,布置的棋盘要大一圈
那布置雷的大一圈,为了保持数组坐标同步,那就让排查雷的也大一圈,在其中9*9的内部操作。
3.
初始化mine和show数组,一个全‘0’,一个全‘*’。
初始化的时候,把初始化内容也通过函数参数带过去。
4.
打印棋盘,把show棋盘打印出来
11*11的数组,但是只显示中间的9*9
注意,打印棋盘行列标的时候多运行程序进行改进。
5.
布置雷,在打印前
布置雷,在9*9的棋盘里面 用rand函数来布置布置,count个雷
注:有雷的地方不再布置
6.排雷
点到雷 炸死
不是雷 创建个新函数看周围有几个雷打印出来
一开始用0和1来布置棋盘,目的是:ASCII码相减正好是1,方便统计
排查到一个显示一个(打印一次棋盘)
game.h游戏中用到的头文件及函数声明
#define _CRT_SECURE_NO_WARNINGS 1
#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 10
#define MIDDLE 20
#define DIFFICULT 30
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);
//打印
void display_board(char arr[ROWS][COLS], int rows, int cols);
//布置雷
void set_boom(char arr[ROWS][COLS], int row, int col);
//排雷
void clear_boom(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
//创建
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化
init_board(mine, ROWS, COLS, '0');
init_board(show, ROWS, COLS,'*');
//打印
display_board(show, ROWS, COLS);
//布置雷
set_boom(mine, ROW, COL);
//display_board(mine, ROWS, COLS);
//排雷
clear_boom(mine,show, ROW, COL);
}
void menu()
{
printf("**************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("**************\n");
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始!\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误,请重新选择:\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
game.c游戏的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
//打印
void display_board(char arr[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i < rows-1; i++)
{
printf("%d ", i );
for (j = 1; j < cols-1; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
}
//布置雷
void set_boom(char arr[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = EASY;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
//显示输入坐标周围雷的信息
int sround(char arr[ROWS][COLS], int x, int y)
{
return arr[x - 1][y - 1]
+ arr[x - 1][y]
+ arr[x - 1][y + 1]
+ arr[x][y - 1]
+ arr[x][y + 1]
+ arr[x + 1][y - 1]
+ arr[x + 1][y]
+ arr[x + 1][y + 1] - 8 * '0';
}
//排雷
void clear_boom(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int pai = 0;
while(pai<row*col-EASY)
{
printf("请输入要排查雷的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
//炸到了
printf("哈哈哈哈哈哈哈你被炸死了\n");
display_board(mine, ROWS, COLS);
break;
}
else
{
//没炸到,打印周围雷的个数
int ret = sround(mine, x, y);
show[x][y] = ret + '0';
//打印下排查后的棋盘
display_board(show, ROWS, COLS);
pai++;
}
}
else
{
printf("坐标输入错误,请重新输入!\n");
}
}
if (pai == row * col - EASY)
{
printf("恭喜您,扫雷成功!\n");
}
}