您的位置:首页 > 其它

啊哈!算法—纸牌游戏—小猫钓鱼

2016-04-28 12:24 260 查看

扑克游戏:

将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张放在桌上,就这样两人交替出牌。

出牌时,若某人打出的牌与桌面上的某张牌面相同,即将两张相同的牌以及中间的全部取走,并依次放在自己手中牌的末尾。当任意一人手中的牌全部取完时,游戏结束,对手获胜。

思路:

小哼和小哈有两种操作:出牌和赢牌,即对应出队和入队。桌子即相当于栈,打出一张牌和取走牌对应入栈和出栈。

程序如下:

#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 i,t,book[10];
//初始化队列
q1.head=1;
q1.tail=1;
q2.head=1;
q2.tail=1;
//初始化栈
s.top=0;
//初始化用来标记的数组,用来标记哪些牌已经放在桌上
for(i=1; i<=9; i++)
book[i]=0;
//依次向队列中插入6个数,即小哼和小哈手中的牌
for(i=1; i<=6; i++)
{
cin>>q1.data[q1.tail];
q1.tail++;
}
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)     //表示桌面上没有此牌
{
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--;     //栈中少了一张牌,栈减1
}
//收回桌上牌面为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)
{
cout<<"小哼win"<<endl;
cout<<"小哼当前手中的牌是:";
for(i=q1.head; i<=q1.tail-1; i++)
cout<<q1.data[i]<<" ";
if(s.top>0)
{
cout<<"\n桌上的牌是:";
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]<<" ";
if(s.top>0)
{
cout<<"\n桌上的牌是:";
for(i=1; i<=s.top; i++)
cout<<s.data[i]<<" ";
}
else
cout<<"桌上已经没有牌了!"<<endl;
}
cout<<endl;
return 0;
}


运行结果:



学习心得:

  栈和队列涉及的程序,就像小孩学步一样,按照原有的步骤,将其模拟一遍,得到最终的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法