cmd实现扫雷游戏(极简🤺版)
使用工具:VS2019
功能:
1、简单的扫雷游戏实现。
一、代码部分
头文件game.h:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define MINE_NUMBER 10 //地雷的个数
#define MAP_ROW 10 //地图的行数
#define MAP_COL 10 //地图的列数
//生成 MINE_NUMBER(10) 个 0-99 之间 各不相同的随机数
void randomDifferentNumber(int a[]);
//打印扫雷的地图
void drawMap(int map[][MAP_COL + 2]);
//设置地雷附近的数字
void setNumber(int mine[], int map[][MAP_COL + 2]);
源文件game.c:
#include "game.h"
//生成 MINE_NUMBER(10) 个 0-99 之间 各不相同的随机数
void randomDifferentNumber(int a[])
{
srand((unsigned)time(NULL));
bool same = false; //默认随机数不相同
//生成 MINE_NUMBER(10) 随机数
for (int i = 0; i < MINE_NUMBER; ++i)
{
xunhuan:a[i] = rand() % 100; //0-99
for (int j = 0; j < i; ++j)
{
if (a[j] == a[i]) //随机数相同,要处理
{
same = true;
break;
}
else
same = false;
}
if (same)
goto xunhuan;
}
//输出 MINE_NUMBER(10) 个随机数
for (int i = 0; i < 10; i++)
{
printf("第%2d个随机数为:%4d\n", i + 1, a[i]);
}
}
//打印扫雷的地图
void drawMap(int map[][MAP_COL + 2])
{
for (int i = 0 + 1; i < MAP_ROW + 1; ++i)
{
for (int j = 0 + 1; j < MAP_COL + 1; ++j)
{
printf("%3d", map[i][j]);
}
printf("\n");
}
}
//设置地雷附近的数字
void setNumber(int mine[], int map[][MAP_COL + 2])
{
for (int i = 0; i < MINE_NUMBER; ++i)
{
bool mine_flag = true; //周围没有地雷
int mine_row = mine[i] / MAP_ROW + 1;
int mine_col = mine[i] % MAP_COL + 1;
//↖没有地雷
if (map[mine_row - 1][mine_col - 1] != -1)
{
++map[mine_row - 1][mine_col - 1];
mine_flag = false;
}
//上面
if (map[mine_row - 1][mine_col] != -1)
{
++map[mine_row - 1][mine_col];
mine_flag = false;
}
//右上
if (map[mine_row - 1][mine_col + 1] != -1)
{
++map[mine_row - 1][mine_col + 1];
mine_flag = false;
}
//←
if (map[mine_row][mine_col - 1] != -1)
{
++map[mine_row][mine_col - 1];
mine_flag = false;
}
//右面
if (map[mine_row][mine_col + 1] != -1)
{
++map[mine_row][mine_col + 1];
mine_flag = false;
}
//左下角
if (map[mine_row + 1][mine_col - 1] != -1)
{
++map[mine_row + 1][mine_col - 1];
mine_flag = false;
}
//下面
if (map[mine_row + 1][mine_col] != -1)
{
++map[mine_row + 1][mine_col];
mine_flag = false;
}
//右下角
if (map[mine_row + 1][mine_col + 1] != -1)
{
++map[mine_row + 1][mine_col + 1];
mine_flag = false;
}
if (mine_flag)
{
++map[mine_row - 1][mine_col - 1];
++map[mine_row - 1][mine_col];
++map[mine_row - 1][mine_col + 1];
++map[mine_row][mine_col - 1];
++map[mine_row][mine_col + 1];
++map[mine_row + 1][mine_col - 1];
++map[mine_row + 1][mine_col];
++map[mine_row + 1][mine_col + 1];
}
}
}
源文件main.c:
#include "game.h"
int main()
{
//初始化 地雷的位置 为地图的0号地址
int mine[MINE_NUMBER] = { 0 };
//初始化 扫雷地图,并且设置缓冲区
int map[MAP_ROW + 2][MAP_COL + 2] = {
{999,999,999,999,999,999,999,999,999,999,999,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,999},
{999,999,999,999,999,999,999,999,999,999,999,999}
};
//设置 地雷的位置
randomDifferentNumber(mine);
printf("\n");
//把 MINE_NUMBER(10) 地雷放入大小 MAP_ROW×MAP_COL(10×10) 地图里面
for (int i = 0; i < MINE_NUMBER; i++)
{
map[mine[i] / MAP_ROW + 1][mine[i] % MAP_COL + 1] = -1;
}
//设置地雷附近的数字
setNumber(mine, map);
//打印大小 MAP_ROW×MAP_COL(10×10) 地图
drawMap(map);
system("pause");
return 0;
}