扫雷小游戏
- 首先我我们分析一下扫雷的玩法,点中格子,有炸弹游戏结束,没有炸弹需要提示这个格子的四周一圈又多少个雷,并且把这个数字写在格子里。最后排出所有雷,游戏胜利。
需要创建的文件有
test.c : 用来书写主函数和开始的选择菜单部分
game.c:函数的实现放在此处
game.h :函数的声明和需要引用的头文件
游戏实现思路
- 创建两个二维数组,来模拟两个棋盘,第一个mine棋盘11x11是没有炸弹的。之所以是11x11我们是希望未来在计算炸弹个数的,不会越界,因为展现的棋盘的规模是9x9
- 第二个show棋盘是用来存放炸弹的,随机的存放10个炸弹,并且它将来是需要打印给玩家看的。
- 接下来玩家需要排查炸弹,排查炸弹是需要统计格子周围的炸弹数目,如果有炸弹炸死,游戏结束。如果没有炸弹,需要得到周围炸弹的个数并且将它打印在show的棋盘中展现给用户。
具体实现代码
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"
void menu()
{
printf(" ******* 1开始游戏 **********\n");
printf(" ******* 0退出游戏 **********\n\n");
}
void game()
{ //创建存储雷的两个数组
char mine[ROWS][COLS] = { 0 }; //布置雷的棋盘
char show[ROWS][COLS] = { 0 }; // 排查后显示雷的棋盘
//初始化两个棋盘的函数
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盘看看
//DisplayBoard(mine, ROW, COL );
//DisplayBoard(show, ROW, COL);
//放置炸弹
SetMine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL); //打印看看炸弹
DisplayBoard(show ,ROW, COL);
//排查炸弹
FindMine(mine,show, ROW, COL);
}
void test ()
{
int input = 0;
srand((unsigned int)time(NULL)); //得到一个随机数 后面放置炸弹需要
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
printf("\n");
break;
default:
system("cls");
break;
}
} while (input);
}
int main()
{
test();
}
game.h文件
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 9 //期望棋盘规模 目前是9x9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10 //放置炸弹的个数 目前是10个
#include <stdio.h>
#include<time.h>
#include <stdlib.h>
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set); //初始化棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col); // 打印棋盘
void SetMine(char mine[ROWS][COLS], int row, int col); //放置炸弹
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col); // 排除炸弹
game.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[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++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col) //传的是11的棋盘,但是只打印99棋盘
{
int i = 0;
int j = 0;
for (i = 0; i <= col; i++) //打印棋盘的横坐标 方便查看
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i); //打印棋盘的纵坐标 方便查看
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]); //打印棋盘
}
printf("\n");
}
}
void SetMine(char mine[ROWS][COLS], int row, int col) //设置炸弹
{
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1; // 炸弹的设置范围是是随机值1 -9坐标
int y = rand() % col + 1;
if (mine[x][y] == '0')//放置炸弹到
{
mine[x][y] = '1';
count--;
}
}
}
int GetMineCount(char mine[ROWS][COLS], 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][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * '0'); //一开始炸弹是字符数字 字符数字 减去字符零 才是数字
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) //排除炸弹
{
int x = 0;
int y = 0;
int win = 0;
while (win < row*col - EASY_COUNT) //不是炸弹的个数
{
printf("请输入要排查的坐标,格式:行 空格 列 回车");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1') //放'1'的位置代表炸弹
{
printf("噼里啪啦,被炸倒了,游戏结束\n");
DisplayBoard(mine, row, col);
break;
}
else
{
int count = GetMineCount(mine, x, y);//统计雷的个数环绕一圈
show[x][y] = count + '0'; //数字加字符零 = 字符数字 将雷的个数存在show棋盘中
system("cls");
DisplayBoard(show, row, col); //排一次雷 打印一次结果
win++; //统计排雷次数
}
}
else
{
printf("输入坐标有误,请重新输入!\n");
}
}
if (win == row * col - EASY_COUNT) //游戏结束的条件
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, row, col);
}
}
运行结果