首先我们可以创建一个9*9的棋盘,为了后面好区分,我们创建两个9*9的棋盘mine和show。(为了区分雷用'1'表示,mine初始化用'0'表示)
1.mine棋盘:里面主要实现存储存雷以及实现相关的计算(计算是为了在show棋盘里面展示最终的结果)。
2.show棋盘:就是展示周围雷的总数,来进行一个交互式的简单界面。(show初始化用'*'表示)
一.我们要先在main函数里创建好基本实现路线.
(步骤1:text.c中实现总的步骤如下:)
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("***********************************\n");
printf("*********** 1.paly ***********\n");
printf("*********** 0.exit ***********\n");
printf("***********************************\n");
}
void game()
{
char mine[ROWS][COLS]; //存放布置好的雷
char show[ROWS][COLS]; //存放排查出雷的信息
//初始化棋盘(初始化的是11*11)
//1. mine数组全是'0'
//2. show数组全是'*'
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盘(打印9*9)
DisplayBoard(show, ROW, COL);
//1.布置雷(雷用'1'来表示)
SetMine(mine, ROW, COL);
//2.排查雷
FindMine(mine, show, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL)); //设置好随机数种子(随时间改变)
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 0:
{
printf("退出游戏!\n");
}
break;
case 1:
{
game();
}
break;
default:
printf("选择错误,重新选择!");
}
break;
} while (input);
return 0;
}
二.game函数里面是实现游戏的重要部分
首先创建mine和show两个11*11的数组(ROWS=COLS=11),但是展示部分还是9*9,这是因为防止在后面操作中造成边界上计算雷的总数的时候会有出界的情况。这里,蓝色区域是9*9的棋盘,绿色部分是为防止越界操作,补上的棋盘。
二.在game函数里实现玩游戏的操作。
(1)InitBoard() 初始化棋盘的函数:遍历棋盘初始化(mine棋盘用'0'初始化,show用'*'初始化)。
(2)DisplayBoard() 打印棋盘的函数:遍历棋盘打印。
(3) SetMine() 放置雷的函数:用srand函数、rand函数和time函数实现出现随机雷,然后判断出现的坐标是否合法(合法判断:row和col在[1-9]取得),合法就布置雷
(4)FindMine() 排查雷的函数:将输入得坐标(x,y)传入FindMine()函数中实现,用GetMineCount函数遍历(x,y)周围8个方向在mine棋盘中的位置上的字符,相加后进行计算得到(x,y)周围雷的总数sum,然后在将该总数sum赋值给show棋盘,打印出来。
(步骤二:game.c中实现游戏的功能实现,如下)
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROWS][COLS], int row,int col, char set)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("--------------扫雷游戏------------\n");
for (i = 0; i <= row; 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 board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT; //布置count个雷
while (count)
{
//下标范围x:[1-9] y[1-9]
int x = rand() % row + 1; //设置随机出现雷的行标
int y = rand() % col + 1; //设置随机出现雷的列标
if (board[x][y] == '0') //如果此处没有雷('1'),就布置雷
{
board[x][y] = '1';
count--;
}
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
//左上+正上+右上+正左+正右+左下+正下+右下
return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + 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 sum = 0;
while (sum < row * col - EASY_COUNT) //总空格-总雷数
{
printf("请输入要排查的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col) //判断坐标合法
{
if (mine[x][y] == '1') //坐标是雷
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(mine, ROW, COL); //查看所有雷的位置
break;
}
else
{
//该位置不是雷,就要计算8个方位其雷的总个数
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
DisplayBoard(show, ROW, COL); //查看所有雷的布局
sum++;
}
}
else
{
printf("坐标非法,重新输入!\n");
}
}
if (sum == row * col - EASY_COUNT) //排查完所有空格,只剩下雷
{
printf("恭喜你,排雷成功,游戏通关!\n");
DisplayBoard(mine, ROW, COL); //查看所有雷的布局
}
}
(步骤三:game.h实现game中函数的声明,以及其他头文件的引用,宏定义变量)
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9 //棋盘是9*9的
#define COL 9
#define ROWS ROW+2 //操作的棋盘是11*11的
#define COLS COL+2 //防止边界处出界计算方格
#define EASY_COUNT 10 //雷的个数是10
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int row, int col, 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);
以上就是全部代码和实现思路。