use iterator, return Vec<bool> on hints
This commit is contained in:
parent
4fa72e030f
commit
f09dd58cda
1 changed files with 21 additions and 20 deletions
41
src/game.rs
41
src/game.rs
|
@ -1,6 +1,8 @@
|
||||||
use rand::{self, Rng, SeedableRng};
|
use rand::{self, Rng, SeedableRng};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
use std::iter;
|
||||||
|
use std::slice::IterMut;
|
||||||
|
|
||||||
pub use info::*;
|
pub use info::*;
|
||||||
pub use cards::*;
|
pub use cards::*;
|
||||||
|
@ -38,7 +40,7 @@ pub enum TurnChoice {
|
||||||
// represents what happened in a turn
|
// represents what happened in a turn
|
||||||
#[derive(Debug,Clone)]
|
#[derive(Debug,Clone)]
|
||||||
pub enum TurnResult {
|
pub enum TurnResult {
|
||||||
Hint(Vec<usize>), // indices revealed
|
Hint(Vec<bool>), // vector of whether each was in the hint
|
||||||
Discard(Card), // card discarded
|
Discard(Card), // card discarded
|
||||||
Play(Card, bool), // card played, whether it succeeded
|
Play(Card, bool), // card played, whether it succeeded
|
||||||
}
|
}
|
||||||
|
@ -106,30 +108,29 @@ impl PlayerState {
|
||||||
self.info.push(SimpleCardInfo::new());
|
self.info.push(SimpleCardInfo::new());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reveal(&mut self, hinted: &Hinted) -> Vec<usize> {
|
fn hand_info_iter_mut<'a>(&'a mut self) ->
|
||||||
let mut indices = Vec::new();
|
iter::Zip<IterMut<'a, Card>, IterMut<'a, SimpleCardInfo>>
|
||||||
|
{
|
||||||
|
self.hand.iter_mut().zip(self.info.iter_mut())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reveal(&mut self, hinted: &Hinted) -> Vec<bool> {
|
||||||
match hinted {
|
match hinted {
|
||||||
&Hinted::Color(ref color) => {
|
&Hinted::Color(ref color) => {
|
||||||
let mut i = 0;
|
self.hand_info_iter_mut().map(|(card, info)| {
|
||||||
for card in &self.hand {
|
|
||||||
let matches = card.color == *color;
|
let matches = card.color == *color;
|
||||||
self.info[i].mark_color(color, matches);
|
info.mark_color(color, matches);
|
||||||
if matches { indices.push(i); }
|
matches
|
||||||
i += 1;
|
}).collect::<Vec<_>>()
|
||||||
}
|
|
||||||
}
|
}
|
||||||
&Hinted::Value(ref value) => {
|
&Hinted::Value(ref value) => {
|
||||||
let mut i = 0;
|
self.hand_info_iter_mut().map(|(card, info)| {
|
||||||
for card in &self.hand {
|
|
||||||
let matches = card.value == *value;
|
let matches = card.value == *value;
|
||||||
self.info[i].mark_value(value, matches);
|
info.mark_value(value, matches);
|
||||||
if matches { indices.push(i); }
|
matches
|
||||||
i += 1;
|
}).collect::<Vec<_>>()
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
indices
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -529,11 +530,11 @@ impl GameState {
|
||||||
format!("Player {} gave a hint to himself", hint.player));
|
format!("Player {} gave a hint to himself", hint.player));
|
||||||
|
|
||||||
let ref mut state = self.player_states.get_mut(&hint.player).unwrap();
|
let ref mut state = self.player_states.get_mut(&hint.player).unwrap();
|
||||||
let indices = state.reveal(&hint.hinted);
|
let results = state.reveal(&hint.hinted);
|
||||||
if (!self.board.allow_empty_hints) && (indices.len() == 0) {
|
if (!self.board.allow_empty_hints) && (results.iter().all(|matched| !matched)) {
|
||||||
panic!("Tried hinting an empty hint");
|
panic!("Tried hinting an empty hint");
|
||||||
}
|
}
|
||||||
TurnResult::Hint(indices)
|
TurnResult::Hint(results)
|
||||||
}
|
}
|
||||||
TurnChoice::Discard(index) => {
|
TurnChoice::Discard(index) => {
|
||||||
let card = self.take_from_hand(index);
|
let card = self.take_from_hand(index);
|
||||||
|
|
Loading…
Reference in a new issue