Cute Chess 0.1
board.h
1/*
2 This file is part of Cute Chess.
3 Copyright (C) 2008-2018 Cute Chess authors
4
5 Cute Chess is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 Cute Chess is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with Cute Chess. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19#ifndef BOARD_H
20#define BOARD_H
21
22#include <QString>
23#include <QVector>
24#include <QVarLengthArray>
25#include <QSharedPointer>
26#include <QDebug>
27#include <QCoreApplication>
28#include "square.h"
29#include "piece.h"
30#include "move.h"
31#include "genericmove.h"
32#include "zobrist.h"
33#include "result.h"
34class QStringList;
35
36
37namespace Chess {
38
39class BoardTransition;
40
57class LIB_EXPORT Board
58{
59 Q_DECLARE_TR_FUNCTIONS(Board)
60
61 public:
86
92
103
111 Board(Zobrist* zobrist);
113 virtual ~Board();
115 virtual Board* copy() const = 0;
116
118 virtual QString variant() const = 0;
123 virtual bool isRandomVariant() const;
130 virtual bool variantHasDrops() const;
135 virtual bool variantHasWallSquares() const;
142 virtual QList<Piece> reservePieceTypes() const;
144 virtual CoordinateSystem coordinateSystem() const;
146 virtual int width() const = 0;
148 virtual int height() const = 0;
150 virtual QString defaultFenString() const = 0;
152 quint64 key() const;
158 void initialize();
159
161 bool isValidSquare(const Square& square) const;
162
166 QStringList pieceList(Side side) const;
171 QString fenString(FenNotation notation = XFen) const;
185 bool setFenString(const QString& fen);
190 void reset();
191
196 virtual Side upperCaseSide() const;
198 Side sideToMove() const;
200 Side startingSide() const;
202 Piece pieceAt(const Square& square) const;
204 int plyCount() const;
209 int repeatCount() const;
215 virtual int reversibleMoveCount() const;
222 int reserveCount(Piece piece) const;
224 QString pieceSymbol(Piece piece) const;
228 QString pieceString(int pieceType) const;
230 QString representation(Piece piece) const;
231
240 void makeMove(const Move& move, BoardTransition* transition = nullptr);
242 void undoMove();
243
250 QString moveString(const Move& move, MoveNotation notation);
259 Move moveFromString(const QString& str);
266 Move moveFromGenericMove(const GenericMove& move) const;
273 GenericMove genericMove(const Move& move) const;
274
276 bool isLegalMove(const Move& move);
281 bool isRepetition(const Move& move);
288 virtual Result result() = 0;
298 virtual Result tablebaseResult(unsigned int* dtm = nullptr) const;
299
300 protected:
307 virtual void vInitialize() = 0;
308
323 void setPieceType(int type,
324 const QString& name,
325 const QString& symbol,
326 unsigned movement = 0,
327 const QString & gsymbol = QString());
329 bool pieceHasMovement(int pieceType, unsigned movement) const;
330
342 virtual void vMakeMove(const Move& move,
343 BoardTransition* transition) = 0;
353 virtual void vUndoMove(const Move& move) = 0;
354
356 Square chessSquare(int index) const;
358 Square chessSquare(const QString& str) const;
360 int squareIndex(const Square& square) const;
362 int squareIndex(const QString& str) const;
364 QString squareString(int index) const;
366 QString squareString(const Square& square) const;
367
372 virtual QString lanMoveString(const Move& move);
379 virtual QString sanMoveString(const Move& move) = 0;
381 virtual Move moveFromLanString(const QString& str);
383 virtual Move moveFromSanString(const QString& str) = 0;
385 virtual int maxPieceSymbolLength() const;
386
394 virtual QString vFenString(FenNotation notation) const = 0;
402 virtual bool vSetFenString(const QStringList& fen) = 0;
403
412 int pieceType = Piece::NoPiece) const;
420 void generateDropMoves(QVarLengthArray<Move>& moves, int pieceType) const;
429 int pieceType,
430 int square) const = 0;
438 void generateHoppingMoves(int sourceSquare,
439 const QVarLengthArray<int>& offsets,
440 QVarLengthArray<Move>& moves) const;
448 void generateSlidingMoves(int sourceSquare,
449 const QVarLengthArray<int>& offsets,
450 QVarLengthArray<Move>& moves) const;
456 virtual bool isLegalPosition() = 0;
468 virtual bool vIsLegalMove(const Move& move);
473 virtual int captureType(const Move& move) const;
475 void xorKey(quint64 key);
480 bool moveExists(const Move& move) const;
482 bool canMove();
487 int arraySize() const;
489 Piece pieceAt(int square) const;
496 void setSquare(int square, Piece piece);
498 const Move& lastMove() const;
508 virtual int reserveType(int pieceType) const;
510 void addToReserve(const Piece& piece, int count = 1);
512 void removeFromReserve(const Piece& piece);
513
514 private:
515 struct PieceData
516 {
517 QString name;
518 QString symbol;
519 unsigned movement;
521 };
522 struct MoveData
523 {
524 Move move;
525 quint64 key;
526 };
527 friend LIB_EXPORT QDebug operator<<(QDebug dbg, const Board* board);
528
529 bool m_initialized;
530 int m_width;
531 int m_height;
532 Side m_side;
533 Side m_startingSide;
534 QString m_startingFen;
535 int m_maxPieceSymbolLength;
536 quint64 m_key;
537 Zobrist* m_zobrist;
538 QSharedPointer<Zobrist> m_sharedZobrist;
539 QVarLengthArray<PieceData> m_pieceData;
540 QVarLengthArray<Piece> m_squares;
541 QVector<MoveData> m_moveHistory;
542 QVector<int> m_reserve[2];
543};
544
545
546extern LIB_EXPORT QDebug operator<<(QDebug dbg, const Board* board);
547
548inline int Board::arraySize() const
549{
550 return m_squares.size();
551}
552
554{
555 return m_side;
556}
557
559{
560 return m_startingSide;
561}
562
564{
565 return m_startingFen;
566}
567
568inline quint64 Board::key() const
569{
570 return m_key;
571}
572
573inline void Board::xorKey(quint64 key)
574{
575 m_key ^= key;
576}
577
578inline Piece Board::pieceAt(int square) const
579{
580 return m_squares[square];
581}
582
583inline void Board::setSquare(int square, Piece piece)
584{
585 Piece& old = m_squares[square];
586 if (old.isValid())
587 xorKey(m_zobrist->piece(old, square));
588 if (piece.isValid())
589 xorKey(m_zobrist->piece(piece, square));
590
591 old = piece;
592}
593
594inline int Board::plyCount() const
595{
596 return m_moveHistory.size();
597}
598
599inline const Move& Board::lastMove() const
600{
601 return m_moveHistory.last().move;
602}
603
604inline bool Board::pieceHasMovement(int pieceType, unsigned movement) const
605{
606 Q_ASSERT(pieceType != Piece::NoPiece);
607 Q_ASSERT(pieceType < m_pieceData.size());
608
609 return (m_pieceData[pieceType].movement & movement);
610}
611
612} // namespace Chess
613#endif // BOARD_H
Details of a board transition caused by a move.
Definition boardtransition.h:41
An internal chessboard class.
Definition board.h:58
virtual bool isLegalPosition()=0
virtual bool vIsLegalMove(const Move &move)
Definition board.cpp:823
virtual Move moveFromLanString(const QString &str)
Definition board.cpp:354
int arraySize() const
Definition board.h:548
GenericMove genericMove(const Move &move) const
Definition board.cpp:418
Side sideToMove() const
Definition board.h:553
void reset()
Definition board.cpp:680
int reserveCount(Piece piece) const
Definition board.cpp:212
void generateHoppingMoves(int sourceSquare, const QVarLengthArray< int > &offsets, QVarLengthArray< Move > &moves) const
Definition board.cpp:751
bool canMove()
Definition board.cpp:870
QString pieceSymbol(Piece piece) const
Definition board.cpp:153
quint64 key() const
Definition board.h:568
Piece pieceFromSymbol(const QString &pieceSymbol) const
Definition board.cpp:164
virtual QString lanMoveString(const Move &move)
Definition board.cpp:326
void generateSlidingMoves(int sourceSquare, const QVarLengthArray< int > &offsets, QVarLengthArray< Move > &moves) const
Definition board.cpp:767
virtual bool vSetFenString(const QStringList &fen)=0
virtual QString defaultFenString() const =0
bool setFenString(const QString &fen)
Definition board.cpp:509
Move moveFromGenericMove(const GenericMove &move) const
Definition board.cpp:410
virtual void generateMovesForPiece(QVarLengthArray< Move > &moves, int pieceType, int square) const =0
Side startingSide() const
Definition board.h:558
void makeMove(const Move &move, BoardTransition *transition=nullptr)
Definition board.cpp:685
virtual Result tablebaseResult(unsigned int *dtm=nullptr) const
Definition board.cpp:901
void generateMoves(QVarLengthArray< Move > &moves, int pieceType=Piece::NoPiece) const
Definition board.cpp:711
virtual QString sanMoveString(const Move &move)=0
virtual int width() const =0
virtual CoordinateSystem coordinateSystem() const
Definition board.cpp:95
bool isRepetition(const Move &move)
Definition board.cpp:859
virtual QList< Piece > reservePieceTypes() const
Definition board.cpp:90
QVector< Move > legalMoves()
Definition board.cpp:884
QString moveString(const Move &move, MoveNotation notation)
Definition board.cpp:347
void xorKey(quint64 key)
Definition board.h:573
Piece pieceAt(const Square &square) const
Definition board.cpp:105
virtual bool isRandomVariant() const
Definition board.cpp:75
virtual Side upperCaseSide() const
Definition board.cpp:100
virtual Move moveFromSanString(const QString &str)=0
QString squareString(int index) const
Definition board.cpp:269
QString pieceString(int pieceType) const
Definition board.cpp:189
virtual Result result()=0
void initialize()
Definition board.cpp:112
virtual void vMakeMove(const Move &move, BoardTransition *transition)=0
Square chessSquare(int index) const
Definition board.cpp:244
QStringList pieceList(Side side) const
Definition board.cpp:428
int repeatCount() const
Definition board.cpp:839
Move moveFromString(const QString &str)
Definition board.cpp:398
virtual int reserveType(int pieceType) const
Definition board.cpp:207
bool pieceHasMovement(int pieceType, unsigned movement) const
Definition board.h:604
void setSquare(int square, Piece piece)
Definition board.h:583
void addToReserve(const Piece &piece, int count=1)
Definition board.cpp:220
void setPieceType(int type, const QString &name, const QString &symbol, unsigned movement=0, const QString &gsymbol=QString())
Definition board.cpp:137
int squareIndex(const Square &square) const
Definition board.cpp:252
const Move & lastMove() const
Definition board.h:599
virtual Board * copy() const =0
QString representation(Piece piece) const
Definition board.cpp:196
QString startingFenString() const
Definition board.h:563
Board(Zobrist *zobrist)
Definition board.cpp:55
virtual int reversibleMoveCount() const
Definition board.cpp:854
void undoMove()
Definition board.cpp:699
FenNotation
Definition board.h:94
@ XFen
Definition board.h:99
@ ShredderFen
Definition board.h:101
virtual QString variant() const =0
virtual void vUndoMove(const Move &move)=0
virtual void vInitialize()=0
MoveNotation
Definition board.h:88
@ StandardAlgebraic
Standard Algebraic notation (SAN).
Definition board.h:89
@ LongAlgebraic
Long Algebraic/Coordinate notation.
Definition board.h:90
virtual bool variantHasDrops() const
Definition board.cpp:80
virtual int height() const =0
void generateDropMoves(QVarLengthArray< Move > &moves, int pieceType) const
Definition board.cpp:732
QString fenString(FenNotation notation=XFen) const
Definition board.cpp:446
virtual int maxPieceSymbolLength() const
Definition board.cpp:132
bool moveExists(const Move &move) const
Definition board.cpp:788
bool isValidSquare(const Square &square) const
Definition board.cpp:261
CoordinateSystem
Definition board.h:64
@ NormalCoordinates
Definition board.h:74
@ InvertedCoordinates
Definition board.h:84
virtual int captureType(const Move &move) const
Definition board.cpp:813
bool isLegalMove(const Move &move)
Definition board.cpp:834
void removeFromReserve(const Piece &piece)
Definition board.cpp:235
int plyCount() const
Definition board.h:594
virtual QString vFenString(FenNotation notation) const =0
virtual bool variantHasWallSquares() const
Definition board.cpp:85
A chess move independent of chess variant or opening book format.
Definition genericmove.h:35
A small and efficient chessmove class.
Definition move.h:43
A chess piece.
Definition piece.h:41
bool isValid() const
Definition piece.h:122
static const int NoPiece
Definition piece.h:44
The result of a chess game.
Definition result.h:35
The side or color of a chess player.
Definition side.h:36
A generic chess square type consisting of a file and a rank.
Definition square.h:34
Unsigned 64-bit values for generating zobrist position keys.
Definition zobrist.h:37