1.先明确要干什么
首先要一个99的棋盘,然后把棋盘打印出来,然后随机设置雷,点击,如果是雷就会爆炸,如果不是就显示附近雷的个数,当点完全部非雷的地方,游戏成功
2.用到的知识点:
数组:要有两个数组,一个用于给后排布置雷的位置,一个用于给玩家进行游戏。
原本方块是99的,但是边界上的也要有33的周边范围,所以要扩展原本的范围,下标要从0到10,
是11个数,则扩展为1111的正方形(可以自己画一个22的,然后把它扩展一圈,就要44的才可以)
循环:for(每一个位置要用横竖两个循环才可以表示出来)
while埋雷循环
do while 菜单反复
艾斯克码表:用这个来判断有多少个雷,因为’1’是49,'0’是48,如果用1表示雷,0表示非雷,就可以用它们的差表示有多少个雷
mine[x-1][y]+mine[x+1][y]+mine[x-1][y+1]+mine[x+1][y+1]+mine[x-1][y-1]
+mine[x+1][y-1]-8’0’
预处理\头文件:这里用到了宏定义,还有3个头文件
出现的步骤:1.打印菜单
2.棋盘初始化
3.打印棋盘
4.随机布置雷
5.排查雷
简易扫雷用到的全部知识点(不含递归)
- 预处理 / 头文件
- #define 宏定义(定义行数、列数、雷的数量, ROWS 、 COLS 、 EASY_COUNT )
- #include 头文件包含( stdio.h 、 stdlib.h 、 time.h )
- 基础语法
- 变量定义, int / char 类型
- do while 循环(菜单反复玩游戏)
- while 循环(埋雷循环)
- for 循环(两层for,初始化棋盘、打印棋盘)
- if 判断, switch 分支(菜单选择)
- 数组(重点)
- 二维char数组, char board[ROWS][COLS]
- 二维数组作为函数参数传递(这是很多人卡的地方)
- 数组下标从0开始,利用外围一圈下标做“围墙”,规避边界判断
- 字符与ASCII码(核心考点)
- 字符存储本质是ASCII值
- ‘1’-‘0’ :字符转数字
- 数字 + ‘0’ :数字转回字符(放到show棋盘)
- 随机数
- rand() 获取随机数
- srand((unsigned int)time(NULL)) 设置随机种子,放main里
- rand()%n +1 控制随机坐标范围
- 函数
- 自定义函数声明、定义、调用
- 函数传参
- 函数返回值(统计雷数量 GetMineCount 返回int)
- 多文件工程思想(加分项)
- .h 头文件:放宏、函数声明
- .c 源文件:写函数实现
- 多文件联合编译(考试很少讲)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_COUNT 10
char board[ROWS][COLS];
void menu()
{
printf(“…\n”);
printf(“…1.play…\n”);
printf(“…0.leave…\n”);
printf(“…\n”);
}
void InitBoard(char board[ROWS][COLS], int ROW,int COL, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
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 (j = 1; j <= COL; j++)
{
printf(“%d”, j);
}
for (i = 0; i <= ROW; i++)
{
printf(“%d\n”, 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 = 0;
while (count < MINE_COUNT)
{
int x = rand() % ROW + 1;
int y = rand() % COL + 1;
if (mine[x][y] == ‘0’)
{
mine[x][y] = ‘1’;
count++;
}
}
}
int GetMineCount(char board[ROWS][COLS], int x, int y)
{
return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + board[x][y - 1] + board[x][y + 1] + board[x + 1][y + 1] + board[x + 1][y] + board[x + 1][y - 1] - 8 * ‘0’;
}
void FindMine(char board[ROWS][COLS], char show[ROWS][COLS], int ROW, int COL)
{
int x = 0;
int y = 0;
int n = 0;
int win = 0;
while (win < ROW * COL - MINE_COUNT)
{
printf(“请输入”);
scanf(“%d%d”, &x, &y);
if ((x >= 1 && x <= 9) && (y >= 1 && y <= 9))
{
if (board[x][y] == ‘1’)
{
printf(“你被炸死了”);
DisplayBoard(board, ROW, COL);
break;
}
else
{
int cun = GetMineCount(board, x, y);
show[x][y] = cun + ‘0’;
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf(“你输入错误,重新输入”);
}
if (win == ROW * COL - MINE_COUNT)
{
printf(“游戏胜利”);
DisplayBoard(board, ROW, COL);
}
}
}
void game()
{
char mine[ROWS][COLS];
char show[ROWS][COLS];
InitBoard(mine, ROWS, COLS, ‘0’);
InitBoard(show, ROWS, COLS, ‘*’);
SetMine(mine, ROW, COL);
DisplayBoard(show, ROW, COL);
FindMine(mine, show, ROW, COL);
}
int main()
{
srand((unsigned int)time(0));
int input = 0;
do
{
menu();
scanf(“%d”, &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("leave game ");
break;
default:
printf(“重新输入”);
break;
}
} while (input);
return 0;
}
888



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



