队列和栈的应用——纸牌游戏,小猫钓鱼(摘自:《啊哈!算法》)

游戏规则:双人游戏,将纸牌平均分成两份,每人拿一份。两人轮流出牌,每次出牌放到上一张出的牌上,若桌面上有与他打出  的牌相同的牌,则把这两张牌及中间所有的牌都拿走,并放到自己手牌的末尾,若有人把牌打完,则另一人胜利;

#include <stdio.h>

struct stacks                   //设置一个栈,用来模拟桌上的牌
{
    int top;
    int date[10];
};

struct queue                    //设置一个队列,用来模拟两人的手牌
{
    int head;
    int tail;
    int date[1000];
};
int main(void)
{
    int i,t;
    int book[10]={0};                   //book用于记录桌上的牌以及点数,用于判断赢牌
    struct stacks stack;
    struct queue q1,q2;             //q1,q2分别为两人手牌

    //准备阶段
    stack.top=0;
    q1.head=0;
    q1.tail=0;
    q2.head=0;
    q2.tail=0;                      //初始化,开始桌面和手中均没有牌

    for(i=0;i<6;++i)
    {
        scanf("%d",&q1.date[q1.tail++]);     //第一个人先拿6张牌,即入队操作
    }

    for(i=0;i<6;++i)
    {
        scanf("%d",&q2.date[q2.tail++]);
    }

    //游戏开始
    while(q1.head<q1.tail && q2.head<q2.tail)       //两人手中都有手牌才进行游戏
    {
        t=q1.date[q1.head++];       //出牌相当于出对t暂存出的牌,然后判断桌上是否有相同点数牌
        if(1==book[t])          //发现桌上有相同点数的牌
        {
            q1.date[q1.tail++]=t;       //首先,将这张牌拿回来
            while(stack.date[stack.top]!=t)  //再那桌上的牌
            {
                book[stack.date[stack.top]]=0;
                q1.date[q1.tail++]=stack.date[stack.top--];
            }
            q1.date[q1.tail++]=stack.date[stack.top--];
            book[t]=0;
        }
        else            //若没有相同的牌
        {
            stack.date[++stack.top]=t;       //相当于出队,入栈操作
            book[t]=1;
        }
        if(q1.head==q1.tail)            //第一个人牌若打完,游戏结束
            break;
        //第一个人的操作模拟完成,接下来写第二个人的
        t=q2.date[q2.head++];
        if(1==book[t])
        {
            q2.date[q2.tail++]=t;
            while(stack.date[stack.top]!=t)
            {
                book[stack.date[stack.top]]=0;
                q2.date[q2.tail++]=stack.date[stack.top--];
            }
            q2.date[q2.tail++]=stack.date[stack.top--];
            book[t]=0;
        }
        else
        {
            stack.date[++stack.top]=t;
            book[t]=1;
        }
        if(q2.head==q2.tail)
            break;
    }

    if(q1.head==q1.tail)
    {
        printf("第二个人获得游戏胜利\n");
        printf("他手中的排是:");
        for(i=q2.head;i<q2.tail;++i)
            printf("%d ",q2.date[i]);
        printf("\n");
        if(stack.top>0)
        {
            printf("桌上的牌是:");
            while(stack.top>0)
            {
                printf("%d ",stack.date[stack.top--]);
            }
        }
        else
            printf("桌上没有牌");
    }
    else
    {
        printf("第一个人获得游戏胜利\n");
        printf("他手中的排是:");
        for(i=q1.head;i<q1.tail;++i)
            printf("%d ",q1.date[i]);
        printf("\n");
        if(stack.top>0)
        {
            printf("桌上的牌是:");
            while(stack.top>0)
            {
                printf("%d ",stack.date[stack.top--]);
            }
        }
        else
            printf("桌上没有牌");
    }

    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/80083687