//sweep.h
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#define ROWS 8
#define COLS 8
#define MINES 30
void menu();//打印菜单
void init_mine(char mine[][COLS+2], int x, int y);//初始化雷阵
void print_mine(char mine[ ][COLS+2], int x, int y);//打印雷阵
void init_show(char show[][COLS+2], int x, int y);//初始化显示雷个数的矩阵
void print_show(char show[ ][COLS+2], int x, int y);//打印雷的个数
void lay_mines( char mine[][COLS+2]);//布雷
void play(char mine[ ][COLS+2],char show[ ][COLS+2]);//扫雷
//sweep.c
#include"sweep.h"
void menu()
{
printf("*****************\n");
printf("**1.play 0.exit**\n");
printf("*****************\n");
}
void init_mine(char mine[][COLS+], int x, int y)//初始化雷阵
{
int i = ;
int j = ;
for (i = ; i<x; i++)
{
for (j = ; j<y; j++)
{
mine[i][j] ='+';
}
}
}
void init_show(char mine[][COLS+], int x, int y)//初始化显示雷个数的数组
{
int i = ;
int j = ;
for (i = ; i<x; i++)
{
for (j = ; j<y; j++)
{
mine[i][j] ='*';
}
}
}
void print_mine(char mine[ ][COLS+], int x, int y)//打印雷阵
{
int i = ;
int j = ;
printf(" ");
for (i = ; i < x-; i++)//输出行的标号
{
printf(" %d ",i);
}
printf("\n ");
for (i = ; i < x; i++)
{
if (i > && i < )
{
printf("%d ",i);
}
if (i == )
{
printf(" ");
}
for (j = ; j < y; j++)//输出雷阵
{
printf(" %c ",mine[i][j]);
}
printf("\n ");
}
printf("\n");
}
void print_show(char show[ ][COLS+], int x, int y)
{
int i = ;
int j = ;
printf(" ");
for (i = ; i < x; i++)
{
printf(" %d ",i);
}
printf("\n ");
for (i = ; i < x; i++)
{
printf("%d ",i);
for (j = ; j < y; j++)
{
printf(" %c ",show[i][j]);
}
printf("\n ");
}
}
void lay_mines( char mine[][COLS+])//布雷
{
int count = MINES;//定义雷的个数
srand((unsigned int)time(NULL));//为了每次产生不同的随机数
flag:
while (count>)//当雷没有布完时,执行循环
{
int x = rand()%(ROWS)+;//产生随机的下标
int y = rand()%(COLS)+;
if(mine[x][y] =='@')//如果这个位置已经布过雷,则重新生成下标
{
goto flag;
}
else
{
mine[x][y] = '@';
count--;//布一个雷之后雷的个数应该减一
}
}
}
void play(char mine[ ][COLS+],char show[ ][COLS+])//扫雷
{
int i = ;
int j = ;
int x = ;
int y = ;
printf("请输入第一次要点击的位置>");
scanf("%d %d",&x, &y);
if (mine[x][y] == '@')//如果第一次点击的就是雷的位置,则应该把这个雷移走
{
for (i=; i<x; i++)
{
for (j = ; j<y; j++)
{
if (mine[i][j] != '@')
{
mine[i][j] = mine[x][y];
mine[x][y] = '+';
}
}
}
}
else
{
//如果点击的位置不是雷,则应该统计雷的个数
show[x][y] = ((mine[x-][y-] == '@')
+ (mine[x][y-] == '@') + (mine[x+][y-] == '@')
+ (mine[x+][y] == '@') + (mine[x+][y+] == '@')
+ (mine[x][y+] == '@') + (mine[x-][y+] == '@')
+ (mine[x-][y] == '@'))+ '0';
}
print_show(show, ROWS, COLS);
//print_mine(mine, ROWS, COLS);//打印出雷阵
while()
{
printf("请输入要点击的位置(小于10):>");
scanf("%d %d",&x,&y);
if(mine[x][y] == '@')
{
printf("炸死了\n");
break;
}
else
{ //如果点击的位置不是雷,则应该统计雷的个数
show[x][y] = ((mine[x-][y-] == '@')
+ (mine[x][y-] == '@') + (mine[x+][y-] == '@')
+ (mine[x+][y] == '@') + (mine[x+][y+] == '@')
+ (mine[x][y+] == '@') + (mine[x-][y+] == '@')
+ (mine[x-][y] == '@'))+ '0';
}
print_show(show, ROWS+, COLS+);//打印显示雷的个数的数组
}
}
//test.c
#include"sweep.h"
void game()
{
int x = ;
int y = ;
char mine[ROWS + ][ COLS + ];
char show[ROWS + ][COLS + ];
init_mine( mine, ROWS+, COLS+);
init_show( show,ROWS+, COLS+);
print_mine(mine, ROWS+, COLS+);
lay_mines(mine);
//print_mine(mine, ROWS+2, COLS+2);
play(mine,show);
}
int main()
{
int choose = ;
do
{
menu();
printf("请输入要选择的数字:");
scanf("%d",&choose);
switch (choose)
{
case :
exit();
case :
game();
}
}
while(choose);
system("pause");
return ;
}
玩游戏的过程: