纸牌游戏——队列和栈的应用

#include<stdio.h>
struct queue
{
int date[1000];
int head;
int tail;
};//将小哼和小哈的牌定为队列

struct stack
{
int date[10];
int top;
};//将桌上的牌定为栈
int main()
{
struct queue q1,q2;
struct stack s;
int i,t;
int book[10];//将桌上的牌存入,如有则为1,如没有,则为默认值0

q1.head=1;
q1.tail=1;
q2.head=1;
q2.tail=1;
s.top=0;

for(i=1; i<=9; i++)
book[i]=0;//此时桌上没有牌
for(i=1; i<=6; i++)//读入少哼手中的牌
{
scanf("%d",&q1.date[q1.tail]);
q1.tail++;
}
for(i=1; i<=6; i++)//读入小哈手中的牌
{
scanf("%d",&q2.date[q2.tail]);
q2.tail++;
}
while(q1.head<q1.tail && q2.head<q2.tail)//当小哼和小哈手中的牌都不为空时
{
t=q1.date[q1.head];//小哼将手中的第一张牌打到桌上
if(book[t]==0)//如果桌上没有与小哼出的牌相同的话
{
q1.head++;//出队
s.top++;//入栈
s.date[s.top]=t;
book[t]=1;//此时桌上已有这张面值的牌了
}
else//如果桌上有与小哼出的牌相同的话
{
q1.head++;//出队
q1.date[q1.tail]=t;//将出队的牌入队,放到最后一张
q1.tail++;
while(s.date[s.top]!=t)//将桌上的牌一张一张的放入小哼的手中
{
book[s.date[s.top]]=0;//将出栈的牌置为0
q1.date[q1.tail]=s.date[s.top];//入队
q1.tail++;
s.top--;
}
book[s.date[s.top]]=0;//将最后一张与出队的牌相同面值的牌也入队到手中
q1.date[q1.tail]=s.date[s.top];
q1.tail++;
s.top--;
}
if(q1.head==q1.tail) break;//如果此时小哼手中已没有牌了,小哈获胜

//下面的与小哼同款
t=q2.date[q2.head];
if(book[t]==0)
{
q2.head++;
s.top++;
s.date[s.top]=t;
book[t]=1;
}
else
{
q2.head++;
q2.date[q2.tail]=t;
q2.tail++;
while(s.date[s.top]!=t)
{
book[s.date[s.top]]=0;
q2.date[q2.tail]=s.date[s.top];
q2.tail++;
s.top--;
}
book[s.date[s.top]]=0;
q2.date[q2.tail]=s.date[s.top];
q2.tail++;
s.top--;
}
}
if(q2.head==q2.tail)
{
printf("小哼win\n");
printf("小哼当前手中的牌是");
for(i=q1.head; i<=q1.tail; i++)
printf(" %d",q1.date[i]);
if(s.top>0)
{
printf("\n桌山上的牌是");
for(i=1; i<s.top; i++)
printf(" %d",s.date[i]);
}
else printf("\n桌上已经没有拍了");
}
else
{
printf("小哈win\n");
printf("小哈当前手中的牌是");
for(i=q2.head; i<=q2.tail; i++)
printf(" %d",q2.date[i]);
if(s.top>0)
{
printf("\n桌山上的牌是");
for(i=1; i<s.top; i++)
printf(" %d",s.date[i]);
}
else printf("\n桌上已经没有拍了");
}

return 0;
}

posted @ 2017-03-05 20:27  wudidamowang666  阅读(190)  评论(0编辑  收藏  举报