纸牌游戏——小猫钓鱼

来源:互联网 发布:高街风格 男生知乎 编辑:程序博客网 时间:2024/04/29 02:25

 星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。

#include <stdio.h>#include <stdlib.h>#include<string.h>struct queue{    int data[100];    int head;    int tail;};struct stack{    int data[100];    int top;};int main(){    struct queue q1;    struct queue q2;    struct stack s;    int n;    int i;    int t;    int book[10];    memset(book,0,sizeof(book));//初始化标记数组,标记桌子上的牌    s.top =0;//队和栈初始化    q1.head=1;    q1.tail=1;    q2.head=1;    q2.tail=1;    printf("请输入牌的个数: ");    scanf("%d",&n);    for(i=1; i<=n; i++)    {        scanf("%d",&q1.data[q1.tail]);//q1的牌        q1.tail++;    }    for(i=1; i<=n; i++)//q2的牌    {        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)        {            //q1这轮没有赢牌            q1.head++;            s.top++;            s.data[s.top]=t;//往栈里放牌            book[t]=1;//说明桌子上有刚才放的那张牌        }        else        {            //q1这轮赢牌            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--;            }            //收回牌面为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;//q1的牌已经打完,下面同理进行q2的操作        t = q2.data[q2.head];//出第一张牌        if(book[t]==0)        {            //q2这轮没有赢牌            q2.head++;            s.top++;            s.data[s.top]=t;//往栈里放牌            book[t]=1;//说明桌子上有刚才放的那张牌        }        else        {            //q2这轮赢牌            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--;            }            //收回牌面为t的牌            book[s.data[s.top]]=0;            q2.data[q2.tail ]=s.data[s.top];            q2.tail++;            s.top--;        }    }    if(q2.head ==q2.tail)    {        printf("q1赢了!\n");        printf("q1现在手中的牌是:  ");        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("桌子上没有牌!\n");    }    else    {        printf("q2赢了!\n");        printf("q2现在手中的牌是:  ");        for(i=q2.head; i<=q2.tail-1; i++)            printf(" %d",q2.data[i]);        if(s.top>0)        {            printf("\n桌上的牌是:  ");            for(i=1; i<=s.top; i++)                printf(" %d",s.data[i]);        }        else            printf("桌子上没有牌!\n");    }    return 0;}


原创粉丝点击