纸牌游戏-----小猫钓鱼

游戏规则 将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放桌上,然后小哈也拿出来手中的第一张扑克牌,并放在小哼刚打出来的扑克牌上边,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌面上某张牌的牌面相同,即可将两张相同的牌极其中间所加的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。

假如游戏开始小哼和小哈手中各有6 张牌,小哼:2 4 1 2 5 6,小哈:3 1 3 5 6 4 我们来分析一下这个游戏有哪几种操作。小哼有两种操作,分别是出牌和赢牌。这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。小哈也一样。而桌子就是一个栈,每放一张牌在桌子上就相当于入栈。当有人赢牌时,依次从桌子上拿走牌,就相当于出栈。

赢牌规则
如果某人打出的牌与桌上的某张牌相同,即可将两张相同的牌极其中间所加的牌全部取走。那么如何确定桌上已经有哪些牌了呢?最简单的方法就是枚举桌上的每一张牌。

我们需要两个队列一个栈来模拟整个游戏
首先我们先创建一个结构体实现队列

struct queue
{
	int data[1000];
	int head;
	int tail;
};

上述代码中head用来存储队头,tail用来存储队尾。数组data用来存储队列中的元素。
再创建一个结构体来实现栈

struct stack
{
int data a[10];
int top;
};

其中top用来存储栈顶,数组data用来存储栈中元素
接下来我们需要定义两个队列变量q1和q2。q1用来模拟小哼手中的牌,q2用来模拟小哈手中的牌。定义一个栈变量s用来模拟桌上的牌。

struct queue q1,q2;
struct stack s;

接下来初始化一下队列和栈

//初始化队列q1和q2为空,此时两人的手中还没有牌
q1.head=1;q1.tail=1;
q2.head=1;q2.tail=1;
//初始化栈为空,最开始桌上没有牌
s.top=0;

接下来需要读入小哈和小哼手中的牌,分两次读入,每次读入6个数,分别插入q1和q2中。

完整代码

#include<stdio.h>
struct queue
{
	int data[1000];
	int head;
	int tail;
 };
 struct stack
 {
 	int data[10];
 	int top;
 };
 int main()
 {
 	struct queue q1,q2;
 	struct stack s;
 	int book[10];
 	int i,t;
 	//初始化队列
	 q1.head=1;q1.tail=1;
	 q2.head=1;q2.tail=1;
	//初始化栈
	for(i=1;i<=9;i++)
	{
		book[i]=0;//记录桌上有几张牌 
	 } 
	 //小哼手中的6张牌
	 for(i=1;i<=6;i++)
	 {
	 	scanf("%d",&q1.data[q1.tail]);
	 	q1.tail++;
	  } 
	  //小哈手中的6张牌
	  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)//桌子上没有牌面为t的牌 
		 	{
		 		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--;
				 } 
				 //收回桌子上牌面为t的牌
				 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)
			  	{
			  		book[s.data[s.top]]=0;
			  		q2.data[q2.tail]=s.data[s.top];
			  		q2.tail++;
			  		s.top--;
				}
				  book[s.data[s.top]]=0;
				  q2.data[q2.tail]=s.data[s.top];
				  q2.tail++;
				  s.top--;
			  	
			 }
    	}
		if(q2.head==q2.tail)//小哼赢
 		{
 			printf("小哼赢\n");
	 		printf("小哼当前手中的牌是:\n");
	 		for(i=q1.head;i<=q1.tail-1;i++)
	 		{
	 			printf("%5d",q1.data[i]);
	  		} 
	  		if(s.top>0)
	  		{
	  			printf("桌上的牌是:\n");
	  			for(i=0;i<=s.top;i++)
	  			{
	  				printf("%5d",s.data[i]);
		  		}
	  		}
	  		else
	  		{
	  			printf("桌上没有牌了");
	  		}
		}
		else
		{		
			printf("小哈赢了\n");
			printf("小哈当前手中的牌是:\n");
			for(i=q2.head;i<=q2.tail-1;i++)
			{
				printf("%5d",q2.data[i]);
			}
			if(s.top>0)
			{
				printf("桌上的牌是:\n");
	  			for(i=0;i<=s.top;i++)
	  			{
	  				printf("%5d",s.data[i]);
				}
			}
			else
			{
	  			printf("桌上没有牌了");
			}	
	
		 } 
	return 0;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值