0

所以我正在制作一款名为 War 的纸牌游戏,规则如下:

  1. 玩家 1 和玩家 2 分别排列称为 q1 和 q2 的牌。两个队列都不是空的。玩家也有空的战斗堆栈 s1 和 s2。
  2. 每个玩家从他们队列的前面取出一张牌并将其放在他们的堆栈顶部
  3. 如果牌面值相等,就会发生战争。
  4. 每个玩家将 3 张额外的牌从他们的队列中移到他们的堆叠中,并再次检查他们最上面的牌的面值。这可能会发生几次。再次转到 3。
  5. 如果卡片没有相等的值,则战斗已经结束并且可以确定a。

我必须编写的函数称为 start_battle.c,我想出的逻辑如下queue_frontqueue_emptystack_top函数已经编写完毕。所以我的伪代码如下:

function start_battle(q1, q2, s1, s2, logfile)

warc=0
move front card of q1 to the top of s1
move front card of q2 to the top of s2
while (top cards of s1 and s2 have equal value
       and both q1 and q2 are not empty)           
  for i=1 to 3
    if q1 is not empty
      move front card of q1 to the top of s1
    endif
  done
  for i=1 to 3
    if q2 is not empty
      move front card of q2 to the top of s2
    endif
  done
done
return warc

我的代码如下:

#include "libcardlist.h"
int start_battle(queue *q1, queue *q2, stack *s1, stack *s2, FILE *logfile){    
    int warc =0;
    int i;
    stack_push(s1, queue_front(q1));
    stack_push(s2, queue_front(q2));
    card c1 = stack_top(s1);
    card c2 = stack_top(s2);
    while (c1.face==c2.face&&  queue_empty(q1)==0 && queue_empty(q2)==0) {        
        warc++;        
        for (i=0; i<3; i++) {
            if(queue_empty(q1)==0){
                stack_push(s1, queue_front(q1));
            }
        }
        for (i=0; i<3; i++) {
            if (queue_empty(q2)==0){
              stack_push(s2, queue_front(q2));
            }    
        }       
   }
   return warc;
}

哦和

typedef struct {
  int face;         /* 2-14 */
  char suit;            /* C H S D */
} card;

当我测试它时,我的代码卡在了while循环中,有人可以帮我解决它吗?

4

1 回答 1

1

queue_pop()在您的算法中添加了适当的位置。将卡片从队列复制到堆栈(通过推送)后,您需要将其从堆中移除。实际上,这应该是游戏主要玩法的一部分,而不是介绍(它是一样的,但你最终会弄明白的),并且你需要将叠牌移动到适当的队列中一次宣布特定回合的获胜者。

无论如何,把你的流行音乐放在那里。

int start_battle(queue *q1, queue *q2, stack *s1, stack *s2, FILE *logfile){    
    int warc =0;
    int i;
    stack_push(s1, queue_front(q1));
    queue_pop(q1); // no longer in this queue.
    stack_push(s2, queue_front(q2));
    queue_pop(q2); // no longer in this queue.
    card c1 = stack_top(s1);
    card c2 = stack_top(s2);
    while (c1.face==c2.face && queue_empty(q1)==0 && queue_empty(q2)==0) {        
        warc++;        
        for (i=0; i<3; i++) {
            if(queue_empty(q1)==0){
                stack_push(s1, queue_front(q1));
                queue_pop(q1);
            }
        }
        for (i=0; i<3; i++) {
            if (queue_empty(q2)==0){
                stack_push(s2, queue_front(q2));
                queue_pop(q2);
            }    
        }       
   }

   return warc;
}
于 2012-12-05T01:01:32.080 回答