2010-11-26 3 views
1

チェスのビショップで有効な移動が行われているかどうかを効率的かつきれいに判断する方法を考えようとしています。チェスのビショップのための規則の実装

片がSRCX、DSTXにsrcY、DSTY

これは私のアイデアの1の一部であるから移動されます

if(srcX < dstX && srcY < dstY) { 
     // Moving towards the top right of the board 
         // Determine the decrease in X coordinate 
      int deltaX = dstX-srcX; 

      // If the move is valid, the Y coordinate will have decreased by the same number as X 
      int validY = dstY-deltaX; 

      if(validY == srcY) { 
       validMove = true; 
      } 

    } 

ためにそれをやって、少し長い息切れになるだろうこれまでのコーナー..誰もより良い方法を考えることができますか?

答えて

6

1)有効な宛先ですか? 2)障害物はありますか?

最初は簡単に計算できます。ビショップは対角線を移動できるだけなので、deltaXとdeltaYは等しくなければなりません。

ので、論理的に無効な移動を除外if(abs(srcX-dstX) == abs(srcY-dstY))

次に、障害物をチェックするために行ったように、その間の位置を反復することは簡単です。

1

それは、xとyの動きが同じであることshoudl対角線、そう...

return Math.abs(srcx - dstx) == Math.abs(srcy - dsty); 
+0

'srcx-dstx'と' srcy-dsty'の絶対値を比較してはいけませんか? – Maxpm

+0

すべては座標系に依存しますが、はい:P – Andrew

+0

座標系には全く依存しません。ベクトルのx成分とy成分の大きさを比較しています。 – aaronfarr

1

ならあれば移動が有効である:私は2つのステップにそれを壊す

 Destx-Desty = SourceX - SourceY  OR 

16 - DestX- DestY = SourceX - SourceY 
関連する問題