tartan  1.2.1.0
board.hpp
1 #ifndef _TARTAN_HPP_
2 #define _TARTAN_HPP_
3 
4 #include <array>
5 #include <forward_list>
6 #include <list>
7 #include <ostream>
8 #include <typeindex>
9 #include <functional>
10 #include <initializer_list>
11 
13 namespace tt {
14 
15 class Board;
16 
24 class Piece {
25 public:
31  enum class Color {
32  Black = 0, White = 1,
33  };
37  class Position {
38  public:
46  enum class Mode {
47  Normal = 1,
48  Reverse = -1,
49  };
50  private:
51  short p_x = 1;
52  short p_y = 1;
53  Mode p_mode = Mode::Normal;
54  public:
55  Position() = default;
62  Position(int x, int y);
69  Position(char l, int d);
101  Position(const std::string& str);
105  Position(const char* str) : Position(std::string(str)) {};
106  public:
112  Position(const Position&);
118  Position& operator=(const Position&);
119  public:
124  int x() const { return p_x; };
129  int y() const { return p_y; };
136  char letter() const { return p_x + 'a' - 1; };
143  int digit() const { return p_y; };
151  int setX(int x);
159  int setY(int y);
166  char setLetter(char x) { return setX(x-'a'+1) + 'a'-1; };
172  int setDigit(short y) { return setY(y); };
192  Position offset(int dx, int dy) const;
205  Position offset(char dc, int dd) const;
215  bool atLeft() const;
225  bool atRight() const;
235  bool atTop() const;
245  bool atBottom() const;
252  Mode mode() const { return p_mode; };
263  Mode setMode (Mode m);
265  public:
270  std::string str() const;
277  Position operator+(const Position&) const;
284  Position operator-(const Position&) const;
288  Position operator+=(const Position&);
292  Position operator-=(const Position&);
296  Position operator()(int dx, int dy) const;
300  Position operator()(char dc, int dd) const;
307  friend bool operator==(const Position&, const Position&);
316  friend std::ostream& operator<<(
317  std::ostream&, const Position&);
318  };
326  class Turn {
327  public:
338  Turn(const Piece* tpiece,
339  const Position& to,
340  const Piece* cap = nullptr,
341  bool possible = true);
348  Position to() const { return t_to; };
354  Position from() const { return t_from; };
360  const Piece* piece() const { return t_piece; };
364  Piece* piece() { return t_piece; };
371  const Piece* capture() const { return t_capture; };
375  Piece* capture() { return t_capture; };
381  bool possible() const { return t_possible; };
388  bool setPossible(bool c) { return !(t_possible = c); };
399  virtual std::string str() const;
417  virtual void apply(int mode = 0);
425  virtual void undo();
437  virtual bool isEqual(const Turn& rhs) const;
446  friend bool operator==(const Turn& lhs, const Turn& rhs);
455  friend bool operator!=(const Turn&, const Turn&);
465  friend std::ostream& operator<<(std::ostream& os, const Turn& t);
472  virtual auto clone() const -> std::decay<decltype(*this)>::type*;
473  virtual ~Turn() = default;
474  protected:
485  };
490  class TurnMap : public std::list<Turn*> {
491  public:
494  TurnMap(const TurnMap&);
496  TurnMap(TurnMap&&);
498  TurnMap& operator=(const TurnMap& other);
500  TurnMap& operator=(TurnMap&& other);
507  bool possible() const;
508  ~TurnMap();
516  friend bool operator==(const TurnMap& lhs, const TurnMap& rhs);
524  friend bool operator!=(const TurnMap& lhs, const TurnMap& rhs);
525  };
526 protected:
543  Board* p_board = nullptr;
556 public:
562  Color color() const { return p_color; };
570  Color setColor(Color col);
577  const Position& position() const { return p_position; };
581  Position& position() { return p_position; };
588  Position setPosition(const Position&);
599  virtual Position move(const Position& to);
615  virtual TurnMap moveMap(int mode = 0) const = 0;
621  const Board* board() const { return p_board; };
625  Board* board() { return p_board; };
633  Board* setBoard(Board* b);
640  std::size_t movesMade() const { return p_movesMade; }
648  std::size_t turnIndex() const { return p_turnIndex; }
649 public:
661  static TurnMap diagonalMoves(const Piece* p);
666  static TurnMap straightMoves(const Piece* p);
667 public:
675  Piece(const Position& pos = {1,1}, Color col = Color::White);
676  virtual ~Piece() = default;
677 };
678 
692 class Board : private BoardT {
693  friend class Piece::Turn;
694 public:
709 public:
711  Board();
717  Board(PieceSetT& set);
718 
720  Board(Board&&) = default;
722  Board& operator=(Board&&) = default;
723  Board(const Board&) = delete;
724  Board& operator=(const Board&) = delete;
725 public:
732  return b_currentTurnColor;
733  };
741  virtual Piece::Color setCurrentTurn(Piece::Color col);
756  virtual Piece::TurnMap possibleMoves(const Piece* p) const;
767  Piece::TurnMap possibleMoves(const Piece::Position& pos) const;
780  virtual const Piece::Turn* makeTurn(const Piece::Position& from,
781  const Piece::Position& to) = 0;
782 protected:
793  virtual Piece* placePiece(Piece* p);
815  Piece::TurnMap produceTurn(const Piece::Position& from,
816  const Piece::Position& to, Piece::Turn** turn);
827  virtual const Piece::Turn* applyTurn(Piece::Turn* turn);
828 public:
833  const BoardT& board() const { return static_cast<const BoardT&>(*this); };
837  BoardT& board() { return static_cast<BoardT&>(*this); };
844  HistoryT& history() { return b_history; };
848  const HistoryT& history() const { return b_history; };
855  std::size_t movesMade() const { return b_history.size(); }
866  std::size_t turnIndex() const { return b_turnIndex; };
867 
879  virtual Piece* canInsert(Piece* p) const;
893  virtual Piece* insertPiece(Piece* p);
900  virtual void clear();
916 
921  void fill();
928  void fill(PieceSetT& set);
939  void fill(const std::string& str);
952  template<class Iterator>
953  void fill(Iterator begin, Iterator end);
962  void refill() { clear(); fill(); };
964 
972  virtual PieceSetT defaultPieceSet() const = 0;
973 
981  virtual bool isEqual(const Board& other) const = 0;
988  friend bool operator==(const Board& lhs, const Board& rhs);
995  friend bool operator!=(const Board&, const Board&);
1004  Piece*& operator[](const Piece::Position& pos);
1008  const Piece* operator[](const Piece::Position& pos) const;
1014  Piece*& at(const Piece::Position& pos);
1018  const Piece* at(const Piece::Position& pos) const;
1019  using BoardT::iterator;
1020  using BoardT::const_iterator;
1021  using BoardT::begin;
1022  using BoardT::end;
1029  void setPieceGetter(PieceGetterT g) { b_pieceGetter = g; };
1036  PieceGetterT& pieceGetter() { return b_pieceGetter; };
1040  const PieceGetterT& pieceGetter() const { return b_pieceGetter; };
1054  PieceTypesRetT getPieceType(PieceTypesArgT possible);
1063  virtual std::string str() const = 0;
1074  friend std::ostream& operator<<(std::ostream& os, const Board& b);
1075  ~Board();
1076 public:
1087  PieceSetT set(const std::string& str) const;
1097  template<class Iterator>
1098  PieceSetT set(Iterator begin, Iterator end) const;
1114  virtual Piece* piece(const std::string& spec) const = 0;
1115 private:
1116  void fillBoardWithNullptrs();
1117 protected:
1122  Piece::Color b_currentTurnColor = Piece::Color::White;
1158  std::size_t b_turnIndex = 0;
1159 };
1160 
1161 }
1162 
1163 #endif // !_TARTAN_HPP_
T begin(T... args)
8x8 game board
Definition: board.hpp:692
const BoardT & board() const
Internal board data structure.
Definition: board.hpp:833
void setPieceGetter(PieceGetterT g)
Set the Piece getter functor.
Definition: board.hpp:1029
BoardT & board()
Internal board data structure.
Definition: board.hpp:837
virtual std::string str() const =0
String representation of Board.
virtual PieceSetT defaultPieceSet() const =0
Default piece set for the Board.
const HistoryT & history() const
Turns history.
Definition: board.hpp:848
Piece::Color currentTurn() const
Current turn color.
Definition: board.hpp:731
HistoryT b_history
Board history of applied Turn objects.
Definition: board.hpp:1139
PieceGetterT & pieceGetter()
Get current piece getter functor.
Definition: board.hpp:1036
virtual const Piece::Turn * makeTurn(const Piece::Position &from, const Piece::Position &to)=0
Make the turn.
PieceGetterT b_pieceGetter
Piece getter variable.
Definition: board.hpp:1150
Board(Board &&)=default
Move constructor.
Board & operator=(Board &&)=default
Move assignment operator.
std::size_t turnIndex() const
Turn index.
Definition: board.hpp:866
HistoryT & history()
Turns history.
Definition: board.hpp:844
virtual bool isEqual(const Board &other) const =0
Compare 2 Board objects.
std::size_t movesMade() const
Total count of moves made on Board.
Definition: board.hpp:855
CapturedT b_capturedPieces
List of captured pieces.
Definition: board.hpp:1130
virtual Piece * piece(const std::string &spec) const =0
Convert std::string Piece spec to actual Piece object pointer.
const PieceGetterT & pieceGetter() const
Set the Piece getter functor.
Definition: board.hpp:1040
void refill()
Clear and fill Board with default piece set.
Definition: board.hpp:962
Piece position at the Board.
Definition: board.hpp:37
char setLetter(char x)
Set x coordinate with string representation.
Definition: board.hpp:166
std::string str() const
String position representation.
Definition: position.cpp:115
Position()=default
Create Position object at a1.
Position operator-(const Position &) const
Substraction operator.
Definition: position.cpp:132
Mode mode() const
Current mode.
Definition: board.hpp:252
bool atLeft() const
Check if the position are at left border.
Definition: position.cpp:76
bool atRight() const
Check if the position are at right border.
Definition: position.cpp:83
Position offset(int dx, int dy) const
Offset current position.
Definition: position.cpp:65
Position(const char *str)
Creates Position object at str position.
Definition: board.hpp:105
Position operator-=(const Position &)
cosnt
Definition: position.cpp:140
int x() const
x coordinate
Definition: board.hpp:124
int setX(int x)
Set x coordinate.
Definition: position.cpp:39
friend std::ostream & operator<<(std::ostream &, const Position &)
std::ostream output operator
Definition: position.cpp:156
Position operator()(int dx, int dy) const
Offset current position.
Definition: position.cpp:144
int y() const
y coordinate
Definition: board.hpp:129
friend bool operator==(const Position &, const Position &)
Comparison operator.
Definition: position.cpp:152
Position & operator=(const Position &)
Copy assignment operator.
Definition: position.cpp:122
Mode
Boolean functions operation mode.
Definition: board.hpp:46
@ Reverse
Place origin at the h8.
@ Normal
Place origin at the a1.
int setDigit(short y)
Set y coordinate.
Definition: board.hpp:172
bool atBottom() const
Check if the position are at bottom border.
Definition: position.cpp:97
int digit() const
Digit representation of y coordinate.
Definition: board.hpp:143
int setY(int y)
Set y coordinate.
Definition: position.cpp:52
Mode setMode(Mode m)
Set offset mode.
Definition: position.cpp:104
Position operator+(const Position &) const
Addition operator.
Definition: position.cpp:128
char letter() const
Letter representation of x coordinate.
Definition: board.hpp:136
bool atTop() const
Check if the position are at top border.
Definition: position.cpp:90
Position operator+=(const Position &)
cosnt
Definition: position.cpp:136
List of Turn objects.
Definition: board.hpp:490
Generic Piece Turn on Board.
Definition: board.hpp:326
friend std::ostream & operator<<(std::ostream &os, const Turn &t)
std::ostream output
Definition: turn.cpp:68
friend bool operator!=(const Turn &, const Turn &)
Inverted comparison operator.
Definition: turn.cpp:63
Position from() const
Position the turn is started at.
Definition: board.hpp:354
bool possible() const
Turn viability.
Definition: board.hpp:381
virtual std::string str() const
String Turn representation.
Definition: turn.cpp:47
Position t_to
Turn piece finishing position
Definition: board.hpp:478
const Piece * piece() const
Turn Piece.
Definition: board.hpp:360
Piece * t_capture
Piece that is captured as the resul of turn.
Definition: board.hpp:482
bool t_possible
Turn viability.
Definition: board.hpp:484
Position to() const
Position where piece will end up after turn.
Definition: board.hpp:348
virtual void undo()
Undo turn.
Definition: turn.cpp:28
Piece * t_piece
Turn Piece inself
Definition: board.hpp:480
bool setPossible(bool c)
Set the turn viability.
Definition: board.hpp:388
friend bool operator==(const Turn &lhs, const Turn &rhs)
Comparison operator.
Definition: turn.cpp:59
Turn(const Piece *tpiece, const Position &to, const Piece *cap=nullptr, bool possible=true)
Construct new Turn object.
Definition: turn.cpp:8
const Piece * capture() const
Captured piece.
Definition: board.hpp:371
virtual void apply(int mode=0)
Apply turn.
Definition: turn.cpp:18
Position t_from
Turn piece starting position
Definition: board.hpp:476
virtual auto clone() const -> std::decay< decltype(*this)>::type *
Clone current Turn.
Definition: turn.cpp:72
Piece * piece()
Turn Piece.
Definition: board.hpp:364
virtual bool isEqual(const Turn &rhs) const
Compare turns.
Definition: turn.cpp:39
Piece * capture()
Captured piece.
Definition: board.hpp:375
Generic board memeber piece API.
Definition: board.hpp:24
std::size_t movesMade() const
Moves count.
Definition: board.hpp:640
const Position & position() const
Piece Position.
Definition: board.hpp:577
Board * setBoard(Board *b)
Set Piece Board.
Definition: piece.cpp:11
Position & position()
Piece Position.
Definition: board.hpp:581
Board * p_board
Piece Board.
Definition: board.hpp:543
static TurnMap straightMoves(const Piece *p)
Construct straight moves (up, down, left, right) TurnMap.
Definition: piece.cpp:79
Color p_color
Piece color.
Definition: board.hpp:531
virtual Position move(const Position &to)
Move piece.
Definition: piece.cpp:17
Position setPosition(const Position &)
Set Piece position.
Definition: piece.cpp:30
virtual TurnMap moveMap(int mode=0) const =0
Generic moves.
Color setColor(Color col)
Set the color.
Definition: piece.cpp:36
Position p_position
Piece Position.
Definition: board.hpp:536
Color color() const
Piece color.
Definition: board.hpp:562
std::size_t p_movesMade
Turns count Count of turns Piece have made.
Definition: board.hpp:548
const Board * board() const
Piece board.
Definition: board.hpp:621
Piece(const Position &pos={1, 1}, Color col=Color::White)
Construct new Piece.
Definition: piece.cpp:6
std::size_t turnIndex() const
Current turn index.
Definition: board.hpp:648
Board * board()
Piece board.
Definition: board.hpp:625
Color
Piece color.
Definition: board.hpp:31
std::size_t p_turnIndex
Last turn index.
Definition: board.hpp:555
static TurnMap diagonalMoves(const Piece *p)
Construct diagonal moves TurnMap.
Definition: piece.cpp:42
T end(T... args)
STL namespace.
Tartan library namespace.
Definition: board.cpp:10
std::ostream & operator<<(std::ostream &os, const Board &cb)
Definition: board.cpp:235
bool operator!=(const Board &lhs, const Board &rhs)
Definition: board.cpp:239
bool operator==(const Board &lhs, const Board &rhs)
Definition: board.cpp:243