首先,扫雷是一个游戏,本来我想着将随机生成的雷组成一个数组,用输入的坐标进行for循环一一对比,如果有在雷坐标两项数值+1~-1的范围里就显示周围有几个雷。
但由于代码的能力限制,各种报错,请教同学,他们让我去网上找资料。
我于b站上找到了相关课程,发现居然是直接用两个双维数组,在一个数组上赋值0表示空白,1表示雷,在另一个数组上输出用户游玩界面,有效规避了一些错误。
我将课程一字一句逐步看完,学会了简单的扫雷。
game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
#define LEI 10
#define ROWS ROW+2
#define COLS COL+2
//初始化棋盘
void Chushi(char arr[ROWS][COLS], int rows, int cols ,char set);
//打印棋盘
void Print(char arr[ROW][COL], int row, int col);
//布置雷
void SetLei(char arr[ROW][COL], int row, int col);
//排查雷
void FindLei(char mine[ROW][COL], char show[ROW][COL], int row, int col);
//数周围雷数
int getLei(char mine[ROW][COL], int x, int y);
game.c
#include "game.h"
//初始化扫雷
void Chushi(char arr[ROWS][COLS], int rows, int cols, char set) {
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++) {
arr[i][j] = set;
}
}
}
//打印棋盘
void Print(char arr[ROW][COL], int row, int col) {
printf("--------扫雷--------\n");
for (int i = 0; i <= row; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("--------扫雷--------\n");
}
//布置雷
void SetLei(char arr[ROW][COL], int row, int col) {
int count = LEI;
while (count)
{
int x = rand() % row;
int y = rand() % row;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
//输入坐标 判断坐标
void FindLei(char mine[ROW][COL], char show[ROW][COL], int row, int col) {
int a = 0; int b = 0; int win = 0;
//判断是否踩到雷了
while (win < ROW * COL - LEI)
{
printf("请输入要排查的坐标:");
scanf("%d %d", &b, &a);
if (a >= 1 && a < row && b >= 1 && b < col) {
if (mine[a][b] == '1')
{
printf("*****************\n");
printf(" 您 被 炸 死 了 !\n");
printf("*****************\n");
Print(mine, ROW, COL);
break;
}
else {
//判断周围的雷数并在show里打印出来
int n = getLei(mine,a,b);
show[a][b] = n + '0';
Print(show, ROW, COL);
win++;
}
}
else
{
printf("您输入的坐标不合法,请重新输入!");
}
}
//判断赢了没
if (win == ROW * COL - LEI) {
printf("---------------------\n");
printf("恭 喜 您,您 赢 了 !");
printf("---------------------\n");
Print(mine, ROW, COL);
}
}
//输出周围雷的数字
int getLei(char mine[ROW][COL], int x, int y)
{
int count = 0;
for (int i = -1; i <= 1; i++)
{
if ((mine[x + i][y] == '1') || (mine[x][y + i] == '1') || (mine[x + i][y + i] == '1') || (mine[x + i][y - i] == '1'))
{
count++;
}
}
return count;
}
test.c
#include "game.h"
//菜单
void menu() {
printf("**********************\n");
printf("****1、进入游戏 ****\n");
printf("****0、退出游戏 ****\n");
printf("**********************\n");
}
void game() {
srand((unsigned)time(NULL));
char mine[ROWS][COLS];
char show[ROWS][COLS];
//初始化棋盘
Chushi(mine, ROWS, COLS ,'0');
Chushi(show, ROWS, COLS, '*');
//打印棋盘
/*Print(show, ROW, COL);*/
//布置雷
SetLei(mine, ROW, COL);
/*Print(mine, ROW, COL);*/
//排查雷
FindLei(mine,show, ROW, COL);
Print(show, ROW, COL);
}
int main() {
int input = 0;
do
{
menu();
printf("请输入:");
scanf("%d",&input);
switch (input)
{
case 1:
printf("您进入了游戏!\n");
game();
break;
case 0:
printf("您退出了游戏\n");
break;
default:
printf("请重新输入有效值\n");
break;
}
} while (input);
return 0;
}