00001 #ifndef CHESSRULES_HPP
00002 #define CHESSRULES_HPP
00003
00004 #include "Rules2D.hpp"
00005
00006 #include "Game/Boards/Board2D.hpp"
00007
00008
00009
00010 class Piece;
00011
00012 class ChessRules : public Rules<ChessBoard>, public Rules2D
00013 {
00014 public:
00015
00016
00017 static const int PT_PAWN = 1;
00018 static const int PT_ROOK = 2;
00019 static const int PT_KNIGHT = 3;
00020 static const int PT_BISHOP = 4;
00021 static const int PT_QUEEN = 5;
00022 static const int PT_KING = 6;
00024 static const int PC_WHITE = 0;
00025 static const int PC_BLACK = 1;
00027 private:
00028
00029 float m_nbTurnsPat;
00030
00031 bool checkPawnMove(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00032 bool checkRookMove(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00033 bool checkKnightMove(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00034 bool checkBishopMove(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00035 bool checkQueenMove(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00036 bool checkKingMove(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00037
00038
00039 bool checkCastlingMove(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00040
00041 bool checkMove(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00042 bool checkCheck(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00043
00044 bool isCheck(const ChessBoard& cb, const std::vector<std::pair<ChessBoard::Coords, Piece> >& pieces, const ChessBoard::Coords& kingCoords, const int color)const;
00045
00046
00047 const ChessBoard::Coords& getKingCoords(const std::vector<std::pair<ChessBoard::Coords, Piece> >& pieces, int color)const;
00048
00049 public:
00050 static const unsigned int NB_PLAYERS = 2;
00051
00052 void init(ChessBoard& cb);
00053 bool check(const ChessBoard& cb, Move<ChessBoard::Coords>& move)const;
00054
00055 bool isCheck(const ChessBoard& cb, const int color)const;
00056 bool checkVictory(const ChessBoard& cb, const int color)const;
00057
00058 bool checkDraw(const History<Move<ChessBoard::Coords> >& history)const;
00059 void move(const ChessBoard& cb, const Move<ChessBoard::Coords>& move);
00060 };
00061
00072 #endif