Quantum-Chess 0.5
Chargement...
Recherche...
Aucune correspondance
Board.hpp
Aller à la documentation de ce fichier.
1#ifndef GAME_BOARD_HPP
2#define GAME_BOARD_HPP
3
4#include <vector>
5#include <array>
6#include <utility>
7#include <optional>
8#include <complex>
9#include <cstddef>
10#include <initializer_list>
11#include <functional>
12#include <CMatrix.hpp>
13#include <Piece.hpp>
14#include <TypePiece.hpp>
15#include <Color.hpp>
16#include <Coord.hpp>
17#include <forward_list>
18#include <observer_ptr.hpp>
19#include <Move.hpp>
20#include <Constexpr.hpp>
21#include <check_path.hpp>
22
23class Piece;
24
31template <std::size_t N = 8, std::size_t M = N>
32class Board final
33{
34public:
35 // Constructeur
37
38 CONSTEXPR Board(std::initializer_list<
39 std::initializer_list<
40 Piece>> const &board);
41
48 CONSTEXPR Board(std::ranges::common_range auto const &board);
49
50 // Copie
51 CONSTEXPR Board(Board const &) = default;
52 CONSTEXPR Board &operator=(Board const &) = default;
53
54 // Mouvement
55 CONSTEXPR Board(Board &&) = default;
57
58 // Destructeur
59 CONSTEXPR ~Board() = default;
60
69 CONSTEXPR Piece const &
70 operator()(std::size_t n,
71 std::size_t m) const noexcept;
72
78 CONSTEXPR static std::size_t numberLines() noexcept;
79
85 CONSTEXPR static std::size_t numberColumns() noexcept;
86
96 CONSTEXPR std::forward_list<Coord>
97 get_list_normal_move(Coord const &pos) const;
98
110 CONSTEXPR std::forward_list<Coord>
111 get_list_split_move(Coord const &pos) const;
112
124 CONSTEXPR bool
125 check_if_use_move_promote(Coord const &pos) const noexcept;
126
136 CONSTEXPR std::forward_list<Move>
137 get_list_promote(Coord const &pos) const noexcept;
138
148 template <class UnitaryFunction>
149 CONSTEXPR void
151 UnitaryFunction func,
152 std::optional<Color> color_player = std::nullopt) const noexcept;
153
160 CONSTEXPR bool move_is_legal(Move const &move) const;
161
172 CONSTEXPR void
173 move(Move const &movement, std::optional<bool> val_mes = std::nullopt);
174
182 CONSTEXPR bool winning_position(Color c) const noexcept;
183
190
194 CONSTEXPR void change_player() noexcept;
195
201 CONSTEXPR double get_proba(Coord const &pos) const noexcept;
202
203 friend class Piece;
204
205 template <std::size_t _N, std::size_t _M>
206 friend CONSTEXPR bool
208 Board<_N, _M> const &board,
209 Coord const &dpt,
210 Coord const &arv,
211 std::size_t position,
212 std::optional<Coord>);
213
214 template <std::size_t _N, std::size_t _M>
215 friend CONSTEXPR bool
217 Board<_N, _M> const &board,
218 Coord const &dpt,
219 Coord const &arv,
220 std::size_t position,
221 std::optional<Coord>);
222
223 template <std::size_t _N, std::size_t _M>
224 friend CONSTEXPR bool
226 Board<_N, _M> const &board,
227 Coord const &dpt,
228 Coord const &arv,
229 std::size_t position,
230 std::optional<Coord>);
231
242 Move const &move,
243 std::optional<bool> val_mes = std::nullopt);
244
251 CONSTEXPR double get_proba_move(Move const &move) const noexcept;
252
253private:
261 CONSTEXPR double
262 get_proba_mesure(Coord const &p) const noexcept;
263
275 Coord const &s,
276 Coord const &t,
277 std::function<bool(Board<N, M> const &,
278 Coord const &,
279 Coord const &,
280 std::size_t,
281 std::optional<Coord>)>
282 check_path) const noexcept;
283
293 Coord const &king,
294 Coord const &rook) const noexcept;
295
302 void update_case(std::size_t pos) noexcept;
313 void update_board() noexcept;
314 void update_board_classic() noexcept;
315
330 Coord const &s,
331 Coord const &t,
332 std::optional<bool> val_mes = std::nullopt);
333
346 Coord const &s,
347 Coord const &t1,
348 Coord const &t2);
349
363 Coord const &s,
364 Coord const &t1,
365 Coord const &t2);
380 CONSTEXPR void
381 move_classic_slide(Coord const &s, Coord const &t,
382 std::function<
383 bool(
384 Board<N, M> const &,
385 Coord const &,
386 Coord const &,
387 std::size_t,
388 std::optional<Coord>)>
389 check_path,
390 std::optional<bool> val_mes = std::nullopt);
403 Coord const &s,
404 Coord const &t1,
405 Coord const &t2,
406 std::function<
407 bool(
408 Board<N, M> const &,
409 Coord const &,
410 Coord const &,
411 std::size_t,
412 std::optional<Coord>)>
413 check_path);
414
428 Coord const &s1,
429 Coord const &s2,
430 Coord const &t,
431 std::function<
432 bool(
433 Board<N, M> const &,
434 Coord const &,
435 Coord const &,
436 std::size_t,
437 std::optional<Coord>)>
438 check_path);
439
458 CONSTEXPR bool
459 move_pawn_one_step(Coord const &s, Coord const &t,
460 std::optional<bool> val_mes = std::nullopt);
461
481 CONSTEXPR bool
482 move_pawn_two_step(Coord const &s, Coord const &t,
483 std::optional<bool> val_mes = std::nullopt);
499 Coord const &t,
500 std::optional<bool> val_mes = std::nullopt);
501
518 CONSTEXPR bool
519 move_enpassant(Coord const &s, Coord const &t, Coord const &ep,
520 std::optional<bool> val_mes = std::nullopt);
521
533 CONSTEXPR bool mesure(Coord const &p,
534 std::optional<bool> val_mes = std::nullopt);
535
551 CONSTEXPR bool
552 mesure_capture_slide(Coord const &s, Coord const &t,
553 std::function<bool(Board<N, M> const &,
554 Coord const &, Coord const &,
555 std::size_t,
556 std::optional<Coord>)>
557 check_path,
558 std::optional<bool> val_mes = std::nullopt);
559
568 CONSTEXPR void move_classic(Coord const &s, Coord const &t,
569 std::optional<bool> val_mes);
570
581 Coord const &t1,
582 Coord const &t2);
583
596 CONSTEXPR void move_merge(Coord const &s1,
597 Coord const &s2,
598 Coord const &t);
599
613 Coord const &s,
614 Coord const &t,
615 std::optional<bool> val_mes = std::nullopt) noexcept;
616
624 CONSTEXPR static std::size_t
625 offset(std::size_t ligne,
626 std::size_t colonne) noexcept;
627
636 CONSTEXPR static void
638 std::ranges::common_range auto const &board,
639 std::array<bool, N * M> &first_instance,
640 std::array<Piece, N * M> &piece_board) noexcept;
641
651 CONSTEXPR static void init_mailbox(std::array<int, N * M>
652 &S_mailbox,
653 std::array<int, (N + 4) * (M + 2)>
654 &L_mailbox) noexcept;
655
673 template <std::size_t Q>
674 CONSTEXPR void modify(std::array<std::pair<std::array<bool, Q>,
675 std::complex<double>>,
676 2> const &arrayQubit,
677 std::size_t position_board,
678 std::array<std::size_t, Q> const &tab_positions);
679
694 template <std::size_t Q>
695 CONSTEXPR void move_1_instance(std::array<bool, Q> const &case_modif,
696 std::size_t position,
697 CMatrix<_2POW(Q)> const &matrix,
698 std::array<std::size_t, Q> const
699 &tab_positions) noexcept;
700
710 Coord const &king,
711 Coord const &rook,
712 std::optional<bool> val_mes = std::nullopt);
713
725 Coord const &king,
726 Coord const &rook,
727 std::optional<bool> val_mes = std::nullopt);
728
740 Coord const &king,
741 Coord const &rook,
742 std::optional<bool> val_mes = std::nullopt);
743
748 std::vector<std::pair<std::array<bool, N * M>,
749 std::complex<double>>>
751
755 std::array<Piece, N * M> m_piece_board;
756
760 std::array<int, N * M> m_S_mailbox;
761
765 std::array<int, (N + 4) * (M + 2)> m_L_mailbox;
766
771
775 std::array<bool, 2> m_k_castle;
776
780 std::array<bool, 2> m_q_castle;
781
788 std::optional<Coord> m_ep;
789};
790
791#include "Board.tpp"
792#include "mesure.tpp"
793#include "get_proba_move.tpp"
794#include "move.tpp"
795
796#endif
Matrix< std::complex< double >, N > CMatrix
Objet représentant les matrices carrées complexe de dimension N.
Definition CMatrix.hpp:15
#define _2POW(n)
Réalise l'opération 2^n.
Definition CMatrix.hpp:38
Color
Représente la couleur d'un joueur.
Definition Color.hpp:8
#define CONSTEXPR
Utilisé pour utiliser ou non constexpr.
Definition Constexpr.hpp:7
CONSTEXPR void move_split_slide(Coord const &s, Coord const &t1, Coord const &t2, std::function< bool(Board< N, M > const &, Coord const &, Coord const &, std::size_t, std::optional< Coord >)> check_path)
Mouvement "split slide".
CONSTEXPR bool mesure(Coord const &p, std::optional< bool > val_mes=std::nullopt)
Mesure la présence d'une pièce.
CONSTEXPR bool move_is_legal(Move const &move) const
Test si un mouvement est réalisable.
CONSTEXPR bool check_if_use_move_promote(Coord const &pos) const noexcept
Teste si les mouvement de la piece sont si la pièce est un pion un mouvement de promotion.
CONSTEXPR Piece const & operator()(std::size_t n, std::size_t m) const noexcept
Retourne un pointeur sur la piece à l'emplacement cible.
CONSTEXPR void move_classic(Coord const &s, Coord const &t, std::optional< bool > val_mes)
Mouvement classique d'une pièce (pion exclu)
CONSTEXPR void move_1_instance(std::array< bool, Q > const &case_modif, std::size_t position, CMatrix< _2POW(Q)> const &matrix, std::array< std::size_t, Q > const &tab_positions) noexcept
Fonction qui permet d'effectuer un mouvement sur une instance du plateau.
CONSTEXPR std::forward_list< Coord > get_list_normal_move(Coord const &pos) const
Renvoie la liste dans tous les mouvements classiques légaux d'une pièce.
CONSTEXPR double get_proba_mesure(Coord const &p) const noexcept
Renvoie la probabilité que la fonction mesure renvoie true, c'est-à-dire la proba que le mouvement so...
std::optional< Coord > m_ep
Contient la case sur laquelle il est possible de faire une prise en passant qui est vide (la case occ...
Definition Board.hpp:788
CONSTEXPR ~Board()=default
static CONSTEXPR std::size_t offset(std::size_t ligne, std::size_t colonne) noexcept
Renvoie une position 1D d'une coordonnée 2D.
void update_case(std::size_t pos) noexcept
Vérifie si la case à une possibilité de contenir une pièce, et si elle n'en a pas modifie m_piece_boa...
CONSTEXPR std::forward_list< Coord > get_list_split_move(Coord const &pos) const
Renvoie la liste de toutes les cases qu'une pièce peut atteindre lors d'un mouvement split,...
CONSTEXPR void move(Move const &movement, std::optional< bool > val_mes=std::nullopt)
Réalise un mouvement d'une pièce quelque soit le type du mouvement (classic, split,...
CONSTEXPR void queen_side_castle(Coord const &king, Coord const &rook, std::optional< bool > val_mes=std::nullopt)
Mouvement du grand roque.
CONSTEXPR bool mesure_castle(Coord const &king, Coord const &rook, std::optional< bool > val_mes=std::nullopt)
Fonction qui permet de mesurer la possibilité de faire le roque.
CONSTEXPR Board()
CONSTEXPR bool winning_position(Color c) const noexcept
Test si un plateau est gagnant pour une couleur.
CONSTEXPR void move_split_jump(Coord const &s, Coord const &t1, Coord const &t2)
Mouvement "split jump".
CONSTEXPR void move_split(Coord const &s, Coord const &t1, Coord const &t2)
Mouvement split d'une pièce (pion exclu)
std::array< Piece, N *M > m_piece_board
Le plateau indiquant le type des pièces.
Definition Board.hpp:755
CONSTEXPR void move_classic_slide(Coord const &s, Coord const &t, std::function< bool(Board< N, M > const &, Coord const &, Coord const &, std::size_t, std::optional< Coord >)> check_path, std::optional< bool > val_mes=std::nullopt)
Mouvement classique d'un pièce qui "glisse" (fou, dame, tour)
CONSTEXPR Board(std::initializer_list< std::initializer_list< Piece > > const &board)
CONSTEXPR std::forward_list< Move > get_list_promote(Coord const &pos) const noexcept
Renvoie la liste de toutes les promotions.
friend CONSTEXPR bool check_path_queen_1_instance(Board< _N, _M > const &board, Coord const &dpt, Coord const &arv, std::size_t position, std::optional< Coord >)
CONSTEXPR void modify(std::array< std::pair< std::array< bool, Q >, std::complex< double > >, 2 > const &arrayQubit, std::size_t position_board, std::array< std::size_t, Q > const &tab_positions)
fonction auxiliaire qui permet de modifier un plateau à l'aide d'un array de la forme du type de reto...
void update_board_classic() noexcept
std::array< int, N *M > m_S_mailbox
La petite mailbox.
Definition Board.hpp:760
CONSTEXPR void move_promotion(Move const &move, std::optional< bool > val_mes=std::nullopt)
Fonction qui permet de faire un mouvement de pion quelconque avec une promotion.
CONSTEXPR void move_merge(Coord const &s1, Coord const &s2, Coord const &t)
Mouvement de merge de pièce (pion exclu)
static CONSTEXPR std::size_t numberLines() noexcept
Retourne le nombre de ligne du plateau.
CONSTEXPR bool move_pawn(Coord const &s, Coord const &t, std::optional< bool > val_mes=std::nullopt) noexcept
Gère tout les mouvements d'un pion.
CONSTEXPR double get_proba_mesure_castle(Coord const &king, Coord const &rook) const noexcept
Renvoie laprobabilité que la fonction mesure_castle renvoie true, c'est-à-dire la proba que le mouvem...
CONSTEXPR void all_move(UnitaryFunction func, std::optional< Color > color_player=std::nullopt) const noexcept
Applique une fonction à l'entiéreté des mouvements possible.
std::vector< std::pair< std::array< bool, N *M >, std::complex< double > > > m_board
Le tableau de toutes les instances possibles du plateau.
Definition Board.hpp:750
static CONSTEXPR void init_mailbox(std::array< int, N *M > &S_mailbox, std::array< int,(N+4) *(M+2)> &L_mailbox) noexcept
Construit les mailbox en fonction des dimenssions du plateau.
CONSTEXPR void king_side_castle(Coord const &king, Coord const &rook, std::optional< bool > val_mes=std::nullopt)
Mouvement du petit roque.
friend CONSTEXPR bool check_path_straight_1_instance(Board< _N, _M > const &board, Coord const &dpt, Coord const &arv, std::size_t position, std::optional< Coord >)
CONSTEXPR void change_player() noexcept
Change le joueur actuel et passe la main à l'autre joueur.
static CONSTEXPR void range_to_2_array(std::ranges::common_range auto const &board, std::array< bool, N *M > &first_instance, std::array< Piece, N *M > &piece_board) noexcept
Initialise un plateau à l'aide d'un container 2D.
CONSTEXPR void move_merge_jump(Coord const &s, Coord const &t1, Coord const &t2)
Mouvement de merge.
CONSTEXPR bool move_pawn_one_step(Coord const &s, Coord const &t, std::optional< bool > val_mes=std::nullopt)
Le mouvement de piond'une case fonctionne comme un mouvementde jump classique, à la différence qu'un ...
CONSTEXPR void move_merge_slide(Coord const &s1, Coord const &s2, Coord const &t, std::function< bool(Board< N, M > const &, Coord const &, Coord const &, std::size_t, std::optional< Coord >)> check_path)
Mouvement de merge.
CONSTEXPR Board(Board &&)=default
static CONSTEXPR std::size_t numberColumns() noexcept
Retourne le nombre de colonne.
std::array< bool, 2 > m_k_castle
Vrai si les noirs[0] / blancs[1] peuvent faire le petit roque.
Definition Board.hpp:775
CONSTEXPR Board & operator=(Board const &)=default
void update_board() noexcept
Fonction qui permet de mattre à jour le plateau, car ce mouvement entraine l'apparition de plusieurs ...
CONSTEXPR Color get_current_player() const noexcept
Recupère la couleur du joueur au tour de jouer.
CONSTEXPR bool mesure_capture_slide(Coord const &s, Coord const &t, std::function< bool(Board< N, M > const &, Coord const &, Coord const &, std::size_t, std::optional< Coord >)> check_path, std::optional< bool > val_mes=std::nullopt)
Fonction qui permet de faire une mesure dans le cas d'un mouvement "capture slide".
CONSTEXPR double get_proba_move(Move const &move) const noexcept
Renvoie la probabilité que le mouvement soit réalisé
CONSTEXPR Board & operator=(Board &&)=default
std::array< int,(N+4) *(M+2)> m_L_mailbox
La grande mailbox.
Definition Board.hpp:765
friend class Piece
Definition Board.hpp:203
CONSTEXPR bool move_enpassant(Coord const &s, Coord const &t, Coord const &ep, std::optional< bool > val_mes=std::nullopt)
Permet d'effectuer un mouvement de prise en passant.
CONSTEXPR double get_proba(Coord const &pos) const noexcept
Renvoie la probabilité qu'il y ait une pièce à une position.
CONSTEXPR bool capture_pawn(Coord const &s, Coord const &t, std::optional< bool > val_mes=std::nullopt)
Mouvement de capture dun pion. A la différence d'un mouvement de "capture jump", on mesure la présenc...
CONSTEXPR bool move_pawn_two_step(Coord const &s, Coord const &t, std::optional< bool > val_mes=std::nullopt)
Le mouvement de pion de deux cases fonctionne comme un mouvement de slide classique,...
CONSTEXPR double get_proba_mesure_capture_slide(Coord const &s, Coord const &t, std::function< bool(Board< N, M > const &, Coord const &, Coord const &, std::size_t, std::optional< Coord >)> check_path) const noexcept
Renvoie la probabilité que la fonction mesure_capture_slide renvoie true, c'est-à-dire la proba que l...
Color m_color_current_player
Color::WHITE si c'est aux blanc de jouer aux noirs sinon.
Definition Board.hpp:770
CONSTEXPR void move_classic_jump(Coord const &s, Coord const &t, std::optional< bool > val_mes=std::nullopt)
Mouvement classique d'une pièce qui "saute" (cavalier, roi)
CONSTEXPR Board(Board const &)=default
std::array< bool, 2 > m_q_castle
Vrai si les noirs[0] / blancs[1] peuvent faire le grand roque.
Definition Board.hpp:780
CONSTEXPR Board(std::ranges::common_range auto const &board)
Initialise le plateau à partir d'un ensemble de pièce, les pièces ne sont pas divisées initialement.
friend CONSTEXPR bool check_path_diagonal_1_instance(Board< _N, _M > const &board, Coord const &dpt, Coord const &arv, std::size_t position, std::optional< Coord >)
Class conservant le type et la couleur d'une pièce. Elle permet aussi de recuperer ses mouvement poss...
Definition Piece.hpp:21
Definition Complex_printer.hpp:9
La structure qui représente une coordonnée sur le plateau.
Definition Coord.hpp:11
Stoque tout les mouvements possibles.
Definition Move.hpp:38