Files
rttt/player/human.rs
Dmitry Fedotov e84d6c6054 add engine
2025-04-06 18:37:49 +03:00

74 lines
1.7 KiB
Rust

use crate::game::{Board, Cell, Move, CELL_EMPTY, CELL_O, CELL_X};
use crate::player::Player;
use std::io;
pub struct PlayerConsole {
name: String,
piece: Cell,
}
impl PlayerConsole {
pub fn new(name: &str, p: Cell) -> PlayerConsole {
PlayerConsole {
name: name.to_owned(),
piece: p,
}
}
pub fn name(&self) -> &str {
return self.name.as_str();
}
pub fn request_move(&self, b: &Board) -> Result<Move, Box<dyn std::error::Error>> {
let mut x: usize = 0;
let mut y: usize = 0;
loop {
println!("{}", b);
println!("player {}, it is your turn", self.name);
print!("x: ");
let mut s = String::new();
io::stdin().read_line(&mut s).expect("could not read input");
if let Ok(x_) = s.parse::<usize>() {
x = x_;
} else {
continue;
};
print!("y: ");
let mut s = String::new();
io::stdin().read_line(&mut s).expect("could not read input");
if let Ok(y_) = s.parse::<usize>() {
y = y_;
} else {
continue;
};
break;
}
return Ok(Move {
x: x,
y: x,
c: self.piece,
});
}
}
impl Player for PlayerConsole {
fn request_move(&self, b: &Board) -> Result<Move, Box<dyn std::error::Error>> {
self.request_move(b)
}
fn name(&self) -> &str {
self.name()
}
}
impl std::fmt::Display for PlayerConsole {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Player: {}, piece: {}", self.name, self.piece)
}
}