一:构思
①创建两个棋盘(一个用来显示,一个用来储存信息)
②初始化棋盘
③利用随机数将棋盘布雷
④用户输入进行扫雷
⑤输出棋盘
二:核心知识
①创建棋盘因为要统计周围八个空格内的雷数,故边界需要特殊考虑,不如多创建两行两列(例如9x9的棋盘创建时创建11x11,print输出时只输出9x9即可)
②初始化棋盘通过for遍历一遍二维数组即可
③布雷时利用srand()和rand()布置即可,注意随机数要在9x9中央棋盘范围内
④用户输入时,先判断是否在合理范围,如果是合理范围,先判断是不是雷,如果不是雷,遍历周围八个数,输出雷的个数在展示棋盘中
⑤输出棋盘只需要遍历数组即可
附代码:
1.game.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define row 9
#define line 9
#define rows 11
#define lines 11
#define number 10
void initbord(char bord[rows][lines], char rest);
void print(char bord[rows][lines]);
void setbord(char bord[rows][lines]);
void findbord(char bord[rows][lines], char show[rows][lines]);
2.game.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void initbord(char ret[rows][lines],char rest)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < lines; j++)
{
ret[i][j] = rest;
}
}
}
void print(char bord[rows][lines])
{
printf(" -----------------");
printf("\n");
printf(" 1 2 3 4 5 6 7 8 9");
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= line; j++)
{
printf("%c ", bord[i][j]);
}
printf("\n");
}
}
void setbord(char bord[rows][lines])
{
int cont = number;
while (cont)
{
int x = rand() % row + 1;
int y = rand() % line + 1;
if (bord[x][y] == '0')
{
bord[x][y] = '1';
cont--;
}
}
}
int sum(char bord[rows][lines], int x, int y)
{
return bord[x + 1][y] + bord[x][y] + bord[x - 1][y] +
bord[x][y + 1] + bord[x + 1][y + 1] + bord[x - 1][y + 1] +
bord[x][y - 1] + bord[x + 1][y - 1] + bord[x - 1][y - 1] -
9 * '0';
}
void findbord(char bord[rows][lines], char show[rows][lines])
{
int i = 0;
int j = 0;
int cont = number;
while (row*line - cont)
{
printf("请输入坐标>");
scanf("%d %d", &i, &j);
if (i < 1 || i >9 || j < 1 || j >9)
printf("输入错误");
else if (bord[i][j] == '1')
{
printf("BOOM\n");
print(bord);
break;
}
else {
int ret = sum(bord, i, j);
show[i][j] = ret + '0';
print(show);
cont++;
}
if (row * line == cont)
{
printf("恭喜你,扫雷成功\n");
}
}
}
3.text.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu(void)
{
printf("1.play\n");
printf("0.exit\n");
}
void game(void)
{
char bord[rows][lines] = { 0 };
char show[rows][lines] = { 0 };
initbord(bord,'0');
initbord(show,'*');
//print(bord);
print(show);
setbord(bord);
//print(bord);
findbord(bord , show);
}
int main()
{
int i = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择>\n");
scanf("%d", &i);
switch (i)
{
case 1 :
printf("游戏开始\n");
game();
break;
case 0 :
printf("游戏结束\n");
break;
default :
printf("输入错误,请重新输入\n");
break;
}
} while (i);
}