Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1.     namespace Chess {
  2. namespace Elements {
  3. class Board;
  4.  
  5. template <class>
  6. struct Piece;
  7.  
  8. class King_impl;
  9. class Queen_impl;
  10. class Rook_impl;
  11. class Bishop_impl;
  12. class Knight_impl;
  13. class Pawn_impl;
  14.  
  15. using King = Piece<King_impl>;
  16. using Queen = Piece<Queen_impl>;
  17. using Rook = Piece<Rook_impl>;
  18. using Bishop = Piece<Bishop_impl>;
  19. using Knight = Piece<Knight_impl>;
  20. using Pawn = Piece<Pawn_impl>;
  21.  
  22. using Any_piece = boost::variant<King,
  23.                                  Queen,
  24.                                  Rook,
  25.                                  Bishop,
  26.                                  Knight,
  27.                                  Pawn>;
  28.                                  
  29. enum class Team : bool { black, white };
  30.  
  31. struct Piece_position {
  32.     Sdl::Point value{};
  33.     bool changed{false};
  34. };
  35.  
  36. template <class Piece_impl>
  37. struct Piece {
  38.     Piece_impl impl{};
  39.     Team team{};
  40.     Piece_position position{};
  41. };
  42.  
  43. class King_impl {
  44. public:
  45.     bool can_jump(Sdl::Point, const Board&) const noexcept;
  46.     std::string name() const;
  47. };
  48.  
  49. class Queen_impl {
  50. public:
  51.     bool can_jump(Sdl::Point, const Board&) const noexcept;
  52.     std::string name() const;
  53. };
  54.  
  55. class Rook_impl {
  56. public:
  57.     bool can_jump(Sdl::Point, const Board&) const noexcept;
  58.     std::string name() const;
  59. };
  60.  
  61. class Bishop_impl {
  62. public:
  63.     bool can_jump(Sdl::Point, const Board&) const noexcept;
  64.     std::string name() const;
  65. };
  66.  
  67. class Knight_impl {
  68. public:
  69.     bool can_jump(Sdl::Point, const Board&) const noexcept;
  70.     std::string name() const;
  71. };
  72.  
  73. class Pawn_impl {
  74. public:
  75.     bool can_jump(Sdl::Point, const Board&) const noexcept;
  76.     std::string name() const;
  77. };
  78.  
  79. // TEST
  80. // *****************************
  81. struct SIZE_TEST1 : King {};
  82. struct SIZE_TEST2 : Any_piece {};
  83. // *****************************
  84.  
  85. template <class Piece_impl>
  86. bool can_jump(
  87.     Piece_impl pi,
  88.     Sdl::Point to,
  89.     const Board& board) noexcept {
  90.     return pi.can_jump(pi, to, board);
  91. }
  92.  
  93. Team get_team(Any_piece) noexcept;
  94. Piece_position get_position(Any_piece) noexcept;
  95. bool can_jump(Any_piece ap, Sdl::Point to, const Board& board) noexcept;
  96. std::string name(Any_piece);
  97.  
  98. Piece_position position(Any_piece ap) noexcept {
  99.     return boost::apply_visitor(
  100.         [](auto piece) noexcept {
  101.             return piece.position;
  102.         }, ap
  103.     );
  104. }
  105.  
  106. bool can_jump(Any_piece ap, Sdl::Point to, const Board& board) noexcept {
  107.     return boost::apply_visitor(
  108.         [to, &board](auto piece) noexcept {
  109.             return piece.impl.can_jump(to, board);
  110.         }, ap
  111.     );
  112. }
  113.  
  114. std::string name(Any_piece ap) {
  115.     return boost::apply_visitor(
  116.         [](auto piece) noexcept {
  117.             return piece.impl.name();
  118.         }, ap
  119.     );
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement