扫雷小游戏

在C语言的学习过程中,自主实现小游戏能提高我们对C语言的兴趣,我今天将为大家带来扫雷小游戏的实现。



扫雷游戏需要的文档

game.c ----- 游戏代码的实现
game.h----- 游戏代码的声明
test.c ----- 扫雷小游戏的检验



菜单的实现

1.选择是否开始游戏

2.选择是否退出游戏

3.判断非法输入

代码如下:

void menu ()
{
	printf("######################################################\n");
	printf("############### 1.play ####### 0.exit ################\n");
	printf("######################################################\n");
}
int main ()
{
    int input = 0;
	do
	{
		menu();
		scanf("%d",&input);
	    switch(input)
		{
		case 1:
			printf("游戏开始\n");
			game();
			break;
		case 0:
			printf("退出游戏。\n");
			break;
		default:
			printf("输入错误,请重新输入。\n");
			break;
		}
	}while(input);
}


初始化布置雷的表格和排雷信息的表格

void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set)
{
    int i = 0;
	for(i=0;i<rows;i++)
	{
	    int j = 0;
		for(j=0;j<cols;j++)
		{
		    Board[i][j]=set;
		}
	}
}


随机布置雷

void setmine (char Board[ROWS][COLS],int row,int col)
{
	int count = 0;
	while(count<easy_count)
	{
	   int x = rand()%row+1;
	   int y = rand()%col+1;
	   if(x>=1 && x<=row && y>=1 && y<=col)
	   {
	        if(Board[x][y]=='0')
			{
			    Board[x][y]='1';
				count++;
			}
	   }
	}

}


打印排雷信息

void DisplayBoard(char Board[ROWS][COLS],int row,int col)
{
     int i = 0;
	 int j = 0;
	 for(i=0;i<=col;i++)
	 {
	     printf("%d ",i);
	 }
	 printf("\n");
	 for(i=1;i<=row;i++)
	 {
		 printf("%d ",i);
		 for(j=1;j<=col;j++)
		 {
			  printf("%c ",Board[i][j]);
		 }
		 printf("\n");
	 }
}


排查雷

int mine_count (char Board[ROWS][COLS],int x,int y)
{
    return Board[x-1][y-1]+
		Board[x-1][y]+
		Board[x-1][y+1]+
		Board[x][y-1]+
		Board[x][y+1]+
		Board[x+1][y-1]+
		Board[x+1][y]+
		Board[x+1][y+1]-8*'0';
}
void Findmine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row ,int col)
{
	 int x = 0;
	 int y = 0;
	 int win = 0;
	 while(win<row*col-easy_count)
	 {
		  scanf("%d %d",&x,&y);
		  //判断坐标合法
	      if(x>=1 && x <=row && y>=1 && y<=col)
		  {
			  //判断该坐标是否被排过
			  if(Show[x][y]=='*')
			  {
			      if(Mine[x][y]=='0')
				  {
				       int ret = mine_count(Mine,x,y);
					   Show[x][y] = ret + '0';
					   DisplayBoard(Show,ROW,COL);
					   win++;
				  }
				  else
				  {
				       printf("你已经被炸死了。\n");
					   break;
				  }
			  }
			  else
			  {
			      printf("你已经排查过该坐标。\n");
			  }
		  }
		  else
		  {
		      printf("输入的坐标不合分,请重新输入。\n");
		  }
	 }

}

扫雷游戏的整体声明

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define easy_count 10

void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char Board[ROWS][COLS],int row,int col);
void setmine (char Board[ROWS][COLS],int row,int col);
void Findmine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row ,int col);

函数的整体调用

void game ()
{
	char mine[ROWS][COLS]={0};
	char show[ROWS][COLS]={0};
	
	//初始化
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show,ROWS,COLS,'*');
   
	//打印排雷信息
	DisplayBoard(show,ROW,COL);

	//布置雷
	setmine(mine,ROW,COL);

	//排雷
    Findmine(mine,show,ROW,COL);

}


game.c文档代码

#include "game.h"

void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set)
{
    int i = 0;
	for(i=0;i<rows;i++)
	{
	    int j = 0;
		for(j=0;j<cols;j++)
		{
		    Board[i][j]=set;
		}
	}
}
void DisplayBoard(char Board[ROWS][COLS],int row,int col)
{
     int i = 0;
	 int j = 0;
	 for(i=0;i<=col;i++)
	 {
	     printf("%d ",i);
	 }
	 printf("\n");
	 for(i=1;i<=row;i++)
	 {
		 printf("%d ",i);
		 for(j=1;j<=col;j++)
		 {
			  printf("%c ",Board[i][j]);
		 }
		 printf("\n");
	 }
}
void setmine (char Board[ROWS][COLS],int row,int col)
{
	int count = 0;
	while(count<easy_count)
	{
	   int x = rand()%row+1;
	   int y = rand()%col+1;
	   if(x>=1 && x<=row && y>=1 && y<=col)
	   {
	        if(Board[x][y]=='0')
			{
			    Board[x][y]='1';
				count++;
			}
	   }
	}

}
int mine_count (char Board[ROWS][COLS],int x,int y)
{
    return Board[x-1][y-1]+
		Board[x-1][y]+
		Board[x-1][y+1]+
		Board[x][y-1]+
		Board[x][y+1]+
		Board[x+1][y-1]+
		Board[x+1][y]+
		Board[x+1][y+1]-8*'0';
}
void Openzero (char Mine[ROWS][COLS],char Show[ROWS][COLS],int x,int y,int win)
{
	int ret = 0;
    //判断坐标是否合法
	if(x>1 && x<=ROW && y>1 && y>COL)
	{
		return ;
	}
	//判断是否被排过雷
	if(Show[x][y]!='*')
	{
	    return ;
	}
	ret = mine_count(Mine,x,y);
	Show[x][y] = ret + '0';
	win++;
	//判断坐标周围是否有雷
	if(Show[x][y]>'0')
	{
	    return ;
	}
	if(Show[x][y]=='0')
	{
	    Openzero (Mine,Show,x-1,y-1,win);
		Openzero (Mine,Show,x,y-1,win);
		Openzero (Mine,Show,x+1,y-1,win);
		Openzero (Mine,Show,x-1,y,win);
		Openzero (Mine,Show,x+1,y+1,win);
		Openzero (Mine,Show,x+1,y,win);
		Openzero (Mine,Show,x-1,y+1,win);
		Openzero (Mine,Show,x,y+1,win);
	}
}
void Findmine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row ,int col)
{
	 int x = 0;
	 int y = 0;
	 int win = 0;
	 while(win<row*col-easy_count)
	 {
		  scanf("%d %d",&x,&y);
		  //判断坐标合法
	      if(x>=1 && x <=row && y>=1 && y<=col)
		  {
			  //判断该坐标是否被排过
			  if(Show[x][y]=='*')
			  {
			      if(Mine[x][y]=='0')
				  {
				       Openzero(Mine,Show,x,y,win);
					   DisplayBoard(Show,ROW,COL);					 
				  }
				  else
				  {
				       printf("你已经被炸死了。\n");
					   DisplayBoard(Mine,ROW,COL);
					   break;
				  }
			  }
			  else
			  {
			      printf("你已经排查过该坐标。\n");
			  }
		  }
		  else
		  {
		      printf("输入的坐标不合法,请重新输入。\n");
		  }
	 }

}


game.h文档代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define easy_count 10

void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char Board[ROWS][COLS],int row,int col);
void setmine (char Board[ROWS][COLS],int row,int col);
void Findmine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row ,int col);



test.c文档代码

#include "game.h"

void menu ()
{
	printf("######################################################\n");
	printf("############### 1.play ####### 0.exit ################\n");
	printf("######################################################\n");
}
void game ()
{
	char mine[ROWS][COLS]={0};
	char show[ROWS][COLS]={0};
	
	//初始化
	InitBoard(mine,ROWS,COLS,'0');
	InitBoard(show,ROWS,COLS,'*');
   
	//打印排雷信息
	DisplayBoard(show,ROW,COL);

	//布置雷
	setmine(mine,ROW,COL);

	//排雷
    Findmine(mine,show,ROW,COL);

}
int main ()
{
    int input = 0;
	do
	{
		menu();
		scanf("%d",&input);
	    switch(input)
		{
		case 1:
			printf("游戏开始\n");
			game();
			break;
		case 0:
			printf("退出游戏。\n");
			break;
		default:
			printf("输入错误,请重新输入。\n");
			break;
		}
	}while(input);
}

关注点一点,下期更精彩。

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值