Hello,大家好!!!这里是小周为您带来的呕心沥血之作------C语言秘籍!!
C语言秘籍分为初阶和高阶两部!!跟着小周学定会让你C语言功力大成,称霸武林,话不多说,我们接着上回继续开讲!!!!!
一、游戏介绍

这是一个9×9的棋盘,有10个雷在其中


游戏的目标是在不触发地雷的情况下,揭示所有没有地雷的区域。玩家通过揭开方块来进行游戏,每个方块可能会显示数字或者是一个地雷。数字表示周围八个方块中地雷的数量,而无数字的方块则是安全的。上图说明圈5的位置一定是雷,当揭开所有安全方块的时候,游戏结束
一、实现逻辑
1、扫雷游戏要存储布置好雷的信息,需要一个二维数组(不是雷:0 雷:1)

2、给2个二维数组 9*9
一个存放布置好的雷的信息,一个存放排查出的雷的信息
3、那点击边缘格子时,会导致数组越界,因为边界周围的区域并不是我们的空间,那我们想想能让他们成为我们自己的空间吗?
是可以的

4、为了让两个棋盘的坐标能完全对应,不用多余计算,同时防止在统计坐标周围雷的个数的时候越界,将两个棋盘都设置成11*11的
5、最开始存放布置好的雷的信息的棋盘显示'*',发现雷信息的时候改成对应数字,那么我们就可以将它设置成字符数组,存放字符'1'等信息
6、让这两个数组保持严格统一的话,最好将存放布置好的雷的信息的数组也设置成字符数组
二、代码分布
test.c -- 测试游戏的(main)
game.c -- 游戏的实现 game.h -- 游戏函数的声明
三、代码实现
1、这个游戏的开始界面等工作和三子棋基本一样,在这里不做过多赘述
test.c
#include"game.h"
void menu()
{
printf("***********************\n");
printf("***** 1. play *****\n");
printf("***** 0. exit *****\n");
printf("***********************\n");
}
void game()
{
char mine[ROWS][COLS];//存放布置好的雷
char show[ROWS][COLS];//存放排查出的雷的信息
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
}
game.h
#include<stdio.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
2、初始化这两个数组
//test.c
void game()
{
char mine[ROWS][COLS];//存放布置好的雷
char show[ROWS][COLS];//存放排查出的雷的信息
//初始化棋盘
//1、mine数组最开始是全'0'
//2、show数组最开始是全'*'
InitBoard(mine, ROWS, COLS,'0');//确定到底想初始化成什么,所以把初始化的内容作为参数传进去
InitBoard(show, ROWS, COLS,'*'); //确定到底想初始化成什么,所以把初始化的内容作为参数传进去
}
//InitBoard函数
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;//传这个set就是防止这块如果是某个固定字符写死
}
}
}
3、写一个打印函数看一下初始化的情况
我们只需要将中间的9*9打印出来即可,所以打印函数内部是从第1行打印的不是第0行
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf("-----扫雷游戏-----\n");
for (i = 1; i <= row; i++)
{
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
运行后我们发现

没有问题,但是数行和列太费劲,我们可以在第一行第一列之前把行号和列号加上
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf("-----扫雷游戏-----\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);//列数
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//行数
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
再次运行

完美的棋盘!
4、布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
//布置10个雷
//生成随机的坐标,布置雷
int count = EASY_COUNT;//在game.h中定义宏,方便后续游戏难度的升级
while (count)
{
int x = rand() % row + 1;//不要忘了rand的使用
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
验证一下是否布置成功
void game()
{
char mine[ROWS][COLS];//存放布置好的雷
char show[ROWS][COLS];//存放排查出的雷的信息
//初始化棋盘
//1、mine数组最开始是全'0'
//2、show数组最开始是全'*'
InitBoard(mine, ROWS, COLS,'0');//确定到底想初始化成什么,所以把初始化的内容作为参数传进去
InitBoard(show, ROWS, COLS,'*'); //确定到底想初始化成什么,所以把初始化的内容作为参数传进去
//打印棋盘
//DisplayBoard(mine,ROW,COL);//这里只是检验棋盘,正常游戏是不打印mine棋盘
DisplayBoard(show,ROW,COL);
//1、布置雷
SetMine(mine,ROW,COL);
DisplayBoard(mine, ROW, COL);
}

一共10个雷随机分布在棋盘中
5、排查雷
void FineMine(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')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
//该位置不是雷,就统计这个坐标周围有几个雷
int count = GetMineCount(mine, x, y);
show[x][y] = count+'0';//数字3+字符0=对应的字符3
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,重新输入");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功");
DisplayBoard(mine, ROW, COL);
}
}
6、计算周围8个方块的雷的数量

先要明确x,y这个坐标周围8个的确切坐标,方便访问计算,但是我们要挨个看每个块是不是1,这很麻烦要比较8次,一开始我将是雷规定为'1',不是雷规定为'0',为什么一开始我选择这么处理呢?
良苦用心就体现在这里,除了字符1就是字符0,数字1+字符0=对应的字符1,很方便计算雷的数量
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';
}
学会了自己下去敲代码,开始玩吧!!!
1万+

被折叠的 条评论
为什么被折叠?



