搜索
查看: 3467|回复: 14
打印 上一主题 下一主题

纸牌游戏小猫钓鱼有问题求教!

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-15 21:36:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                        //小哼赢牌了!
                        q1.head++;//小哼打出一张,队首出队
                        q1.data[q1.tail] = t;//刚出的牌放到队尾,队尾指向下一地址
                        q1.tail++;

                        while (s.data[s.top]!=t)//循环,直到top=t
                        {
                                book[s.data[s.top]] = 0;//把所有收走的牌标记为0
                                q1.data[q1.tail] = s.data[s.top];
                                q1.tail++;//小哼队尾后移
                                s.top--;//出栈,栈顶-1

                        }

s.data[s.top]=t时循环中止,这样和T相同的那张牌是不是还在队列当中没有拿到小哼手中啊?因为s.data[s.to=t时就到了相同的那张牌了,但是没有相应的代码操作这张牌啊???是我理解错了吗?

推荐
发表于 2017-2-14 16:44:14 | 只看该作者
//小哼赢牌了!
                        q1.head++;//小哼打出一张,队首出队
                        q1.data[q1.tail] = t;//刚出的牌放到队尾,队尾指向下一地址
                        q1.tail++;

                        while (s.data[s.top]!=t)//循环,直到top=t
                        {
                                book[s.data[s.top]] = 0;//把所有收走的牌标记为0
                                q1.data[q1.tail] = s.data[s.top];
                                q1.tail++;//小哼队尾后移
                                s.top--;//出栈,栈顶-1

                        }
book[s.data[s.top]] = 0;//把所有收走的牌标记为0
                                q1.data[q1.tail] = s.data[s.top];
                                q1.tail++;//小哼队尾后移
                                s.top--;//出栈,栈顶-1

在循环将不同的数拿到手里后,再将相同的那一张给拿过来。
----感觉do while不太靠谱吧
板凳
 楼主| 发表于 2014-10-16 10:43:41 来自手机 | 只看该作者
晚上回去单步一下。
来自: 微社区
地板
发表于 2015-1-18 10:53:15 | 只看该作者
貌似是这样的。我自己写的时候用的是do while循环,貌似和书中的结果不一样。你单步的结果怎么样了?
5#
发表于 2015-1-18 10:59:28 | 只看该作者
哦,这个循环没有影响。因为判断完了会马上取下一张牌进行操作,所以这里判断的可以理解为即将操作的上一张拍。判断相等的时候要操作的是相等那张牌下面的那张了,所以这时候应该终止循环,这个逻辑木有问题

点评

玩家手中的牌是列表,他下一次出的牌为自己列表当中的head  发表于 2017-7-15 17:03
6#
发表于 2015-3-4 13:16:49 | 只看该作者
如果是按照书上的原始代码,是有点问题。
关于楼上的do while是先执行 后判断,这个则没问题

例如 考虑只有4张牌的情况
                  第一位玩家的牌是 1 1
                  第二位玩家的牌是2 3
应该结果为 第一位玩家胜,他的牌是 1 2 1
                  桌上的牌 3
但是该程序输出结果是
                  第一位玩家胜,他的牌是 1 2
                  卓上的牌 1 3
显然有个1没有收走

点评

do while 与while 的区别应该只是第一次做不做判断,后面还是会继续先判断后执行的吧  发表于 2017-7-15 17:01
如果用do while先执行 后判断,如果s.top即为相等牌,那不是要把所有的牌都放入手中还是找不到相等的牌了?  发表于 2017-2-14 16:24
7#
发表于 2015-9-5 15:18:03 | 只看该作者
我也看到这个问题了,因为我用stl的数据结写了一遍.发现结果不一样.
代码和题目 要求"可将两张相同的牌及其中间所夹的牌全部取走" 不一样.
8#
发表于 2016-2-26 08:52:21 | 只看该作者
你理解的是对的,书上代码是错误的
9#
发表于 2016-3-3 21:36:05 | 只看该作者
我用java算了一下,最后小哼输了
10#
发表于 2017-7-15 17:00:48 | 只看该作者
王萍萍 发表于 2015-3-4 13:16
**** 作者被禁止或删除 内容自动屏蔽 ****

do while 与while 的区别应该只是第一次做不做判断,后面还是会继续先判断后执行的吧
11#
发表于 2017-11-18 18:55:37 | 只看该作者
我也有这个疑问,找扑克模拟了一下,按照文字描述的话,两张相同的牌及其之间的牌都取走的话,应该是小哈赢,如果按照程序里写的那种做法的话,留下了那张s.data[s.top]==t的牌,就是最后的结果了,
12#
发表于 2019-10-26 16:28:45 | 只看该作者
#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; } 运行结果:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表