构建test.c文件,让我们有方向。
#include"mine_game.h"
void menu()
{
printf("************************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("************************\n");
}
void game()
{
srand((unsigned int)time(NULL));
char mine[ROWS][COLS];
char show[ROWS][COLS];
InitChessBoard(mine, '0');
InitChessBoard(show, '*');
//埋雷
SetMine(mine);
//打印show棋盘
Print_Board(show);
//排查雷
FindMine(mine, show);
}
int main()
{
int n = 0;
do
{
menu();
printf("请输入:");
scanf("%d", &n);
switch (n)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入:");
}
} while (n);
return 0;
}
在test文件中,简易版扫雷的二维数组固定(如果想要选择难度--开辟空间malloc二级指针+for循环,再malloc一级指针)
show的棋盘是给用户看的,mine棋盘是埋雷的棋盘。
初始化棋盘比(埋雷,排查雷,打印棋盘)大一圈,因此有COL,ROW和COLS,ROWS
do...while循环是为了让用户可以自己选择玩游戏还是退出游戏
创建mine_game.h文件(包含头文件,#define,函数的声明)
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
struct game_parameter;
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define COUNT 10
//棋盘的初始化
void InitChessBoard(char arr[ROWS][COLS], char type);
//打印棋盘
void Print_Board(char arr[ROWS][COLS]);
//埋雷
void SetMine(char arr[ROWS][COLS]);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);
传参都是要传完整的二维数组,所以是COLS,ROWS
#define COUNT是雷的数量
明确扫雷游戏的步骤:初始化棋盘,埋雷,打印show棋盘,排查雷(排查一次就打印一次show棋盘)
mine_game.c文件(完善各个步骤的函数)
#define _CRT_SECURE_NO_WARNINGS 1
#include"mine_game.h"
void InitChessBoard(char arr[ROWS][COLS], char type)
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = type;
}
}
}
//埋雷
void SetMine(char arr[ROWS][COLS])
{
int count = COUNT;
while (count)
{
int x = rand() % ROW + 1;
int y = rand() % COL + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
//打印棋盘
void Print_Board(char arr[ROWS][COLS])
{
for (int i = 0; i <= ROW; i++)
{
printf("%d ", i);
}
printf("\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");
}
}
//统计周围雷的个数
int surrounding_mine(char mine[ROWS][COLS],int x,int y)
{
int count = 0;
for (int i = x-1; i <= x+1; i++)
{
for (int j =y-1; j <=y+1; j++)
{
count += (mine[i][j] - '0');
}
}
return count;
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{
int x, y;
int win = 0;
while (win < ROW * COL - COUNT)
{
printf("请输入想要排查的坐标:\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了!\n");
Print_Board(mine);
break;
}
else
{
int n = surrounding_mine(mine,x,y);//统计周围雷的个数
show[x][y] = n + '0';
if (show[x][y] == '0') show[x][y] = ' ';
Print_Board(show);
}
}
else
{
printf("坐标非法,请重新输入:");
}
}
if (win == ROW * COL - COUNT)
{
printf("恭喜你,排雷成功");
Print_Board(mine);
}
}
埋雷:雷的产生-->rand产生随机数,给x,y,从而拥有一个随机坐标(从中需要判断这个坐标是否已经有雷)
打印棋盘:为了方便找到坐标,所以一并打印横坐标和纵坐标的1--9
统计周围雷的个数:因为(x,y)坐标没有雷,所以两层for循环,把9个位置统计起来,转换成int类型作为返回值。
排查雷:周围有雷,show[x][y]=周围雷的个数。
没有雷,打印空