chess_game 0.2.0

Simple Chess game
Documentation
use std::{thread, time::Duration};
use chess::{ChessMove, Board, MoveGen, Square, Piece, Color, EMPTY, BoardStatus};
use method_shorthands::methods::*;
use rand::prelude::*;

use crate::{piece::Value, square::IsBackRank};

use super::Player;

#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct BongMasterBot;

impl Player for BongMasterBot {
    fn get_move(board: Board, num_moves: usize, bot_wait_ms: u64) -> Result<ChessMove, ()> {
        if bot_wait_ms > 0 { thread::sleep(Duration::from_millis(bot_wait_ms)) };

        let move_gen = MoveGen::new_legal(&board);
        let move_list: Vec<ChessMove> = move_gen.collect();

        // King's Pawn opener (albeit dumb)
        match num_moves {
            0 => return Ok(ChessMove::new(Square::E2, Square::E3, None)),
            1 => return Ok(ChessMove::new(Square::E7, Square::E6, None)),
            _ => ()
        };

        // bong cloud time
        match num_moves {
            2 => return Ok(ChessMove::new(Square::E1, Square::E2, None)),
            3 => return Ok(ChessMove::new(Square::E8, Square::E7, None)),
            _ => ()
        };

        // evaluation function
        let mut best_move = (move_list[0], 0.0);
        for j in &move_list {
            let source = j.get_source();
            let dest = j.get_dest();
            let temp_board = board.make_move_new(*j);
            if temp_board.status() == BoardStatus::Checkmate {
                return Ok(*j);
            }
            let mut score = match board.side_to_move() {
                Color::White => dest.get_rank().to_index() as f32 - source.get_rank().to_index() as f32,
                Color::Black => -1.0 * (dest.get_rank().to_index() as f32 - source.get_rank().to_index() as f32)
            };
            if board.piece_on(source).uw() == Piece::King && source.is_back_rank() == false {
                score += 1.0;
            }
            if *temp_board.checkers() != EMPTY {
                score += 2.0;
            }
            if let Some(piece) = board.piece_on(dest) {
                score += 2.0 * piece.value();
            }
            score += rand::thread_rng().gen_range(-0.55..0.55);
            if score > best_move.1 {
                best_move = (*j, score);
            }
        }

        Ok(best_move.0)
    }
}