main
这一部分的作用是打印菜单,以及进入游戏的基本内容,这里srand是一个生成随机数的函数,采用,do…while,输入内容后可以通过break跳出循环。
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择\n");
scanf_s("%d", &input);
switch (input)
{
case 1 :
printf("扫雷\n");
game();
break;
case 0 :
break;
default:
break;
}
} while (1);
return 0;
}
menu
void menu()
{
printf("**************************************\n");
printf("*** 欢迎 **\n");
printf("*** 按下1开始游戏 **\n");
printf("*** 按下0退出游戏 **\n");
printf("**************************************\n");
}
game函数部分
这个部分主要是负责棋盘的打印,下棋,雷区的布置,注意,这里使用了两个数组,一个用于接收雷区及初始值的的生成,相关点的“雷”的数量确定,另一个接收用户输入
void game()
{
//思路为:分为两个部分,
//第一个数组存放已经布置的雷区信息,
//第二个数组为排除出的雷区信息
//要实现9*9的棋盘,那么用11*11的棋盘较好
char mine[ROWS][COLS]={0};//用于存放布置好的雷的信息
char show[ROWS][COLS]={0};//存放排查出的雷的信息
InitBoard(mine,ROWS,COLS,'*');//初始化棋盘
InitBoard(show, ROWS, COLS,'0');//注意一点,不要用字符串!!
//打印棋盘
DisplayBoard(show, ROWS, COLS);
SetMine(mine, ROW, COL);
DisplayBoard(mine, ROWS, COLS);//第一个数组存放已经布置的雷区信息,
FindMine(mine, show, ROW, COL);
}
相关函数的具体实现
#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)
{
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 = 10;
while (count)
{
//随机的下表
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y]=='0')
{
mine[x][y] = '1';
count--;
break;
}
}
}
//static-静态局部变量
// 修饰全局变量
// 修饰函数
static int get_mine_count(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 - 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;
printf("请输入坐标\n");
scanf_s("%d,%d", &x, &y);
//判断输入坐标的合法性
if (x>=1 && x<= row && y>=1 && y<=col)
{
if (mine[x][y]=='1')
{
printf("你被炸死了\n");
DisplayBoard(mine, row, col);
}
else
{
//如果不是的话,那么统计下,x,y周围坐标的地雷
int count = get_mine_count(mine, x, y);
show[x][y] = count;
DisplayBoard(show, row, col);
}
}
else
{
printf("坐标不合法\n");
}
}
相关函数的声明
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
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 board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col);
//解决雷
int get_mine_count(mine, x, y);