纸牌游戏-小猫钓鱼(队列和栈的基本应用)

来源:互联网 发布:mac连不上手机热点 编辑:程序博客网 时间:2024/05/17 03:50

首先给小哼和小哈发牌,然后按照先小哼后小哈的出牌顺序出牌。出牌时,若某人打出的牌面与桌子上的某张牌面相同,则这个人将两张相同和之间的牌全部取走,并依次放在自己手中牌的末尾。当任意一人手中的牌全部取完时,游戏结束,对手获胜。

 分析:

     不管小哼还是小哈,他们总共只有两种操作--出牌和赢牌,这就可以很好地用出列和入列模拟,用栈模拟桌子,能够很好地清楚桌子上的牌的情况。

#include"stdio.h"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]={0};    //初始化队列    q1.head=1;q1.tail=1;    q2.head=1;q2.tail=1;    //初始化栈    s.top=0;    //给小哼发牌    for(i=1;i<=6;i++)    {        scanf("%d",&q1.data[q1.tail]);        q1.tail++;    }    //给小哈发牌    for(i=1;i<=6;i++)    {        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.head++;//打出的牌出列            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--;            }            //收下另一张与打出的牌相同的牌,并将它们放到手牌后面            q1.data[q1.tail]=s.data[s.top];            q1.tail++;            s.top--;            book[t]=0;//此时小哼打出的牌在桌子上的出现次数归零        }        if(q1.head==q1.tail)    break;//如果小哼打完手中牌,则游戏结束        //小哈出牌阶段        t=q2.data[q2.head];//标记小哈打出的牌        if(book[t]==0)//小哈打出的牌没有和桌子上一致,则没有赢牌        {            q2.head++;//打出的牌出列            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--;            }            //小哈收下与打出的牌相同的牌            q2.data[q2.tail]=s.data[s.top];            q2.tail++;            s.top--;            book[t]=0;//此时小哈打出的牌在桌子上在桌子上的出现次数归零        }    }    if(q1.head==q1.tail)    {        printf("小哈win\n小哈当前手中的牌是:");        for(i=q2.head;i<q2.tail;i++)            printf(" %d",q2.data[i]);//依次输出小哈手上的牌        printf("\n");        if(s.top==0)//判断栈顶是否为0,从而判断桌子是否还有牌            printf("桌子上没有牌了\n");        else{            printf("桌子上的牌是:");            for(i=1;i<=s.top;i++)                printf(" %d",s.data[i]);//依次输出桌子上的牌            printf("\n");        }    }    else    {       printf("小哼win\n小哼当前手中的牌是:");        for(i=q1.head;i<q1.tail;i++)            printf(" %d",q1.data[i]);//依次输出小哼手上的牌        printf("\n");        if(s.top==0)//判断栈顶是否为0,从而判断桌子是否还有牌            printf("桌子上没有牌了\n");        else{            printf("桌子上的牌是:");            for(i=1;i<=s.top;i++)                printf(" %d",s.data[i]);//依次输出桌子上的牌            printf("\n");        }    }    return 0;}
运行结果:
 总结:

     首先联想这个游戏的过程,然后利用队列和栈进行模拟此过程。代码改了很多次才改对,很多都是逻辑上没有错误,只是一点打错的错误。这点错误看了很久才看出来,这是不应该,所以以后调试代码的时候不要太急,沉下心来慢慢找。


0 0