improvements

This commit is contained in:
nora 2023-01-14 16:33:20 +01:00
parent afa61289a5
commit a643d11021
6 changed files with 47 additions and 43 deletions

View file

@ -8,7 +8,7 @@ pub use {board::TicTacToe, player::*};
mod tests {
use crate::{minmax::PerfectPlayer, tic_tac_toe::board::TicTacToe, GamePlayer, Player};
use super::player::{GreedyPlayer, RandomPlayer};
use crate::player::{GreedyPlayer, RandomPlayer};
fn assert_win_ratio<X: GamePlayer<TicTacToe>, O: GamePlayer<TicTacToe>>(
runs: u64,
@ -33,7 +33,7 @@ mod tests {
#[test]
fn perfect_always_beats_greedy() {
assert_win_ratio(20, 1.0, || PerfectPlayer::new(false), || GreedyPlayer);
assert_win_ratio(1, 1.0, || PerfectPlayer::new(false), || GreedyPlayer);
}
#[test]

View file

@ -1,21 +1,9 @@
use std::io::Write;
use rand::Rng;
use crate::{GamePlayer, Player};
use super::TicTacToe;
#[derive(Clone, Default)]
pub struct GreedyPlayer;
impl GamePlayer<TicTacToe> for GreedyPlayer {
fn next_move(&mut self, board: &mut TicTacToe, this_player: Player) {
let first_free = board.iter().position(|p| p.is_none()).unwrap();
board.set(first_free, Some(this_player));
}
}
#[derive(Clone, Default)]
pub struct HumanPlayer;
@ -45,21 +33,3 @@ impl GamePlayer<TicTacToe> for HumanPlayer {
}
}
}
#[derive(Clone, Default)]
pub struct RandomPlayer;
impl GamePlayer<TicTacToe> for RandomPlayer {
fn next_move(&mut self, board: &mut TicTacToe, this_player: Player) {
loop {
let next = rand::thread_rng().gen_range(0..9);
match board.get(next) {
Some(_) => {}
None => {
board.set(next, Some(this_player));
return;
}
}
}
}
}