2010-11-26 7 views
1

J'essaie de trouver un moyen de déterminer efficacement et proprement si un mouvement valide est effectué avec un évêque aux échecs.Mettre en place des règles pour un évêque aux échecs

La pièce sera déplacé de SRCX, srcY à dstX, dstY

Cela fait partie d'une de mes idées:

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; 
      } 

    } 

mais ça va être un peu longue haleine, en faisant que pour jamais coin .. Quelqu'un peut-il penser à une façon plus agréable?

Répondre

6

Je le casser en deux étapes .

1) Est-ce une destination valide? 2) Y a-t-il des obstacles?

Le premier est facile à calculer. Puisqu'un évêque ne peut déplacer que des diagonales, les deltaX et deltaY doivent être égaux.

Ainsi, if(abs(srcX-dstX) == abs(srcY-dstY))

Cela exclut logiquement se déplace invalides.

Ensuite, il est très simple de parcourir les positions intermédiaires, comme vous l'avez fait pour vérifier les obstructions.

1

Si c'est une diagonale x et y déplacer shoudl les mêmes, donc ...

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

Ne devriez-vous pas comparer la valeur absolue de 'srcx-dstx' et' srcy-dsty'? – Maxpm

+0

Tout dépend du système de coordonnées, mais oui: P – Andrew

+0

Il ne dépend pas du tout du système de coordonnées ... Vous comparez les grandeurs des composantes x et y d'un vecteur. – aaronfarr

1

Le mouvement est valide si:

 Destx-Desty = SourceX - SourceY  OR 

16 - DestX- DestY = SourceX - SourceY 
Questions connexes