堆栈卡和战争游戏

时间:2012-12-05 00:15:11

标签: c stack

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

  1. 玩家1和玩家2每个名为q1和q2的卡队列。都 队列不是空的。玩家也有空战斗堆s1 和s2。
  2. 每个玩家从队列前面移除一张牌并放入 在他们的堆栈顶部
  3. 如果牌面值相等,就会发生战争。
  4. 每位玩家将3张额外的牌从队列中移动到堆叠中 并再次检查他们顶级卡的面值。这可能发生 几次。再次转到3。
  5. 如果卡片没有相同的值,则战斗结束并且a 可以确定。
  6. 我必须编写的函数叫做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循环中,有人可以帮我修复它吗?

1 个答案:

答案 0 :(得分: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;
}