/* $Id$ Copyright (C) 2006-2007 by David Cotton This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package fr.free.jchecs.core; import static fr.free.jchecs.core.PieceType.KING; /** * Squelette de l'implémentation d'une classe représentant un état de la partie permettant de * générer des mouvements. * * @author David Cotton */ @SuppressWarnings("serial") abstract class AbstractMoveGenerator extends AbstractBoard implements MoveGenerator { /** Position du roi noir. */ private Square _blackKingSquare; /** Drapeau indiquant si le roi noir à roqué. */ private boolean _blackCastled; /** Position du roi blanc. */ private Square _whiteKingSquare; /** Drapeau indiquant si le roi blanc à roqué. */ private boolean _whiteCastled; /** * Crée une nouvelle instance. */ protected AbstractMoveGenerator() { // Rien de spécifique... } /** * Crée une nouvelle instance, initialisée à partir de l'état reçu. * * @param pEtat Instance initiale. */ protected AbstractMoveGenerator(final Board pEtat) { super(pEtat); for (final Square s : Square.values()) { final Piece p = pEtat.getPieceAt(s); if ((p != null) && (p.getType() == KING)) { setKingSquare(p.isWhite(), s); } } } /** * Crée une nouvelle instance, copiée à partir de l'instance reçue. * * @param pEtat Instance à copier. */ protected AbstractMoveGenerator(final AbstractMoveGenerator pEtat) { super(pEtat); _blackKingSquare = pEtat._blackKingSquare; _blackCastled = pEtat._blackCastled; _whiteKingSquare = pEtat._whiteKingSquare; _whiteCastled = pEtat._whiteCastled; } /** * Renvoi la case contenant le roi d'une couleur. * * @param pCouleur Mis à "true" si l'on recherche le roi blanc, à "false" sinon. * @return Case contenant le roi. */ public Square getKingSquare(final boolean pCouleur) { if (pCouleur) { assert _whiteKingSquare != null; return _whiteKingSquare; } assert _blackKingSquare != null; return _blackKingSquare; } /** * Indique si le roi d'une couleur a roqué. * * @param pBlanc Positionné à "true" pour obtenir l'état des blancs. * @return A "vrai" si le roi correspondant à roqué. */ public final boolean isCastled(final boolean pBlanc) { if (pBlanc) { return _whiteCastled; } return _blackCastled; } /** * Alimente l'indicateur de roi ayant roqué pour une couleur. * * @param pBlanc Positionné à "true" pour alimenter l'état des blancs. * @param pEtat Etat de l'indicateur de roque effectué pour la couleur. */ protected final void setCastled(final boolean pBlanc, final boolean pEtat) { if (pBlanc) { _whiteCastled = pEtat; } else { _blackCastled = pEtat; } } /** * Alimente la case contenant le roi d'une couleur. * * @param pCouleur Mis à "true" si l'on alimente le roi blanc, à "false" sinon. * @param pCase Case contenant le roi. */ protected final void setKingSquare(final boolean pCouleur, final Square pCase) { assert pCase != null; if (pCouleur) { _whiteKingSquare = pCase; } else { _blackKingSquare = pCase; } } }