2016-12-18 8 views
0

私はC++でチェスゲームを終わらせるという私の使命をはるかに超えています。しかし、私はいくつかの小さな問題にぶつかってきました。チェス検証入力を移動したい

SITUATION:

マイPAWN、KINGは、ナイトムーブの検証は完璧に動作します。しかし; ピース(白いROOKなど)を移動するときは、ほとんどのルールに従います。たとえば、垂直または水平方向にのみ移動し、別の白い部分を渡しません。白い部分を置き換えずに、最後に黒い(反対の)部分を置き換えます。

問題は別の黒いピースを通過させるときに、それを通過したピースを置き換えるために渡すことができるということです。 x = 2、y = 6、x = 2、y = 4の黒い部分、x = 2、y = 3の黒い部分があるとしましょう。白い部分はx = 2、y = 3に移動することが許されますが、これは許されません。これを修正する方法についてのいくつかの入力を取得したいです。現在のコードは以下です。

bool Rook:: canMove(int startx, int starty, int endx, int endy) 
{ 
    int i; 
    if(board[endx][endy] !=NULL && board[endx][endy]->color==color) 
     return false; 
    if (startx == ends) //Collision Detection... 
    { 
     // Horizontal move 
     if (starty < endy) 
     { 
      // Move down 
      for (i = starty + 1; i <= endy; ++i) 
       if (board[startx][i] != NULL && board[startx][i]->color==color) 
        return false; 

     } 
     else 
     { 
      // Move up 
      for (i = starty - 1; i >= endy; --i) 
       if (board[startx][i] != NULL && board[startx][i]->color==color) //cant allow passing of non color piece 
        return false; 
     } 
    } 
    else if (starty == endy) 
    { 
     // Vertical move 
     if (startx < endx) 
     { 
      // Move right 
      for (i = startx + 1; i <= endx; ++i) 
       if (board[i][starty] != NULL && board[i][starty]->color==color) 
        return false; 
     } 
     else 
     { 
      // Move left 
      for (i = startx - 1; i >= endx; --i) 
       if (board[i][starty] != NULL && board[i][starty]->color==color) 
        return false; 
     } 
    } 
    else 
    { 
     // Not a valid rook move (neither horizontal nor vertical) 
     return false; 
    } 

    return true; 
} 
+1

デバッガ。デバッガを使用して各ステートメントを実行し、変数内の値を識別します。 –

+0

これをデバッグする方法がわからないので、私の問題はそのような瞬間を許さない制限を考えることができないと思う。 – CodyThomas

+0

このような問題を解決する適切なツールはデバッガである。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

答えて

0

あなたの関数は、クラス内の多くのメンバー変数を参照しています。終了、色、ボード、それは良いではない、とユニットレベルでテストする機能をハードにする あなたはその機能をスタンドアロンでテストすることはできますか?いいえ、できません。

機能が(2,3)および(2,4)への移動を許可している場合は、ループが壊れていないように見えます() (2,4)〜(2,3)

また、配列を使用しているだけで、ボードをインデックス化するためのintsはあまり良くありません。 ボードを簡単に繰り返してインデックスを付けることができるように、より高いレベルのボードクラスとおそらく座標クラスが必要です。