[board] Replace active player and move properties on Board with MoveCounter instance
This commit is contained in:
		
							parent
							
								
									58cbe07136
								
							
						
					
					
						commit
						cd60a453aa
					
				
					 3 changed files with 24 additions and 49 deletions
				
			
		| 
						 | 
				
			
			@ -1,7 +1,8 @@
 | 
			
		|||
// Eryn Wells <eryn@erynwells.me>
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    display::DiagramFormatter, piece_sets::PlacePieceError, Castle, EnPassant, Flags, PieceSet,
 | 
			
		||||
    display::DiagramFormatter, piece_sets::PlacePieceError, Castle, EnPassant, Flags, MoveCounter,
 | 
			
		||||
    PieceSet,
 | 
			
		||||
};
 | 
			
		||||
use chessfriend_bitboard::BitBoard;
 | 
			
		||||
use chessfriend_core::{Color, Piece, PlacedPiece, Shape, Square};
 | 
			
		||||
| 
						 | 
				
			
			@ -9,12 +10,10 @@ use std::iter::Iterator;
 | 
			
		|||
 | 
			
		||||
#[derive(Clone, Debug, Eq)]
 | 
			
		||||
pub struct Board {
 | 
			
		||||
    player_to_move: Color,
 | 
			
		||||
    flags: Flags,
 | 
			
		||||
    pieces: PieceSet,
 | 
			
		||||
    en_passant: Option<EnPassant>,
 | 
			
		||||
    half_move_counter: u16,
 | 
			
		||||
    full_move_number: u16,
 | 
			
		||||
    pub move_counter: MoveCounter,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Board {
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +45,6 @@ impl Board {
 | 
			
		|||
        ];
 | 
			
		||||
 | 
			
		||||
        Self {
 | 
			
		||||
            player_to_move: Color::White,
 | 
			
		||||
            pieces: PieceSet::new([WHITE_PIECES, BLACK_PIECES]),
 | 
			
		||||
            ..Default::default()
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -72,22 +70,7 @@ impl Board {
 | 
			
		|||
 | 
			
		||||
    #[must_use]
 | 
			
		||||
    pub fn player_to_move(&self) -> Color {
 | 
			
		||||
        self.player_to_move
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[must_use]
 | 
			
		||||
    pub fn move_number(&self) -> u16 {
 | 
			
		||||
        self.full_move_number
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[must_use]
 | 
			
		||||
    pub fn ply_counter(&self) -> u16 {
 | 
			
		||||
        self.half_move_counter
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[must_use]
 | 
			
		||||
    pub fn flags(&self) -> &Flags {
 | 
			
		||||
        &self.flags
 | 
			
		||||
        self.move_counter.active_color
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Returns `true` if the player has the right to castle on the given side
 | 
			
		||||
| 
						 | 
				
			
			@ -199,12 +182,10 @@ impl Board {
 | 
			
		|||
impl Default for Board {
 | 
			
		||||
    fn default() -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            player_to_move: Color::default(),
 | 
			
		||||
            flags: Flags::default(),
 | 
			
		||||
            pieces: PieceSet::default(),
 | 
			
		||||
            en_passant: None,
 | 
			
		||||
            half_move_counter: 0,
 | 
			
		||||
            full_move_number: 1,
 | 
			
		||||
            move_counter: MoveCounter::default(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -212,9 +193,9 @@ impl Default for Board {
 | 
			
		|||
impl PartialEq for Board {
 | 
			
		||||
    fn eq(&self, other: &Self) -> bool {
 | 
			
		||||
        self.pieces == other.pieces
 | 
			
		||||
            && self.player_to_move == other.player_to_move
 | 
			
		||||
            && self.flags == other.flags
 | 
			
		||||
            && self.en_passant == other.en_passant
 | 
			
		||||
            && self.move_counter == other.move_counter
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,17 +1,15 @@
 | 
			
		|||
// Eryn Wells <eryn@erynwells.me>
 | 
			
		||||
 | 
			
		||||
use crate::{piece_sets::Mailbox, Board, Castle, EnPassant, Flags, PieceSet};
 | 
			
		||||
use crate::{piece_sets::Mailbox, Board, Castle, EnPassant, Flags, MoveCounter, PieceSet};
 | 
			
		||||
use chessfriend_core::{piece, Color, PlacedPiece, Rank, Shape, Square};
 | 
			
		||||
 | 
			
		||||
#[derive(Clone)]
 | 
			
		||||
pub struct Builder {
 | 
			
		||||
    player_to_move: Color,
 | 
			
		||||
    flags: Flags,
 | 
			
		||||
    pieces: Mailbox,
 | 
			
		||||
    kings: [Option<Square>; Color::NUM],
 | 
			
		||||
    en_passant: Option<EnPassant>,
 | 
			
		||||
    ply_counter: u16,
 | 
			
		||||
    move_number: u16,
 | 
			
		||||
    move_counter: MoveCounter,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Builder {
 | 
			
		||||
| 
						 | 
				
			
			@ -28,28 +26,26 @@ impl Builder {
 | 
			
		|||
        let black_king = board.king_square(Color::Black);
 | 
			
		||||
 | 
			
		||||
        Self {
 | 
			
		||||
            player_to_move: board.player_to_move(),
 | 
			
		||||
            flags: *board.flags(),
 | 
			
		||||
            pieces,
 | 
			
		||||
            kings: [Some(white_king), Some(black_king)],
 | 
			
		||||
            en_passant: board.en_passant(),
 | 
			
		||||
            ply_counter: board.ply_counter(),
 | 
			
		||||
            move_number: board.move_number(),
 | 
			
		||||
            move_counter: board.move_counter,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn to_move(&mut self, player: Color) -> &mut Self {
 | 
			
		||||
        self.player_to_move = player;
 | 
			
		||||
        self.move_counter.active_color = player;
 | 
			
		||||
        self
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn ply_counter(&mut self, num: u16) -> &mut Self {
 | 
			
		||||
        self.ply_counter = num;
 | 
			
		||||
    pub fn fullmove_number(&mut self, num: u16) -> &mut Self {
 | 
			
		||||
        self.move_counter.fullmove_number = num;
 | 
			
		||||
        self
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn move_number(&mut self, num: u16) -> &mut Self {
 | 
			
		||||
        self.move_number = num;
 | 
			
		||||
    pub fn halfmove_number(&mut self, num: u16) -> &mut Self {
 | 
			
		||||
        self.move_counter.halfmove_number = num;
 | 
			
		||||
        self
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -114,14 +110,12 @@ impl Builder {
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Board::new(
 | 
			
		||||
            self.player_to_move,
 | 
			
		||||
        Board {
 | 
			
		||||
            flags,
 | 
			
		||||
            pieces,
 | 
			
		||||
            self.en_passant,
 | 
			
		||||
            self.ply_counter,
 | 
			
		||||
            self.move_number,
 | 
			
		||||
        )
 | 
			
		||||
            move_counter: self.move_counter,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -149,13 +143,11 @@ impl Default for Builder {
 | 
			
		|||
        ]);
 | 
			
		||||
 | 
			
		||||
        Self {
 | 
			
		||||
            player_to_move: Color::White,
 | 
			
		||||
            flags: Flags::default(),
 | 
			
		||||
            pieces,
 | 
			
		||||
            kings: [Some(white_king_square), Some(black_king_square)],
 | 
			
		||||
            en_passant: None,
 | 
			
		||||
            ply_counter: 0,
 | 
			
		||||
            move_number: 1,
 | 
			
		||||
            move_counter: MoveCounter::default(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -132,8 +132,10 @@ impl ToFenStr for Board {
 | 
			
		|||
        )
 | 
			
		||||
        .map_err(ToFenStrError::FmtError)?;
 | 
			
		||||
 | 
			
		||||
        write!(fen_string, " {}", self.ply_counter()).map_err(ToFenStrError::FmtError)?;
 | 
			
		||||
        write!(fen_string, " {}", self.move_number()).map_err(ToFenStrError::FmtError)?;
 | 
			
		||||
        write!(fen_string, " {}", self.move_counter.halfmove_number)
 | 
			
		||||
            .map_err(ToFenStrError::FmtError)?;
 | 
			
		||||
        write!(fen_string, " {}", self.move_counter.fullmove_number)
 | 
			
		||||
            .map_err(ToFenStrError::FmtError)?;
 | 
			
		||||
 | 
			
		||||
        Ok(fen_string)
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -246,7 +248,7 @@ impl FromFenStr for Board {
 | 
			
		|||
        let half_move_clock: u16 = half_move_clock
 | 
			
		||||
            .parse()
 | 
			
		||||
            .map_err(FromFenStrError::ParseIntError)?;
 | 
			
		||||
        builder.ply_counter(half_move_clock);
 | 
			
		||||
        builder.halfmove_number(half_move_clock);
 | 
			
		||||
 | 
			
		||||
        let full_move_counter = fields
 | 
			
		||||
            .next()
 | 
			
		||||
| 
						 | 
				
			
			@ -254,7 +256,7 @@ impl FromFenStr for Board {
 | 
			
		|||
        let full_move_counter: u16 = full_move_counter
 | 
			
		||||
            .parse()
 | 
			
		||||
            .map_err(FromFenStrError::ParseIntError)?;
 | 
			
		||||
        builder.move_number(full_move_counter);
 | 
			
		||||
        builder.fullmove_number(full_move_counter);
 | 
			
		||||
 | 
			
		||||
        debug_assert_eq!(fields.next(), None);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue