2.3纸牌游戏——小猫钓鱼

#include<iostream>
using namespace std;
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=q1.tail=1;
	q2.head=q2.tail=1;
	//初始化栈
	s.top=0;
	//初始化用来标记的数组,用来标记那些牌已经在桌上
	for(i=1;i<=9;i++){
		book[i]=0;
	} 
	
	//依次向队列插入6个数
	//小哼手上的6张牌 
	cout<<"请依次输入小哼手中的6张牌:"<<endl;
	for(i=1;i<=6;i++){
		cin>>q1.data[q1.tail];
		q1.tail++;
	}
	//小哈手上的6张牌 	
	cout<<"请依次输入小哈手中的6张牌:"<<endl;
	for(i=1;i<=6;i++){
		cin>>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{
			//小哼此轮可以赢牌
			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--;//栈中少了一张牌,所以栈顶要减1 
			} 
		} 
		
		t=q2.data[q2.head];//小哈出一张牌
		//判断小哈当前打出的牌是否能赢牌 
		if(book[t]==0){//表明桌上没有牌面为t的牌
			//小哈此轮没有赢牌
			q2.head++;//小哈已经打出一张牌,所以要把打出的牌出队 
			s.top++;
			s.data[s.top]=t;//再把打出的牌放到桌上,即入栈 
			book[t]=1;// 标记桌上现在已经有牌面为t的牌			
		}
		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--;//栈中少了一张牌,所以栈顶要减1 
			} 
		} 
	}
	
	if(q2.head==q2.tail){
		cout<<"小哼Win"<<endl;
		cout<<"小哼当前手中的牌是:";
		for(i=q1.head;i<=q1.tail-1;i++){
			cout<<q1.data[i]<<" ";
		} 
		if(s.top>0){//如果桌上有牌则依次输出桌上的牌 
			cout<<endl<<"桌上的牌是:";
			for(i=1;i<=s.top;i++){
				cout<<s.data[i]<<" ";
			} 
		}
		else{
			cout<<"桌上已经没有牌了"<<endl;
		}
	} 
	else{
		cout<<"小哈Win"<<endl;
		cout<<"小哈当前手中的牌是:";
		for(i=q2.head;i<=q2.tail-1;i++){
			cout<<q2.data[i]<<" ";
		} 
		
		cout<<endl<<"小哼当前手中的牌是:";
		for(i=q1.head;i<=q1.tail-1;i++){
			cout<<q1.data[i]<<" ";
		} 
		
		if(s.top>0){//如果桌上有牌则依次输出桌上的牌 
			cout<<endl<<"桌上的牌是:";
			for(i=1;i<=s.top;i++){
				cout<<s.data[i]<<" ";
			} 
		}
		else{
			cout<<"桌上已经没有牌了"<<endl;
		}
	}
	
	getchar();
	return 0;
	
}
/*
这个代码还是有问题的,比如游戏可能无法结束,就是小哼和小哈可以永远玩下去,谁都无法赢得对方所有的牌。
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值