fix othello player skip logic

This commit is contained in:
Simon Gardling 2025-02-10 10:23:28 -05:00
parent 3d3eb01143
commit 0bd8dec65d
Signed by: titaniumtown
GPG Key ID: 9AB28AC10ECE533D
5 changed files with 18 additions and 7 deletions

View File

@ -17,10 +17,14 @@ impl Agent for ManualAgent {
fn next_move(&mut self, _: &Board) -> Option<(usize, usize)> {
let stdin = io::stdin();
let mut input = String::new();
println!("Your turn!");
println!("Your turn! ('Skip' to skip)");
loop {
input.clear();
stdin.lock().read_line(&mut input).ok()?;
if input.to_lowercase().trim() == "skip" {
// skips move
return None;
}
let got = input
.split_whitespace()

View File

@ -196,7 +196,10 @@ impl Board {
}
pub fn game_winner(&self, turn: Piece) -> Option<Piece> {
if self.possible_moves(turn).count() > 0 {
// Wikipedia: `Players take alternate turns. If one player cannot make a valid move, play passes back to the other player. The game ends when the grid has filled up or if neither player can make a valid move.`
if self.possible_moves(turn).next().is_some() || self.possible_moves(!turn).next().is_some()
{
// player can still make a move, there is no winner
return None;
}

View File

@ -226,9 +226,9 @@ impl FutureMoves {
let mut new_arena = Vec::new();
let mut index_map = vec![None; self.arena.len()];
for (old_idx, _) in retain.iter().enumerate().filter(|(_, a)| **a) {
for (old_idx, _) in retain.iter().enumerate().rev().filter(|(_, a)| **a) {
index_map[old_idx] = Some(new_arena.len());
let mut node = self.arena[old_idx].clone();
let mut node = self.arena.remove(old_idx);
node.parent = node.parent.and_then(|p| index_map[p]);
node.children = node.children.iter().filter_map(|&c| index_map[c]).collect();
new_arena.push(node);

View File

@ -53,7 +53,11 @@ impl Game {
}
} else {
println!("Player {} did not make a move!", player_i);
// TODO! break, player should not be able to skip a move
// players are able to skip a move if they have no valid moves to make
assert!(
!self.board.possible_moves(player_color).any(|_| true),
"Player skipped a move, but they had a possible move to make"
);
return; // No valid move available
}
}

View File

@ -11,8 +11,8 @@ mod piece;
fn main() {
let player1 = complexagent::ComplexAgent::new(Piece::Black);
// let player2 = complexagent::ComplexAgent::new(Piece::White);
// let player2 = agent::ManualAgent::new(Piece::White);
let player2 = agent::RandomAgent::new(Piece::White);
let player2 = agent::ManualAgent::new(Piece::White);
// let player2 = agent::RandomAgent::new(Piece::White);
let mut game = Game::new(Box::new(player1), Box::new(player2));
game.game_loop();
}