基于上次三子棋的制作,看到目前所学还能编一下扫雷,经过将近两天的努力终于手搓出来了。
这次是完全自己手搓,但框架三子棋那个依旧适用,内容依旧比较粗糙,感觉很多地方,还能优化但是目前没想到。好了,代码如下:
首先是框架也就是在test.c原文件的主函数
#include "ADD.h"
void menu()
{
printf("**************************\n");
printf("**** 1.play 0.exit ****\n");
printf("**************************\n");
}
void game()
{
char arr[HANG][LIE] = { 0 };
char arr1[HANG][LIE] = { 0 };
chushihua(arr1, HANG, LIE);//填充,这是表面的arr1,防止开始玩就知道雷在哪里。
chushihua(arr, HANG, LIE);//填充,这是幕后的arr(雷就被埋到这里面)
chushihua3(arr, HANG, LIE);//布雷,这里的雷埋在arr里面
chushihua2(arr1, HANG, LIE);//棋盘
neirong1(arr,arr1, HANG, LIE);
}
int main()//扫雷
{
int input = 0;
do//用do..while循环实现游戏
{
menu();//打印游戏开始界面
printf("请选择:");
scanf("%d", &input);
switch (input)//这里实现选择
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误,请重新输入!!");
}
} while (input);//这里对应了上面的选择“1”为真“0”为假自动跳出循环
return 0;
}
然后是需要放在“ADD.h”里的头文件,宏定义以及函数申明。
#define HANG 10
#define LIE 10
#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>
void chushihua(char arr[HANG][LIE],int hang,int lie);
void chushihua2(char arr[HANG][LIE],int hang,int lie);
void neirong1(char arr[HANG][LIE],char arr1[HANG][LIE], int hang, int lie);
void chushihua3(char arr[HANG][LIE], int hang, int lie);
void chushihua4(char arr1[HANG][LIE], int hang, int lie);
接下来是实现我们需要调用的函数,这个在“ADD.h”的原文件里。
#include "ADD.h"
void chushihua(char arr[HANG][LIE],int hang,int lie)
{
int i = 0;
for (i = 0; i < hang; i++)
{
int j = 0;
for (j = 0; j < lie; j++)
{
arr[i][j] = ' ';
}
}
}
void chushihua2(char arr1[HANG][LIE],int hang,int lie)
{
int i = 0;
for (i = 0; i < hang;i++)
{
int j = 0;
for (j = 0; j < lie; j++)
{
if (j == lie - 1)
{
printf(" %c ", arr1[i][j]);
break;
}
printf(" %c |", arr1[i][j]);
}
printf("\n");
for (j = 0; j < lie ; j++)
{
if (i == hang - 1)
{
break;
}
if (j == lie - 1)
{
printf("---");
break;
}
printf("---|");
}
printf("\n");
}
}
void neirong1(char arr[HANG][LIE],char arr1[HANG][LIE] ,int hang, int lie)
{
while (1)
{
int i = 0;
int j = 0;
int count = 0;
scanf("%d%d", &i, &j);
if (arr[i][j] == '*')
{
printf("踩到地雷了,游戏失败!!\n");
return 0;
}
int a, b;
switch (i)//这里的switch实现扫雷的规则
{
case 0:
switch (j)
{
case 0:
if (arr[i+1][j+1] == '*')
count++;
if (arr[i + 1][j] == '*')
count++;
if (arr[i][j + 1] == '*')
count++;
break;
case 9:
if(arr[i+1][j]=='*')
count++;
if(arr[i][j-1]=='*')
count++;
if(arr[i+1][j-1]=='*')
count++;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
if(arr[i][j-1]=='*')
count++;
if(arr[i][j+1]=='*')
count++;
if (arr[i+1][j - 1] == '*')
count++;
if (arr[i + 1][j] == '*')
count++;
if (arr[i + 1][j + 1] == '*')
count++;
break;
}
break;
case 9:
switch (j)
{
case 0:
if (arr[i - 1][j + 1] == '*')
count++;
if (arr[i - 1][j] == '*')
count++;
if (arr[i][j + 1] == '*')
count++;
break;
case 9:
if (arr[i - 1][j] == '*')
count++;
if (arr[i-1][j - 1] == '*')
count++;
if (arr[i ][j - 1] == '*')
count++;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
if (arr[i][j - 1] == '*')
count++;
if (arr[i][j + 1] == '*')
count++;
if (arr[i - 1][j - 1] == '*')
count++;
if (arr[i - 1][j] == '*')
count++;
if (arr[i - 1][j + 1] == '*')
count++;
break;
}
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
switch (j)
{
case 0:
if (arr[i - 1][j] == '*')
count++;
if(arr[i-1][j+1]=='*')
count++;
if(arr[i][j+1]=='*')
count++;
if(arr[i+1][j+1]=='*')
count++;
if(arr[i+1][j]=='*')
count++;
break;
case 9:
if(arr[i-1][j]=='*')
count++;
if(arr[i-1][j-1]=='*')
count++;
if(arr[i][j-1]=='*')
count++;
if(arr[i+1][j-1]=='*')
count++;
if(arr[i+1][j]=='*')
count++;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
for (a = i - 1, b = j - 1; b <= j + 1; b++)
{
if (arr[a][b] == '*')
count++;
}
if (arr[i][j - 1] == '*')
count++;
if (arr[i][j + 1] == '*')
count++;
for (a = i + 1, b = j - 1; b <= j + 1; b++)
{
if (arr[a][b] == '*')
count++;
}
break;
}
}
arr1[i][j] = count += 48;
int count1 = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
if (arr[i][j] >= '0' && arr[i][j] <= '9')
count1++;
}
}
if (count1 == 85)
{
printf("恭喜你,扫除完所有的雷,游戏胜利!!\n");
return 0;
}
system("cls");
chushihua2(arr1, hang, lie);
}
}
void chushihua3(char arr[HANG][LIE], int hang, int lie)
{
int count=0;
int i, j;
srand((unsigned)time(NULL));
while (1)
{
i = rand() % 10;
j = rand() % 10;//制造随机数,实现随机埋雷。
if (arr[i][j] == ' ')
{
arr[i][j] = '*';
count++;
}
if (count == 16)
break;
}
system("cls");//清屏看起来更美观。
}
内容应该是不难懂,目前自己玩的时候没遇到bug(主要是脑子不太够用,坚持不到胜利)还有这里设计的是一个10*10的布局里面有15颗雷,完全随机分布,如果有人发现了bug或者有不足之处望指点呦。
还有本人随手拍的照片(嘿嘿)。