0

だから私は戦争と呼ばれるカードゲームを作っています.ルールは次のとおりです:

  1. プレイヤー 1 とプレイヤー 2 は、それぞれ q1 と q2 と呼ばれるカードの列を作ります。どちらのキューも空ではありません。プレイヤーは空のバトル スタック s1 と s2 も持っています。
  2. 各プレイヤーは自分のキューの前からカードを 1 枚取り除き、スタックの一番上に置きます。
  3. カードの額面が同じ場合、戦争が発生します。
  4. 各プレイヤーは追加で 3 枚のカードをキューから自分のスタックに移動し、一番上のカードの額面をもう一度確認します。これは数回発生する可能性があります。再び 3 へ。
  5. カードの値が等しくない場合、バトルは終了し、a を決定できます。

私が書かなければならない関数は start_battle.cと呼ばれ、私が思いついたロジックは次のとおりqueue_frontです。関数は既に記述されています。したがって、私の擬似コードは次のとおりです。queue_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 に答える