fix othello player skip logic
This commit is contained in:
parent
3d3eb01143
commit
0bd8dec65d
@ -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()
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user