从不会,到会做扫雷游戏

扫雷游戏:

             1.第一次不会被炸死。

             2.坐标周围没有雷,实现展开。

             第一步:先建个头文件,方便我们写测试,游戏文件。

             game.h  如下:

#ifndef _GAME_H_              //防止头文件被重复引用,用ifndef/define/endif产生预处理块
#define _GAME_H_
typedef unsigned int uint;

enum OPTION                    //利用枚举,把EXIT,初始化为0,START为1
{
    EXIT,
	START
};
enum MINE_COUNT            //同理
{
	EASY_COUNT=10 
};
#include<stdio.h>       
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2

void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);     //声明函数
void PrintBoard(char board[ROWS][COLS],int rows,int cols);
void SetMine(char board[ROWS][COLS],int row,int col,int x,int y);
int GetMineCount(char mine[ROWS][COLS],int x,int y);
void expend (char board[ROWS][COLS],char arr[ROWS][COLS],int row,int col,int x,int y);
#endif

                 第二步:建测试文件(test.c),用循环实现重复玩游戏,调用函数功能

                test.c 如下:

#include"game.h"              //引用头文件

void menu()
{
	printf("____________________\n");       //开始界面
	printf("|*****扫雷游戏*****|\n");
	printf("|******1.play******|\n");
	printf("|******0.exit******|\n");
	printf("|------------------|\n");
}

void game()
{
	int x = 0;
	int y = 0;
	int ret =0;                          
	int n = 0;
	char show[ROWS][COLS] = {0};        //创建2个数组,一个用来放你设置的雷,一个用来展示
	char mine[ROWS][COLS] = {0};
	InitBoard(show,ROWS,COLS,'*');        //初始化
	InitBoard(mine,ROWS,COLS,'0');
	PrintBoard(show,ROW,COL);           //先把第一个图形展示出来
	while(1)                             //用循环,是你能多次输入坐标
	{
		printf("输入坐标:");
	 scanf("%d %d",&x,&y);
	  if(n==0)                    //先让你输入坐标,才开始设置雷,这样就不会让你第一次被炸死了(也可以用其他办法)
	  {
		  SetMine(mine,ROWS,COLS,x,y);          //设置雷
	  }
	if(x>0 && x<=ROW && y>0 && y<=COL)
	 {
		ret = GetMineCount(mine,x,y);      //得到雷数
		if(ret==-1)
		{
			printf("很遗憾,你被炸死了\n");
			PrintBoard(mine,ROW,COL);
			break;
		}
		else if(ret==-2)
		{
			printf("你已经排掉了所有雷");
			break;
		}
		else 
		{
			expend(mine,show,ROWS,COLS,x,y);    //扩展
			PrintBoard(show,ROW,COL);		
		}
	  }
	else
		printf("输入位置错误");
	n++;
	 }
	
}
int main()
{
	int input = 0;
	srand((unsigned int )time(NULL));      //产生随机数
	do
	{
		menu();
		printf("请选择:");
		scanf("%d",&input);
		switch(input)
		{
		case START:
			 game();
			 break;
		case EXIT:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	}
	while(input);
	system("pause");
	return 0;
}

               第三步:写game.c  ,把函数封装在这里面,这样你每次调用,只需声明就ok了

              game.c

#include"game.h"
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)   //初始化
{
   int i = 0;                          //也可用 memset(board,set,rols*cols*sizeof(board[0][0])
   int j = 0;
   for(i=0; i<rows; i++)
   {
	   for(j=0; j<cols; j++)
		   board[i][j] = set;
   }
}

void PrintBoard(char board[ROWS][COLS],int row,int col)      //打印函数
{
	int i = 0;
	int j = 0;
	printf("  ");
	for(i=1; i<col+1; i++)
	{
		printf(" %2d ",i);
	}
	printf("\n");

	
	for(i=1; i<=row; i++)
	{
		printf("%-2d",i);
		for(j=1; j<=col; j++)
		{
		printf(" %2c ",board[i][j]);
		}
		
		printf("\n");
	}
}


void SetMine(char board[ROWS][COLS],int rows,int cols,int x,int y)
{
	int ret1 = 0;
	int ret2 = 0;
	int count = 0;
	while(count<EASY_COUNT)            //设置10个雷,也可设很多个
	{ 
	ret1 = rand()%(rows-3)+1;                     
	ret2 = rand()%(cols-3)+1;

	 if(board[ret1][ret2]=='0')
	 {
		 if(ret1!=x || ret2!=y)
		 {
		 
          board[ret1][ret2] = '1';
	      count++;
	      continue;
		 }
	 }
	}
}
int GetMineCount(char mine[ROWS][COLS],int x,int y)
{ 
	if(mine[x][y]=='1')
	{
		return -1;
	}
	else if(mine[x][y]=='0')
	{    

		return ((mine[x-1][y-1]+mine[x-1][y]+mine[x-1][y+1]+        //得到x,y周围有多少个雷
		mine[x][y-1]+mine[x][y+1]+
		mine[x+1][y-1]+mine[x+1][y]+
		mine[x+1][y+1])-8*('0'));
	}
	return -2;
}

void expend (char board[ROWS][COLS],char arr[ROWS][COLS],int rows,int cols,int x,int y)
{
	int i = 0;
	int j = 0;   
    int count = 0;
	if(arr[x][y]=='*')
	{
		count=GetMineCount(board,x,y);   
		if(count!=0 )
		{
	     arr[x][y]=count+'0';
		}
		else
		{
			arr[x][y]='0';
	   for(i=-1; i<=1; i++)
	  {
		for(j=-1; j<=1; j++)
		{
			if( (x+i>=1) && (x+i<=ROWS) && (y+j>=-1) &&(y+j<=COLS))
			{
				if((i!=0)||(j!=0))
				expend(board,arr,ROWS,COLS,x+i,y+j);//用递归不断展开,直到它周围有雷
				
			}
		}
		}
	  }
	}
}//也可用 memset(board,set,rols*cols*sizeof(board[0][0]

    到此结束,我们看一下运行结果





有哪里做的不好请大家见谅,毕竟我也是新手,希望大家每天都能进步。


猜你喜欢

转载自blog.csdn.net/congjichukaishi/article/details/80069691