Add final state
This commit is contained in:
parent
01deca2c96
commit
25b064e681
2 changed files with 35 additions and 1 deletions
35
src/game.rs
35
src/game.rs
|
@ -39,6 +39,7 @@ pub enum GameState {
|
||||||
Placing,
|
Placing,
|
||||||
Removing,
|
Removing,
|
||||||
Main,
|
Main,
|
||||||
|
Won(PlayerColor),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
|
||||||
|
@ -453,6 +454,7 @@ impl MillGame {
|
||||||
|
|
||||||
match *state {
|
match *state {
|
||||||
GameState::Placing => {
|
GameState::Placing => {
|
||||||
|
// check if all stones are placed
|
||||||
if !self
|
if !self
|
||||||
.black_stones
|
.black_stones
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -473,6 +475,7 @@ impl MillGame {
|
||||||
self.current_player.lock().unwrap().swap();
|
self.current_player.lock().unwrap().swap();
|
||||||
}
|
}
|
||||||
GameState::Removing => {
|
GameState::Removing => {
|
||||||
|
// check if all stones are placed, then decide whether main or placing is next state
|
||||||
if !self
|
if !self
|
||||||
.black_stones
|
.black_stones
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -496,9 +499,39 @@ impl MillGame {
|
||||||
self.current_player.lock().unwrap().swap();
|
self.current_player.lock().unwrap().swap();
|
||||||
}
|
}
|
||||||
GameState::Main => {
|
GameState::Main => {
|
||||||
|
// check if each player has enough stones to play
|
||||||
|
if self
|
||||||
|
.white_stones
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.iter()
|
||||||
|
.filter(|stone| stone.state != StoneState::Dead)
|
||||||
|
.collect::<Vec<&Stone>>()
|
||||||
|
.len()
|
||||||
|
<= 3
|
||||||
|
{
|
||||||
|
*state = GameState::Won(PlayerColor::Black);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
if self
|
||||||
|
.black_stones
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.iter()
|
||||||
|
.filter(|stone| stone.state != StoneState::Dead)
|
||||||
|
.collect::<Vec<&Stone>>()
|
||||||
|
.len()
|
||||||
|
<= 3
|
||||||
|
{
|
||||||
|
*state = GameState::Won(PlayerColor::White);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
self.current_player.lock().unwrap().swap();
|
self.current_player.lock().unwrap().swap();
|
||||||
}
|
}
|
||||||
GameState::Waiting => unreachable!(),
|
GameState::Waiting => unreachable!(),
|
||||||
|
GameState::Won(_) => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1059,7 +1092,7 @@ impl EngineObject for MillGame {
|
||||||
Ok(())
|
Ok(())
|
||||||
})?;
|
})?;
|
||||||
}
|
}
|
||||||
GameState::Waiting => (),
|
GameState::Waiting | GameState::Won(_) => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MouseButton::Middle => self.camera_controls.lock().unwrap().hold(),
|
MouseButton::Middle => self.camera_controls.lock().unwrap().hold(),
|
||||||
|
|
|
@ -166,6 +166,7 @@ impl SimpleAI {
|
||||||
})?;
|
})?;
|
||||||
}
|
}
|
||||||
GameState::Waiting => unreachable!(),
|
GameState::Waiting => unreachable!(),
|
||||||
|
GameState::Won(_) => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
if found_a_mill {
|
if found_a_mill {
|
||||||
|
|
Loading…
Reference in a new issue