首页 新闻 会员 周边

c语言用数组解决扫雷游戏,递归问题

0
悬赏园豆:100 [待解决问题]

这是题目要求

输入样例1

5 5 1 1
0 0
4 4

输出样例1

-1 1 0 0 0 
1 1 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
You win

输入样例2

4 5 1 2
1 2
3 0
1 2

输出样例2

0 1 -1 1 0 
0 1 -1 1 0 
0 1 1 1 0 
0 0 0 0 0 

You lose

输入样例3

4 5 1 2
1 2
3 0
0 2

输出样例3

0 1 -1 1 0 
0 1 -1 1 0 
0 1 1 1 0 
0 0 0 0 0 

0 1 1 1 0 
0 1 -1 1 0 
0 1 1 1 0 
0 0 0 0 0 
You win

下面是我的代码,我用两个数组一个存储雷的元素信息,另一个存储玩家界面信息

为什么递归不能实现,不能输出结果,实在看不出哪有问题

#include<stdio.h>

int n,m,k,l;
int data[20][20];  //数据数组 
int play[20][20];  //玩家界面数组 
int count=0;


void Init();
void disp();
void dispdata();
void setboom(int a,int b);
void setnumber();




//初始化玩家界面 
void Init()
{
	for (int i = 0; i < 20; i++)
	{
		for (int j = 0; j < 20; j++)
		{
			play[i][j] = -1;
		}
	}
	
} 

//打印玩家界面 
void disp()
{
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			printf("%d ",play[i][j]);
		}
		printf("\n");
	}
}

//打印后台数据 
void dispdata(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			printf("%d ",data[i][j]);
		}
		printf("\n");
	}
}


//设置炸弹 
void setboom(int a,int b)
{
	data[a+1][b+1]=-1;   //data数组打印出来的是从下标1开始的 
} 




//将后台数据与游戏界面交互 
void swap(int x,int y)
{
	if(data[x+1][y+1]==0){
		play[x][y]=data[x+1][y+1];
		if(data[x+1-1][y+1-1]==0){
			swap((x+1-1),(y+1-1));
			count++;
		}
		if(data[x+1-1][y+1]==0){
			swap((x+1-1),(y+1));
			count++;
		}
		if(data[x+1-1][y+1+1]==0){
			swap((x+1-1),(y+1+1));
			count++;
		}
		if(data[x+1][y+1-1]==0){
			swap((x+1),(y+1-1));
			count++;
		}
		if(data[x+1][y+1+1]==0){
			swap((x+1),(y+1+1));
			count++;
		}
		if(data[x+1+1][y+1-1]==0){
			swap((x+1+1),(y+1-1));
			count++;
		}
		if(data[x+1+1][y+1]==0){
			swap((x+1+1),(y+1));
			count++;
		}
		if(data[x+1+1][y+1+1]==0){
			swap((x+1+1),(y+1+1));
			count++;
		}
		
	}else{
		play[x][y]=data[x+1][y+1];
		count++;
	}
}


//判断玩家输入是否为雷位 
int panduan(int x,int y)
{
	if(data[x+1][y+1]==-1)
	{
		return -1;
	}else{
		return 1;
	}
	
} 


//设置后台元素数据 
void setnumber()
{
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(data[i][j]==0)
			{
				if(data[i-1][j-1]==-1)
				   data[i][j]++;
				   
				if(data[i-1][j]==-1)
				   data[i][j]++;
				   
				if(data[i-1][j+1]==-1)
				   data[i][j]++;
				   
				if(data[i][j-1]==-1)
				   data[i][j]++;
				   
				if(data[i][j+1]==-1)
				   data[i][j]++;
				   
				if(data[i+1][j-1]==-1)
				   data[i][j]++;
				   
				if(data[i+1][j]==-1)
				   data[i][j]++;
				   
				if(data[i+1][j+1]==-1)
				   data[i][j]++; 
			}
		}
	} 
}




int main()
{
	Init();
	scanf("%d %d %d %d",&n,&m,&k,&l);    //输入数据 
	//将炸弹保存进后台数组 
	for(int i=0;i<k;i++){
		int a=0,b=0;
		scanf("%d %d",&a,&b);
		setboom(a,b);
	} 
	//设置所有元素数值 
    setnumber();
    
    //玩家操作
    int x,y;   //玩家操作的坐标 
    int flag=0;   //设置一个标志位 
	for(int i=0;i<l;i++){
		scanf("%d %d",&x,&y);
		
		if((flag=panduan(x,y)==-1)){
			dispdata();
			printf("You lose");
		}else{
			 swap(x,y);
			 disp();
			 if(count==n*m-k){
			 	printf("You win");
			 }
		}
		
	} 
    
	return 0;
} 
壹怪的主页 壹怪 | 初学一级 | 园豆:104
提问于:2021-12-03 10:54

我也是醉了,程序开始任何提示都没有,用户怎么输入,输入什么,也没有一个说明,打开就是一个光标在闪,一脸懵逼

中华鲟3670 2年前

@中华鲟3670: 看题目... 题目这样的呀

壹怪 2年前
< >
分享
所有回答(2)
0

打个断点,逐步看看

中华鲟3670 | 园豆:847 (小虾三级) | 2021-12-03 13:45
0

已近解决..

壹怪 | 园豆:104 (初学一级) | 2022-01-07 09:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册