扫雷(C语言版)
这个扫雷是在9*9的格子里,一共有10个地雷.
游戏功能:输入扫雷坐标后可以将周围没有地雷的坐标展开,可以标记可能有地雷的坐标,标记错了可以取消标记,利用清屏函数实现每次输完正确的坐标后可以清空屏幕再打印存放地雷的棋盘,
game.h(头文件)
# ifndef _ _GAME _ H __
# define _ _GAME _ H _ _
#include
#include
#include
#define H 11//设置雷数组是行
#define L 11//设置雷数组是列
#define Hh (H-2)//排雷时打印出来的数组的行
#define Ll (L-2)//排雷时打印出来的数组的行
#define MINE_NUM 10 //雷的个数
#define DISPLAY_BOARD 0//检查时查看雷
#define HAVE_MINE 0//检查have_mine函数
void lay_mines (char arr1[H][L],int h,int l);//布雷
void display_board(char arr[H][L], int h, int l); //打印数组
void find_mines(char arr1[H][L], char arr2[H][L], int h, int l); //输入坐标扫雷
void sign_mines(char arr1[H][L], char arr2[H][L], int h, int l);//标记雷
void not_sign_mines(char arr1[H][L], char arr2[H][L], int h, int l);//取消标记
void unfold_mines (char arr1[H][L], char arr2[H][L], int h, int l,int a, int b);//展开周围没有雷的坐标
#endif
test.c(测试游戏功能)
# include "game2.h"
void menu()//打印菜单函数
{
printf ("**********************************\n");
printf ("********* 扫雷游戏 **********\n");
printf ("******** (1)play **********\n");
printf ("******** (0)exit **********\n");
printf ("**********************************\n");
printf ("注:游戏坐标为0~9\n");
}
void empty(char arr[H][L],int h,int l,char p)//初始化数组,将数组内容全部初始化为传给函数的参数 字符p
{
int i = 0, j = 0;
for (i=0; i
game.c(游戏主要函数)
#include "game2.h"
void lay_mines (char arr[H][L],int h,int l) //布雷
{
int a = 0, i = 0, j = 0 ;
while(a0 && b-1>0 && arr2[a-1][b-1] == '*')
{
unfold_mines (arr1, arr2, a-1, b-1);
}
if (a-1>0 && b>0 && arr2[a-1][b] == '*')
{
unfold_mines (arr1, arr2, a-1, b);
}
if (a-1>0 && b+1>0 && arr2[a-1][b+1] == '*')
{
unfold_mines (arr1, arr2, a-1, b+1);
}
if (a>0 && b-1>0 && arr2[a][b-1] == '*')
{
unfold_mines (arr1, arr2, a, b-1);
}
if (a>0 && b+1>0 && arr2[a][b+1] == '*')
{
unfold_mines (arr1, arr2, a, b+1);
}
if (a+1>0 && b-1>0 && arr2[a+1][b-1] == '*')
{
unfold_mines (arr1, arr2, a+1, b-1);
}
if (a+1>0 && b>0 && arr2[a+1][b] == '*')
{
unfold_mines (arr1, arr2, a+1, b);
}
if (a+1>0 && b+1>0 && arr2[a+1][b+1] == '*')
{
unfold_mines (arr1, arr2, a+1, b+1);
}
}
}
void first_mine(char arr1[H][L], char arr2[H][L], int a, int b)//第一次排雷不能被炸死
{
int i = 0, j = 0;
if (arr1[a][b] == '1')
{
arr1[a][b] = '0';
while (1)
{
i = rand()% Hh +1;
j = rand()% Ll +1;
if (arr1[i][j] == '0')
{
arr1[i][j] = '1';
break;
}
}
}
}
int have_mine(char arr[H][L],int h, int l)//判断是否把地雷排完,排完返回0,否则返回1
{
int i = 0, j = 0, sign_count = 0, left_count = 0;//sign_count 表示标记个数,find_count 表示剩余未标记雷的个数
for (i=1; i=1 && a<=h && b>=1 &&b<=h)
{
if(times == 1)
{
first_mine(arr1, arr2, a, b);
}
if (times !=1 && arr1[a][b] == '1')
{
printf ("恭喜你,被炸死了!!!\n");
display_board(arr1, h+1, l+1);
break;
}
else
{
system("cls"); //清屏函数
unfold_mines (arr1 , arr2 , a, b);
display_board(arr2, h+1, l+1);
}
}//排雷else
else
{
printf ("你的输入有误!!!\n");
}
}//1, 2, 3 else
else
{
printf ("你的输入有误!!!\n");
}
t = have_mine(arr2, Hh+1, Ll+1);//t 表示判断是不是把雷排完了的变量
}while (t);
if (t == 0)
{
printf ("恭喜你,把雷排完了!!!\n");
display_board(arr1, h+1, l+1);
}
}