c语言扫雷(递归算法)

本扫雷程序,由c语言编写,应用二维数组,递归算法,函数调用。

三个文件综合而生成扫雷程序。



game.h //文件

#ifndef __GAME_h__
#define __GAME_h__
#define ROW 10
#define LOW 10
#define ROWS ROW+2
#define LOWS LOW+2
#define  COUNT 10

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

void menu();
void game();
void set(char board[ROWS][LOWS],int row,int low,char M);
void show(char board[ROWS][LOWS],int row,int low);
void insert(char board[ROWS][LOWS],int count);
void play(char mine[ROWS][LOWS],char look[ROWS][LOWS],int x,int y);
int jishu(char mine[ROWS][LOWS],int x,int y);
#endif
game.c //文件
#include "game.h"
int main()
{
	int n=0;
	srand((unsigned)time(NULL));
	do 
	{
		menu();
		scanf("%d",&n);
		switch(n)
		{
		case 1:
			game();
			//system("cls");
			break;
		case 2:
			break;
		default:printf("输入错误!请重新输入:\n");
		}
		if (n==2)
		{
			break;
		}
	} while (n);
}
void menu()
{
	printf("******************************\n");
	printf("******************************\n");
	printf("******************************\n");
	printf("*******    1.play     ********\n");
	printf("*******    2.Exit     ********\n");
	printf("******************************\n");
	printf("******************************\n");
	printf("******************************\n");
}
void game()
{	
	int x,y;
	int m;
	int n=0;
	int lei=0;
	char mine[ROWS][LOWS]={0};
	char look[ROWS][LOWS]={0};
	set(mine,ROWS,LOWS,'0');//建立布雷棋盘
	set(look,ROWS,LOWS,'*');//建立可视界面棋盘
	insert(mine,COUNT);//布雷
	
	
	do 
	{
		int select;
		system("cls");
		//show(mine,ROW,LOW);
		show(look,ROW,LOW);//显示排过的雷
		printf("-------1.扫雷-----2.标记雷--------\n");
		scanf("%d",&select);
	if(select==1)
	{
			printf("请输入坐标:");
			scanf("%d%d",&x,&y);
			if (mine[x][y]=='1'&&n==0)//保证第一次踩到的不是雷
			{	
				set(mine,ROWS,LOWS,'0');
				insert(mine,COUNT);
			}
			if (mine[x][y]=='0'&&look[x][y]=='*')
			{
				play(mine,look,x,y);
				show(look,ROW,LOW);
			}
			if (mine[x][y]=='1'&&look[x][y]=='*')
			{
				m=0;
				look[x][y]='@';
				show(look,ROW,LOW);
				printf("游戏结束,你踩雷了!!!\n");
			}
			n++;
	}
	if (select==2)
	{
		
		printf("请输入标记雷的坐标:");
		scanf("%d%d",&x,&y);
		
		if (mine[x][y]=='1'&&look[x][y]=='*')
		{
			look[x][y]='X';
			lei++;
			show(look,ROW,LOW);

		}
		if (mine[x][y]=='0'&&look[x][y]=='*')
		{
			m=0;	//为了跳出循环

			
			printf("游戏结束,你雷标记错误了!!!\n");
		}
	if (lei==COUNT)
	{
		m=0;  //为了跳出循环
		printf("恭喜你排雷成功!!!\n");
	}
	}
	
	} while (m);
}

test.c //文件

#include "game.h"
void set(char board[ROWS][LOWS],int row,int low,char M)
{
	int i,j;
	for (i=0;i<row;i++)
	{
		for (j=0;j<low;j++)
		{
			board[i][j]=M;
		}
	}
}
void show(char board[ROWS][LOWS],int row,int low)
{
	int i,j;
	
	printf("    ");//为了棋盘的美观
	for (i=1;i<=row;i++)
	{
		printf(" %d ",i);
	}
	printf("\n    ------------------------------\n");
	for (i=1;i<=row;i++)
	{	printf("%2d |",i);
		for (j=1;j<=low;j++)
		{
			printf(" %c ",board[i][j]);
			if (j==low)
			{
				printf("|");
			}
		}
		printf("\n");
	}
	printf("    ------------------------------\n");
}
void insert(char board[ROWS][LOWS],int count)
{
	while(count)
	{
	int x,y;
	x=rand()%ROW+1;
	y=rand()%LOW+1;
	if (board[x][y]=='0')
	{
		board[x][y]='1';
		count--;
	}
	}
}
void play(char mine[ROWS][LOWS],char look[ROWS][LOWS],int x,int y)//应用递归排除周围没有雷的区域
{
	int ret;
	ret=jishu(mine,x,y);
	if (ret==0)
	{
		look[x][y]=' ';
		if ((x-1)>0&&(y-1)>0&&(look[x-1][y-1]=='*'))
			play(mine,look,x-1,y-1);
		if ((x-1)>0&&(y)>0&&(look[x-1][y]=='*'))
			play(mine,look,x-1,y);
		if ((x-1)>0&&(y+1)>0&&(look[x-1][y+1]=='*'))
			play(mine,look,x-1,y+1);
		if ((x)>0&&(y-1)>0&&(look[x][y-1]=='*'))
			play(mine,look,x,y-1);
		if ((x)>0&&(y+1)>0&&(look[x][y+1]=='*'))
			play(mine,look,x,y+1);
		if ((x+1)>0&&(y-1)>0&&(look[x+1][y-1]=='*'))
			play(mine,look,x+1,y-1);
		if ((x+1)>0&&(y)>0&&(look[x+1][y]=='*'))
			play(mine,look,x+1,y);
		if ((x+1)>0&&(y+1)>0&&(look[x+1][y+1]=='*'))
			play(mine,look,x+1,y+1);
	}else
		look[x][y]=ret+'0';
}
int jishu(char mine[ROWS][LOWS],int x,int y)//统计周围的雷数
{
	return mine[x-1][y-1]+
		mine[x-1][y]+
		mine[x-1][y+1]+
		mine[x][y-1]+
		mine[x][y+1]+
		mine[x+1][y-1]+
		mine[x+1][y]+
		mine[x+1][y+1]-8*'0';
		
}


  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值