但是现在自己来编写一个简易版的扫雷,发现不是那么简单的,经过了几天的编写,终于实现了属于我的简易版的扫雷,过程简单,对于我这菜鸟来说,难的部分就是怎么去实现点一次一大片就空了(这里用了递归)。接下来就是我的扫雷程序和截图
先看看电脑的扫雷界面,和我的扫雷界面(发现自己的好丑)
玩过扫雷的都知道,有时候点一次会出现一大片空格,看看电脑的吧
看了上图是不是觉得很简单?但是我因为实现这个功能,花了好久的时间,最后还是实现了
接下来是玩游戏过程
踩到了雷后
下面就是代码了(简单易懂)
头文件“game.h”
#ifndef __GAME_H__
#define __GAME_H__
#define COLS 11
#define ROWS 11
#define COL (COLS-2)
#define ROW (ROWS-2)
#define MAX 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <windows.h>
void init_board(char mine[ROWS][COLS],char set, int row, int col);
void mine_set(char mine[ROWS][COLS]);
void display_board(char mine[ROWS][COLS], int row, int col);
void no_mine_display(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int *count);
#endif//__GAME_H__
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "game.h"
#include <windows.h>
//*********
//**********game begining**********
// **********
void game()
{
char mine[ROWS][COLS];
char show[ROWS][COLS];
char set = '0';
int x = 0;
int y = 0;
int ret = 0;
int count =ROW*COL-MAX;
init_board(mine, '0', ROWS, COLS); //棋盘初始化
init_board(show, '\1', ROWS, COLS);
display_board(show, ROWS, COLS); //打印棋盘,别多想,雷隐藏了
mine_set(mine); //设置雷
// display_board(mine, ROWS, COLS);
while(count)
{
printf("请输入你选择的座标> ");
scanf("%d%d", &y, &x);
if(((x>=1)&&(x<=9)) && ((y>=1)&&(y<=9)))
{
if((count == COL*ROW-MAX) && (mine[x][y] == '1')) //第一次踩雷了,再给你次机会
{
init_board(mine, '0', ROWS, COLS);
mine_set(mine);
//display_board(mine, ROWS, COLS);
}
else if(mine[x][y] == '1') //又踩雷了?炸死你没商量
{
printf("炸死你,没理由\n");
display_board(mine, x, y);
break;
}
else // 多个连续地方没雷咋办,显示空格,
{
no_mine_display(mine, show, x, y, &count);
display_board(show, x, y);
}
}
else
{
printf("座标超出范围\n");
}
}
if(count == 0)
{
printf("恭喜您,扫雷任务完毕\1\1\1\1\1\n");
display_board(show, x, y);
}
}
enum test //枚举,使程序更加灵活
{
EXIT,
PLAY
};
void menu()
{
printf("**************************\n");
printf("****1 play 0 exit******\n");
printf("**************************\n");
}
void test()
{
int input = 0;
do
{
menu();
printf("请选择> ");
scanf("%d", &input);
switch(input)
{
case PLAY:
game();
break;
case EXIT:
break;
default:
printf("输入有误,请重新输入> ");
}
}while(input);
}
int main()
{
test();
return 0;
}
game.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init_board(char mine[ROWS][COLS], char set, int row, int col) //棋盘初始化
{
memset(mine, set, row*col*sizeof(char));
}
void display_board(char mine[ROWS][COLS], int row, int col) //打印棋盘
{
int i = 0;
int j = 0;
printf(" ");
for(i=1; i<=ROW; i++)
{
printf(" %d ", i);
}
printf("\n");
for(j=1; j<=COL; j++)
{
printf("%d ", j);
for(i=1; i<=ROW; i++)
{
printf(" %c ", mine[i][j]);
}
printf("\n");
}
}
void mine_set(char mine[ROWS][COLS]) //设置雷
{
int count = MAX;
srand((unsigned int)time(NULL));
while(count)
{
int x = rand()%9+1;
int y = rand()%9+1;
if(mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
void no_mine_display(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int *count) //递归排雷由此开始
{
(*count)--;
if((mine[x-1][y-1]+mine[x][y-1]+mine[x+1][y-1]+mine[x+1][y]+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1]+mine[x-1][y]-7*'0') == '0')
{
show[x][y] = ' ';
if(((x-1>0)&&(x-1<10))&&((y-1>0)&&(y-1<10))&&(show[x-1][y-1]=='\1'))
no_mine_display(mine,show, x-1, y-1,count);
if(((x>0)&&(x<10))&&((y-1>0)&&(y-1<10))&&(show[x][y-1]=='\1'))
no_mine_display(mine,show, x, y-1,count);
if(((x+1>0)&&(x+1<10))&&((y-1>0)&&(y-1<10))&&(show[x+1][y-1]=='\1'))
no_mine_display(mine,show, x+1, y-1,count);
if(((x+1>0)&&(x+1<10))&&((y>0)&&(y<10))&&(show[x+1][y]=='\1'))
no_mine_display(mine,show, x+1, y,count);
if(((x+1>0)&&(x+1<10))&&((y+1>0)&&(y+1<10))&&(show[x+1][y+1]=='\1'))
no_mine_display(mine,show, x+1, y+1,count);
if(((x>0)&&(x<10))&&((y+1>0)&&(y+1<10))&&(show[x][y+1]=='\1'))
no_mine_display(mine,show, x, y+1,count);
if(((x-1>0)&&(x-1<10))&&((y+1>0)&&(y+1<10))&&(show[x-1][y+1]=='\1'))
no_mine_display(mine,show, x-1, y+1,count);
if(((x-1>0)&&(x-1<10))&&((y>0)&&(y<10))&&(show[x-1][y]=='\1'))
no_mine_display(mine,show, x-1, y,count);
}
else show[x][y] = (mine[x-1][y-1]+mine[x][y-1]+mine[x+1][y-1]+mine[x+1][y]
+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1]+mine[x-1][y]-7*'0');
}