2017-02-03 7 views
1

誰かが交換を手伝ってくれますか?私は論理的な誤りがあると思う。ソースのピースとデスティネーションが正しいことを知っているので、私のif文で何かが起きています。ゲームのルール:ゲームは、1つの円 'o'を除くすべての '+'でいっぱいのピラミッド構造から始まり、ペグを隣接する円に(2つの点を斜めに)動かすことができます。円で置き換えることもできます。あなたは2つのスポットを斜めに動かすことができ、中央に飛び出したピースは元の位置だけでなく円で囲まれますが、あなたが移動しているピースはその円を '+'で置き換えます。視覚的なイメージは下にあります。さらに、変数は文字に対応しています。例:paはスポットA、pbはスポットBなどです。ペグジャンプパズルを交換する際にロジックエラーが発生する

最初の移動はDからAです。2番目の移動はKからDです。正しく出力されません。 Bが最初の移動からスキップされ、Gがこのターンをスキップされているため、スポットK、G、およびBは空でなければなりません。しかし、ここではちょうど '+'があったとしてもAを空にしています。今、Aはゲームの最初の動きから更新されましたが、今度はサークルに戻ります。 、または「PA」は、次のステートメントから更新されてきたはずです。https://www.dropbox.com/s/puab7va8vosftdd/Source.c?dl=0

void moveHandler(char source, char destination, char *pa, char *pb, char *pc, char *pd, char *pe, char *pf, 
       char *pg, char *ph, char *pi, char *pj, char *pk, char *pl, char *pm, char *pn, char *po) { 
        char temp; 
        char middle; 

        if ((source || destination == 'D') && (destination || source == 'A')) { 
         temp = *pa; 
         *pa = *pd; 
         *pd = temp; 
        } 
        else if ((source || destination == 'K') && (destination || source == 'D')) { 
         temp = *pk; 
         *pk = *pd; 
         *pd = temp; 
        } 



        middle = (char) ((source + destination)/2); 

        switch(middle) { 
        case 66: 
          *pb = 'o'; 
          break; 
        case 71: 
          *pg = 'o'; 
          break; 
        default: 
         break; 

        } 
} 

出力画像:https://snag.gy/yh2c1M.jpg

+0

'(ソース||先==「D」)は ''((ソース=に変更する必要があります= 'D')||(destinatio n == 'D'))? (あなたがこの論理的なテストを適用しているすべての場所で) – ryyker

+0

ああ。私はそれを試してみましょう。ありがとう –

+0

ソースまたはデスティネーションがdで、ソースまたはデスティネーションがaの場合は、実際に実行したいと思います。 –

答えて

2

私はあなたの論理比較を信じる

ここでは、コードへのリンクです/テストを修正する必要があります。比較対象の値に論理演算子&&||をそれぞれ適用する必要があります。たとえば、書かれている通り、sourcedestinationにORされており、その結果はchar 'D'と等しいかどうかがテストされています。私はあなたが意図したものが以下に示されていると信じています。

変更:

if ((source || destination == 'D') && (destination || source == 'A')) { 
         temp = *pa; 
         *pa = *pd; 
         *pd = temp; 
        } 
        else if ((source || destination == 'K') && (destination || source == 'D')) { 
         temp = *pk; 
         *pk = *pd; 
         *pd = temp; 
        } 

へ:(EDIT - 、最初の文を修正AとDを置き換え)

if (((source =='D') || (destination == 'D')) && ((source =='A') || (destination == 'A'))) { 
                        ^^^ 
         temp = *pa; 
         *pa = *pd; 
         *pd = temp; 
        } 
        else if (((source == 'K') || (destination == 'K')) && ((destination == 'D') || (source == 'D'))) { 
         temp = *pk; 
         *pk = *pd; 
         *pd = temp; 
        } 

そして、これはあなたがを意図何かもしれないが、それはかもしれません問題を解決するために必要なものではない。最初のif(...)ステートメントでは、AまたはDdestinationまたはsourceであるかどうかにかかわらず、データはAからDにコピーされます。その形式では、コードの実際の意図は明確ではなく、おそらく必要なことはしません。

意図を明確にする構文を作成します。 (以下の擬似コードの提案は、あなたのオリジナルの構文のように簡潔ではありませんが

enter image description here

は例えば、あなたのコードスニペットでは、あなたがはっきりと3つの可能なソースと3つの可能な宛先を確認していることを考えます多くの場合、所望の機能)は、より明確であり、明確な意図を示しており、全ての可能なソース/宛先トランザクションを覆う:

if( (source == ‘A’)&&(destination == ‘D’)){//copy A to D} 
else if((source == ‘A’)&&(destination == ‘K’)){//copy A to K} 
else if((source == ‘D’)&&(destination == ‘A’)){//copy D to A} 
else if((source == ‘D’)&&(destination == ‘K’)){//copy D to K} 
else if((source == ‘K’)&&(destination == ‘A’)){//copy K to A} 
else if((source == ‘K’)&&(destination == ‘D’)){//copy K to D} 
+0

if(sourceがDまたはsourceがA)で、destinationがDまたはif(sourceがKで、(destinationがKまたはdestinationがD))あなたが欲しいもの? – user3629249

関連する問題