啊哈磊_编程从这里起步
标题:
纸牌游戏小猫钓鱼有问题求教!
[打印本页]
作者:
kuaile1210
时间:
2014-10-15 21:36
标题:
纸牌游戏小猫钓鱼有问题求教!
//小哼赢牌了!
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时就到了相同的那张牌了,但是没有相应的代码操作这张牌啊???是我理解错了吗?
作者:
kuaile1210
时间:
2014-10-16 10:43
晚上回去单步一下。
作者:
feimao
时间:
2015-1-18 10:53
貌似是这样的。我自己写的时候用的是do while循环,貌似和书中的结果不一样。你单步的结果怎么样了?
作者:
feimao
时间:
2015-1-18 10:59
哦,这个循环没有影响。因为判断完了会马上取下一张牌进行操作,所以这里判断的可以理解为即将操作的上一张拍。判断相等的时候要操作的是相等那张牌下面的那张了,所以这时候应该终止循环,这个逻辑木有问题
作者:
王萍萍
时间:
2015-3-4 13:16
如果是按照书上的原始代码,是有点问题。
关于楼上的do while是先执行 后判断,这个则没问题
例如 考虑只有4张牌的情况
第一位玩家的牌是 1 1
第二位玩家的牌是2 3
应该结果为 第一位玩家胜,他的牌是 1 2 1
桌上的牌 3
但是该程序输出结果是
第一位玩家胜,他的牌是 1 2
卓上的牌 1 3
显然有个1没有收走
作者:
yemeishenme
时间:
2015-9-5 15:18
我也看到这个问题了,因为我用stl的数据结写了一遍.发现结果不一样.
代码和题目 要求"可将两张相同的牌及其中间所夹的牌全部取走" 不一样.
作者:
weigonghuang
时间:
2016-2-26 08:52
你理解的是对的,书上代码是错误的
作者:
__Berial___
时间:
2016-3-3 21:36
我用java算了一下,最后小哼输了
作者:
Soulmate
时间:
2017-2-14 16:44
//小哼赢牌了!
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不太靠谱吧
作者:
YANYANYEAH
时间:
2017-7-15 17:00
王萍萍 发表于 2015-3-4 13:16
**** 作者被禁止或删除 内容自动屏蔽 ****
do while 与while 的区别应该只是第一次做不做判断,后面还是会继续先判断后执行的吧
作者:
litianhua
时间:
2017-11-18 18:55
我也有这个疑问,找扑克模拟了一下,按照文字描述的话,两张相同的牌及其之间的牌都取走的话,应该是小哈赢,如果按照程序里写的那种做法的话,留下了那张s.data[s.top]==t的牌,就是最后的结果了,
作者:
孤独の一枚の葉
时间:
2019-10-26 16:28
#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; } 运行结果:
欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/)
Powered by Discuz! X3.2