一.什么是扫雷
《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
二.怎么玩扫雷
以windows XP自带扫雷winmine.exe为例(其它版本的扫雷游戏与之大同小异)。游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。
三.代码实现过程
(此代码是非常初级的代码,只能实现少部分功能)
//game.h文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define X 9
#define Y 9
#define XS X+2
#define YS Y+2
#define EASY 50
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void start_game();
void menu();
void Init(char board[XS][YS], char set);
void Print(char board[XS][YS]);
void game();
void Setmine(char mine[XS][YS]);
void Findmine(char mine[XS][YS], char show[XS][YS]);
int num_mine(char mine[XS][XS], int a, int b);
//test.c文件
int main()
{
start_game();
return 0;
}
//game.c文件
void menu()
{
printf("____________________\n");
printf("| |\n");
printf("| 1.play |\n");
printf("| 0.exit |\n");
printf("|__________________|\n");
}
void Init(char board[XS][YS], char set)
{
for (int i = 0; i < XS; i++)
for (int j = 0; j < YS; j++)
board[i][j] = set;
}
void Print(char board[XS][YS])
{
//打印列号
for (int i = 0; i <= X; i++) {
if (i == 0) printf(" ");
else if (i == X) printf("%d列 \n\n", i);
else printf("%d列 ", i);
}
//只打印中间的部分
for (int i = 1; i <= X; i++)
{
//打印行号
printf("%d行 ", i);
for (int j = 1; j <= Y; j++)
{
printf(" %c ", board[i][j]);
}
printf("\n\n");
}
printf("\n");
}
void Setmine(char mine[XS][YS])
{
srand((unsigned int)time(NULL));//打破伪循环
int count = EASY;
while (count)//每布置一个count-- 到0跳出循环
{
int x = rand() % X + 1;
int y = rand() % Y + 1;
if (mine[x][y] != '1')
{
mine[x][y] = '1';
count--;
}
}
}
void Findmine(char mine[XS][YS], char show[XS][YS]) {
int win = 0;
while (win<X*Y-EASY)
{
printf("请输入行列得以排查雷:");
int a = 0, b = 0;
scanf("%d %d", &a, &b);
if (a >= 1 && a <= X && b >= 1 && b <= Y)
{
if (mine[a][b] == '1')
{
printf("你被炸到了,%d行%d列有雷\n", a, b);
Print(mine);
break;
}
else if (mine[a][b] == '0')
{
//'0'-'0'=0 48-48=0
//'1'-'0'=1 49-48=0
int num = num_mine(mine, a, b);
show[a][b] = '0' + num;//该处是字符非数字
Print(mine);//!!!test !!!
Print(show);//!!!test !!!
win++;
}
if (win == X * Y - EASY)
{
printf("感谢您排雷成功!\n");
Print(show);
}
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
int num_mine(char mine[XS][XS],int a,int b)
{
int sum = 0;
for (int i = a - 1; i <= a + 1; i++)
{
for (int j = b - 1; j <= b + 1; j++)
{
if (mine[i][j] == '1' && !(i == a && j == b))
{
sum++;
}
}
}
return sum;
}
void game()
{
char mine[XS][YS] = { 0 };
char show[XS][YS] = { 0 };
Init(mine, '0');//初始化雷数组
Init(show, '*');//初始化显示界面
Print(show);//显示初始界面
Setmine(mine);//布置雷
Print(mine);//显示雷数
Findmine(mine, show);
}
void start_game()
{
int input = 1;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 0:
printf("游戏结束\n");
break;
case 1:
game();
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
}