声明:本人技术不精,如有错误,有请指正
用词可能不是很规范,望专业人士见谅
先展示代码(并不美观,望见谅)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define row 4
#define clu 4
#define volume 10
char arr[row][clu] = { 0 };
char ar[row + 2][clu + 2] = { 0 };
void meau1()
{
printf("***************************\n");
printf("********0.退出游戏*********\n");
printf("********1.进入扫雷*********\n");
printf("***************************\n");
}
void print1(char a[row][clu])
{
for (int i = 0; i < clu + 1; i++)\\横坐标轴
{
printf("%2d", i);
}
printf("\n");
for (int i = 0; i < row; i++)
{
printf("%2d", i + 1);\\纵坐标轴
for (int p = 0; p < clu; p++)
{
printf("%2c", a[i][p]);
}
printf("\n");
}
}
void setmine()
{
int count = volume;
while (count)
{
int x = rand() % row + 1;
int y = rand() % clu + 1;
ar[x][y] = '1';
count--;
}
}
void search(int x, int y)
{
int n = 0;
printf("这里没有地雷\n");
if (ar[x + 1][y] == '1')
n++;
if (ar[x][y + 1] == '1')
n++;
if (ar[x + 1][y + 1] == '1')
n++;
if (ar[x - 1][y - 1] == '1')
n++;
if (ar[x + 1][y - 1] == '1')
n++;
if (ar[x - 1][y + 1] == '1')
n++;
if (ar[x - 1][y] == '1')
n++;
if (ar[x][y - 1] == '1')
n++;
arr[x - 1][y - 1] = n + '0';
}
void game()
{
char s;
while (scanf("%c", &s) != 'o')
{
int l, m;
print1(arr);
scanf("%d %d", &l, &m);
if (ar[l][m] == '1')
{
printf("你失败了\n");
break;
}
else
{
search(l, m);
}
}
meau1();
int a = 0;
scanf("%d", &a);
if (a == 1)
{
game();
}
}
int main()
{
srand(time(NULL));
for (int i = 0; i < row; i++)
{
for (int p = 0; p < clu; p++)
{
arr[i][p] = '*';
}
} \\数组初始化
for (int i = 0; i < row + 2; i++)
{
for (int p = 0; p < clu + 2; p++)
{
ar[i][p] = '0';
}
}
setmine(); \\设雷
meau1(); \\弹出菜单
int a = 0;
scanf("%d", &a);
if (a == 1)
{
game();
}
for (int i = 1; i < row + 1; i++)
{
for (int p = 1; p < clu + 1; p++)
{
printf("%2c", ar[i][p]);
}
printf("\n");
}
return 0;
}
游戏内容:
不完备的扫雷游戏(连续的零不会清除,和传统扫雷不同
可以自定义雷场大小和雷数量
可以重复游玩
框架
开始菜单
void meau1()
{
printf("***************************\n");
printf("********0.退出游戏*********\n");
printf("********1.进入扫雷*********\n");
printf("***************************\n");
}
选择
游戏(可重复游玩)
展示数组和雷分布数组的初始化
为什么要两个数组?它们需要不一样大吗?分别需要多大?
定义数组
char arr[row][clu] = { 0 };
char ar[row + 2][clu + 2] = { 0 };//这里有说法,查找雷的时候为了避免越界故加大数组
ar为雷的数组(用于查找雷,不能改变)
示例(最下面)
打表
for (int i = 1; i < row + 1; i++)
{
for (int p = 1; p < clu + 1; p++)
{
printf("%2c", ar[i][p]);//占两位(防止错位)
}
printf("\n");
}
arr为展示数组(用于展示需要变化)
如上图(上面一个矩阵)
需打印坐标轴方便游玩
void print1(char a[row][clu])
{
for (int i = 0; i < clu + 1; i++)
{
printf("%2d", i);
}
printf("\n");
for (int i = 0; i < row; i++)
{
printf("%2d", i + 1);
for (int p = 0; p < clu; p++)
{
printf("%2c", a[i][p]);
}
printf("\n");
}
}
雷的布置
void setmine()
{
int count = volume;
while (count)
{
int x = rand() % row + 1;//使得x范围为1~9,下同
int y = rand() % clu + 1;
ar[x][y] = '1';
count--;
}
}
rand函数需要头文件<stdlib.h>
srand函数构建真随机
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include"meau.h"
#define row 4
#define clu 4
#define volume 10
int main()
{
srand(time(NULL));
return 0;
}
time函数需要头文件<time.h>
main函数中其他函数已经略去
row为定义的雷场行数
clu为定义的雷场列数
volume为定义的雷数
三者都能改变
重复游玩的实现(while)
二维数组的矩阵打印(构造函数)
雷的查找和雷数的显示
void search(int x, int y)
{
int n = 0;
printf("这里没有地雷\n");
if (ar[x + 1][y] == '1')
n++;
if (ar[x][y + 1] == '1')
n++;
if (ar[x + 1][y + 1] == '1')
n++;
if (ar[x - 1][y - 1] == '1')
n++;
if (ar[x + 1][y - 1] == '1')
n++;
if (ar[x - 1][y + 1] == '1')
n++;
if (ar[x - 1][y] == '1')
n++;
if (ar[x][y - 1] == '1')
n++;
arr[x - 1][y - 1] = n + '0';
}