啊哈算法——纸牌游戏,小猫钓鱼问题或有缺失导致无法正常运行

1.读者自检
        如果已经写完代码可以输入数据结合上文正确数据和下文可能导致的错误进行比照,从而判定当前错误与本文是否有关

 

lose1收回牌面的时候没有收回最后一张的t(两人两处),
导致错误:输出数据手中牌和桌子上的牌的总和会小于等于两人初始的牌总数

lose2在q1出完牌之后没有进行检查,导致可能q1出完牌之后游戏还在进行,
导致错误:输出的数据和正确数据在手中牌中==有时==会少一张牌,这张牌会出现在桌子上面

2.啊哈原代码和缺失点解剖

#include <stdio.h>
struct queue 
	{
		int data[1000];
		int tail;
		int head;	
	};
struct stack
	{
		int data[10];
		int top;
	};
	//1.1对 两个人的牌面和桌子上面的牌数量进行设置结构体
int main()
{
	struct queue q1,q2;
	struct stack s;
	int t;//输入的数据
	int i;
	int book[10];
	
	//1.2设相关变量
	q1.head=1;q1.tail=1;
	q2.head=1;q2.tail=1;
	//1.3对结构体进行初始化
	s.top=0;
	//输入结构
//	scanf("%d",&n);
	//2.1输入n组数据
	for(i=0;i<=9;i++)
	{
		book[i]=0;
	}
	for(i=1;i<=6;i++)
	{
		scanf("%d",&q1.data[q1.tail]);
		q1.tail++;
	}
	for(i=1;i<=6;i++)
	{
		scanf("%d",&q2.data[q2.tail]);
		q2.tail++;
	}
	//2.2输入两组数据
	while(q1.head<q1.tail && q2.head<q2.tail)
	{
		//3.1当他们没有人手中没牌的时候
		t=q1.data[q1.head];
		//3.2.1输入一张牌,在头文件中输入
		if(book[t]==0)
		{
			q1.head++;
			s.top++;
			s.data[s.top]=t;
			book[t]=1;
		}
		//3.2.2当他们么有重复的 让下一位出来(两边都要完成),计入顺序,计入数组
		else
		{
			q1.head++;
			q1.data[q1.tail]=t;
			q1.tail++;
			while(s.data[s.top]!=t)
			{	book[s.data[s.top]]=0;
				q1.data[q1.tail]=s.data[s.top];
			
				q1.tail++;
				s.top--;

			}
		===========================LOSE 1============================
			/*book[s.data[s.top]]=0;
            q1.data[q1.tail ]=s.data[s.top];
            q1.tail++;
            s.top--;*/
            //这一部分是啊哈算法没有计入的最后一张牌的位置
			
		}
		
		//3.2.3当他们有重复的先把相同的牌面放到最后,同时输出牌面
		
		//再把所有牌(首先放入一张T,再放入中间牌面,最后再次放入t)都放进去然后清除记忆
		============================LOSE 2===========================
		/*if(q1.head==q1.tail)
		{
			break;
		}*/
		//应当考虑当q1出完牌之后是否还有剩余的牌,当没有剩余牌的时候游戏直接结束

		t=q2.data[q2.head];
		if(book[t]==0)
		{
			q2.head++;
			s.top++;
			s.data[s.top]=t;
			book[t]=1;
		}
		else
			{
			q2.head++;
			q2.data[q2.tail]=t;
			q2.tail++;
			while(s.data[s.top]!=t)
			{
				q2.data[q2.tail]=s.data[s.top];
				book[s.data[s.top]]=0;
				q2.tail++;
				s.top--;

			}
		============================LOSE 3===========================
			/*book[s.data[s.top]]=0;
            q2.data[q2.tail ]=s.data[s.top];
            q2.tail++;
            s.top--;*/
            //第三处同理第一处
			
}
}



	if(q2.tail==q2.head)
	{
		printf("小哼win\n");
		printf("小哼当前手中的牌是");
		for(i=q1.head;i<=q1.tail-1;i++)
		{
			printf(" %d",q1.data[i]);
		}
		if(s.top>0)
		{
			printf("\n桌上的牌是");
			for(i=1;i<=s.top;i++)
			{
				printf(" %d",s.data[i]);
			}
		}
		else
			printf("\n桌上已经没有牌了");


	}
	else
	{
		printf("小哈win\n");
		printf("小哈当前手中的牌是");
		for(i=q2.head;i<=q2.tail-1;i++)
		{
			printf(" %d",q2.data[i]);
		}
		if(s.top>0)
		{
			printf("\n桌上的牌是");
			for(i=1;i<=s.top;i++)
			{
				printf(" %d",s.data[i]);
			}
		}
		else
			printf("\n桌上已经没有牌了");
	}
//4.输出结构
return 0;

}

3.正确代码(改正之后)

        把三个缺失代码补上之后就可以正常运行了,为防止中间代码还有错误,把正确代码贴在这里,希望有帮助

#include <stdio.h>
struct queue 
	{
		int data[1000];
		int tail;
		int head;	
	};
struct stack
	{
		int data[10];
		int top;
	};
	
int main()
{
	struct queue q1,q2;
	struct stack s;
	int t;
	int i;
	int book[10];
	q1.head=1;q1.tail=1;
	q2.head=1;q2.tail=1;
	s.top=0;
	for(i=0;i<=9;i++)
	{
		book[i]=0;
	}
	for(i=1;i<=6;i++)
	{
		scanf("%d",&q1.data[q1.tail]);
		q1.tail++;
	}
	for(i=1;i<=6;i++)
	{
		scanf("%d",&q2.data[q2.tail]);
		q2.tail++;
	}
	while(q1.head<q1.tail && q2.head<q2.tail)
	{
		t=q1.data[q1.head];
		if(book[t]==0)
		{
			q1.head++;
			s.top++;
			s.data[s.top]=t;
			book[t]=1;
		}
		else
		{
			q1.head++;
			q1.data[q1.tail]=t;
			q1.tail++;
			while(s.data[s.top]!=t)
			{	book[s.data[s.top]]=0;
				q1.data[q1.tail]=s.data[s.top];
			
				q1.tail++;
				s.top--;

			}
			book[s.data[s.top]]=0;
            q1.data[q1.tail ]=s.data[s.top];
            q1.tail++;
            s.top--;
			
		}

		if(q1.head==q1.tail)
		{
			break;
		}


		t=q2.data[q2.head];
		if(book[t]==0)
		{
			q2.head++;
			s.top++;
			s.data[s.top]=t;
			book[t]=1;
		}
		else
			{
			q2.head++;
			q2.data[q2.tail]=t;
			q2.tail++;
			while(s.data[s.top]!=t)
			{
				q2.data[q2.tail]=s.data[s.top];
				book[s.data[s.top]]=0;
				q2.tail++;
				s.top--;

			}
			book[s.data[s.top]]=0;
            q2.data[q2.tail ]=s.data[s.top];
            q2.tail++;
            s.top--;
			
}
}



	if(q2.tail==q2.head)
	{
		printf("小哼win\n");
		printf("小哼当前手中的牌是");
		for(i=q1.head;i<=q1.tail-1;i++)
		{
			printf(" %d",q1.data[i]);
		}
		if(s.top>0)
		{
			printf("\n桌上的牌是");
			for(i=1;i<=s.top;i++)
			{
				printf(" %d",s.data[i]);
			}
		}
		else
			printf("\n桌上已经没有牌了");


	}
	else
	{
		printf("小哈win\n");
		printf("小哈当前手中的牌是");
		for(i=q2.head;i<=q2.tail-1;i++)
		{
			printf(" %d",q2.data[i]);
		}
		if(s.top>0)
		{
			printf("\n桌上的牌是");
			for(i=1;i<=s.top;i++)
			{
				printf(" %d",s.data[i]);
			}
		}
		else
			printf("\n桌上已经没有牌了");
	}
return 0;

}


 

猜你喜欢

转载自blog.csdn.net/wen030803/article/details/128681874