#[cfg(feature = "serde")]
use crate::locale::LocaleExport;
use crate::{game::Game, locale::Locale};
mod easy;
mod medium;
fn try_step(game: &Game, color: usize) -> Option<(Game, usize)> {
let player = game.current_player;
let points = game.players[player].points;
let game = game.step(color);
match game {
Ok(game) => {
let diff = game.players[player].points - points;
Some((game, diff))
}
_ => None,
}
}
struct BotType<'a> {
title: Locale<'a>,
step: fn(game: &Game) -> Game,
}
const BOT_TYPES: &'static [BotType<'static>] = &[
BotType {
title: Locale {
ru: "Простой",
en: "Easy",
},
step: easy::step,
},
BotType {
title: Locale {
ru: "Средний",
en: "Medium",
},
step: medium::step,
},
];
#[cfg(feature = "serde")]
pub fn get_bot_types() -> Vec<LocaleExport> {
BOT_TYPES.iter().map(|el| el.title.export()).collect()
}
pub fn step(bot_type: usize, game: Game) -> Game {
if bot_type > BOT_TYPES.len() - 1 {
panic!(
"Cannot find bot with id {}. Last id is {}, '{}'",
bot_type,
BOT_TYPES.len() - 1,
BOT_TYPES.last().unwrap().title.en
);
}
let step = BOT_TYPES[bot_type].step;
step(&game)
}