扫雷小游戏,C语言

作为第一篇博客,可能有很多瑕疵,有不足之处还请多指教。

该代码是devc++实现的9×9棋盘下扫雷,没有设置难度选项,此为不足之处。此外,代码中设置地雷代码在输入坐标前运行,即有可能出现翻开的第一张牌就是雷的情况,游戏失败。以终端输入坐标的形式来进行翻牌和标记。效果图如下。

话不多说,接下来我们就上代码,三段代码分别是头文件,主逻辑函数,游戏函数。放置一个项目中。

头文件如下:注意头文件需命名为“game.h"

//头文件
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.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 ret);

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);

主逻辑函数如下:

     //测试游戏逻辑 
 #include"game.h"
void menu()
{
	printf("********** 扫雷 **********\n");
	printf("**************************\n");
	printf("****** 1.play 0.exit *****\n");
	printf("**************************\n");

}
void game()
{   
   char mine[ROWS][COLS] = {0}; //存放布置好雷的信息 
   char show[ROWS][COLS] = {0}; //存放排查出的雷的信息
   //初始化数组的内容为指定的内容
   //mine数组在没有布置雷的时候,都是‘0’;
   InitBoard(mine,ROWS,COLS,'0');
   //show数组在没有排查雷的时候,都是‘*’;
   InitBoard(show,ROWS,COLS,'*');
   //设置雷
   SetMine(mine,ROW,COL);
   
  // DisplayBoard(mine,ROW,COL); 
  DisplayBoard(show,ROW,COL); 
  FindMine(mine,show,ROW,COL);


}
int main()
{
	 
     srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();//打印菜单 
		printf("请选择:>");
		scanf("%d",&input);
		switch(input)
		{
			case 1 :
			    game();
 			    break;
			case 0 : printf("退出游戏\n"); break;
			default: printf("请重新选择\n");  break; 
		}
	}while(input); 
	
	return 0;
 } 

游戏函数如下:

  //游戏函数 
#include"game.h"
//初始化棋盘 
void InitBoard(char board[ROWS][COLS],int rows,int cols,char ret)
{
	int i = 0;
	int j = 0;
	for(i=0;i<rows;i++)
	{
		for(j=0;j<cols;j++)
		{
			board[i][j] = ret;
		}
	}
 } 
 //打印棋盘 
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
	int i = 0;
	int j = 0;
	int l = 0;
	printf("----------------扫雷游戏----------------\n");
	printf("游戏规则:9×9的棋盘里布置有十颗地雷,格子里的数字即其一圈方格内地雷数量\n");
	printf("输入规则:“数字”“空格”“数字”,回车即可\n");
	for(j=0;j<=COL;j++)
		{
			printf(" %d |",j);       
		}
		printf("\n");
		for(l=0;l<=COL;l++)
		{
			printf("---|");      //横坐标 
		}
		
		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 k = 0;
		for(k=0;k<=COL;k++)
		{
				printf("---|"); 
		}
	    
				printf("\n");
	}
   	printf("---------------扫雷游戏----------------\n");

}

//设置炸弹 
void SetMine(char board[ROWS][COLS],int row,int col)
{
	int count = EASY_COUNT; 
	while(count)
	{
		int x = rand() % ROW+1;
    	int y = rand() % COL+1;       //x,y 随机取值1~9; 
    	if(board[x][y]=='0')
	      {
	     	board[x][y]='1';   //字符1为雷,字符0为无雷 
		    count--;
          }
	}
	
}
//获取周围炸弹数目 
int get_mine_count(char board[ROWS][COLS],int x,int y)
{
	int number = 0;int i=x-1; int j = y-1;
	for(i=x-1;i<=x+1;i++)
	{
		for(j=y-1;j<=y+1;j++)
		{
			if(board[i][j]=='1')
			{
				number++;
			}
		}
	}
	return number;
 
}
//展开没雷的格子 
void clear(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y)
{      
       	int count = get_mine_count(mine,x,y); 
			  	if(0==count)
			  	{
			  		show[x][y]=' ';
			  		int i = 0; int j = 0;
			    	for(i=x-1;i<=x+1;i++)
				    {
				     	for(j=y-1;j<=y+1;j++)
				         {
				         	if(i>=1 && i<=9 && j>=1 && j<=9)
				        	{
				        		if(show[i][j]=='*'&& mine[i][j]!='1')
				            	{
				   	            	clear(mine,show,i,j);
					             }
							}
				         }
				    }
                }
                else
              {
			    show[x][y] = count + '0';
	          }
				 
}
//标记雷 
void sign(char show[ROWS][COLS],int row,int col)
{
	int x = 0; int y = 0;int fly = 0;
	while(1)
	{
		 printf("键入‘0 0’即可返回功能选择界面\n");
		 printf("请输入要标记的坐标:>\n");
	        scanf("%d%d",&x,&y);
	        if(x>=1 && x<=row &&y>=1 && y<=col)
	        { 
			   if(show[x][y]=='*')
			   {
			   	system("cls");
			   	show[x][y]='&';
			   	DisplayBoard(show,ROW,COL); 
			   	printf("坐标已标记\n");

			   }
			   else
			   {
			   	printf("该坐标无法被标记,请重新选择\n");
			   }
		    }
		    else if(x==0 &&y==0)
			   {
			   	printf("功能选择\n");
			   	break; 
			   }
			   else
			   {
			   	printf("无效坐标,请重新选择\n");
			   }
	}
	      
}
//翻牌 
void open(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col,int * result) 
{
	int x = 0;
	int y = 0; 
	
	while(1)
	{
	    	int win = 0;
			printf("键入‘0 0’即可返回功能选择界面\n");
		    printf("请输入要翻开的坐标:>\n");
	        scanf("%d%d",&x,&y);
	        if(x>=1 && x<=row &&y>=1 && y<=col)
	        { 
			   if(show[x][y]!='*')
			   {
			   	printf("该坐标已排查\n");
			   }
			   else
		       {
		       	 if(mine[x][y]=='1')
		           {
		            *result = 0;
		         	printf("很遗憾,你被炸死了!!!\n"); 
		         	printf("很遗憾,你被炸死了!!!\n"); 
		         	printf("很遗憾,你被炸死了!!!\n"); 
                   Sleep(1000);
                   	system("cls");
			        DisplayBoard(mine,ROW,COL); 
			        break;
        			 
		           }
		          else//如果不是雷
			      {
			      
			  	    clear(mine,show,x,y);
				  }
			    system("cls");
				DisplayBoard(show,ROW,COL);
				
				//统计非雷格子数目 
				int i = 0; int j = 0;
				for(i=1;i<=ROW;i++)
				{
					for(j=1;j<=COL;j++)
					{
						if(show[i][j]!='*'&&show[i][j]!='&')
						{
							win++;
						}
					}
				}
				printf("当我达到71,你就赢了噢:%d \n",win);
				if(win==row*col-EASY_COUNT)
	             {
	                *result = 0;
	                system("cls") ;
	            	printf("恭喜你,排雷成功\n");
	            	DisplayBoard(mine,ROW,COL); 
	            	break;
	              } 
			   }
	        } 
	        else if(x==0 &&y==0)
			   {
			   	printf("功能选择\n");
			   	break; 
			   }
	       else
	        {
	 	      printf("输入的坐标非法,请重新输入\n");
	        }
		 
	}

}
//排雷 
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
	int ch = 0;
	int result = 1;
     while(1)
     {  
     	    printf("功能项选择:键入1为标记地雷,键入2即翻开\n");

	    scanf("%d",&ch); 
	    char ch2 =getchar();
	    switch(ch)
         {
         	case 1 :  sign(show,row,col);break;
		
         	case 2 : open(mine,show,row,col,&result);
         	         if(result==0)
         	         {
         	         	goto again;
					  }
			                   break;
			     
			 default : printf("功能项选择错误,请重新选择\n"); break;
	     }
     	   
	 }
	 again:  ;
	
}



目前博主还没发现什么bug,如果有小伙伴发现或者有好的提议,欢迎评论区留言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值