纸牌游戏---栈和队列简单应用

栈和队列的简单应用---扑克游戏,游戏规则很简单,首先将一副扑克牌均分成两份给两个玩家(甲乙),让甲先出牌,然后让乙出牌,并把牌放在甲的打出的牌上方,两人交替出牌。出牌时,如果某个玩家打出的牌和桌上某张牌一样,就可以将这两张一样的牌及两张牌中间所夹得牌全部收走,并依次放在自己手中的牌的末尾。如果有一个玩家手中没有牌了,游戏结束,对方赢得游戏。

假设只有12张牌,甲乙各6张牌,牌面只有数字1到9,每个玩家都只有出牌和赢牌两种操作,出牌操作相当于出队,赢牌操作相当于入队,而桌子相当于一个栈,把牌打出放在桌上相当于入栈,从桌上拿走牌相当于出栈。手中先无牌者输,即该队列为空。

#include<stdio.h> 
struct queue{
	int data[100];
	int head;
	int tail;
};

struct stack{
	int data[10];
	int top;
};
//假设牌面只设有数字1-9 
int main(){
	struct queue q1,q2;
	struct stack s;
	int i,t;
	int book[10];//记录桌上有哪些牌 
	//初始化队列 
	q1.head=q1.tail=1;
	q2.head=q2.tail=1;
	s.top=0;//初始化栈 
	
	for(i=1;i<=9;i++)
	   book[i]=0;//最初的时候桌面还没有牌 
	
	
	for(i=1;i<=6;i++){//读入6张牌,放在甲手中 
		scanf("%d",&q1.data[q1.tail]);
		q1.tail++;
	}
	
	for(i=1;i<=6;i++){//读入6张牌,放在乙手中 
		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;//桌上已有牌面为t的牌 
		}
		else{//桌上有牌面为t的牌,此时甲能赢 
			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;//拿走桌上牌面为t的牌放在手牌的末尾 
			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("甲手中的牌是:");
		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("桌上没有剩余的牌!");
		}	
	}
	else{
		printf("乙赢\n"); 
		printf("乙手中的牌是:");
		for(i=q2.head;i<=q2.tail-1;i++){
			printf("%d ",q2.data[i]);
		}
		if(s.top>0){
			printf("桌上剩下的牌是:");
			for(i=1;i<=s.top;i++)
			    printf("%d ",s.data[i]); 
		}
		else{
			printf("桌上没有剩余的牌!");
		}	
	}
	return 0; 
  }

利用了两个结构体,没有使用指针,定义了一个book数组来记录桌上有哪些牌,用到的方法和桶排序的方法是一样的,也可以枚举,利用for循环,试了很多组数据,没有错误,不过应该存在使循环不能退出的情况,也就是游戏不会结束,但是暂时没有找到这样两组数据。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值