扫雷(通俗易懂简易版)

     我们绝大部分人都玩过扫雷,玩起来真的很简单,只需要1用鼠标点一点就可以了(要赢还是需要费脑经的)
但是现在自己来编写一个简易版的扫雷,发现不是那么简单的,经过了几天的编写,终于实现了属于我的简易版的扫雷,过程简单,对于我这菜鸟来说,难的部分就是怎么去实现点一次一大片就空了(这里用了递归)。接下来就是我的扫雷程序和截图

先看看电脑的扫雷界面,和我的扫雷界面(发现自己的好丑)


玩过扫雷的都知道,有时候点一次会出现一大片空格,看看电脑的吧



看了上图是不是觉得很简单?但是我因为实现这个功能,花了好久的时间,最后还是实现了



接下来是玩游戏过程



踩到了雷后



下面就是代码了(简单易懂)

头文件“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'); 
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章