use cards::card::PlayerCard;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Player{
hand: Vec<PlayerCard>,
id: u64
}
impl Player{
pub fn new(id: u64) -> Player{
Player{
hand: vec!(),
id: id
}
}
pub fn get_id(&self) -> u64 {
self.id
}
pub fn set_hand(&self, hand:Vec<PlayerCard>) -> Player {
Player{
hand: hand.clone(),
id: self.id
}
}
pub fn remaining_cards(&self) -> usize {
self.hand.len()
}
pub fn get_hand(&self) -> Vec<PlayerCard> {
self.hand.clone()
}
pub fn reverse_hand(&self) -> Player {
let reversed_hand = self.hand.iter().map(|&c|{c.reverse()}).collect::<Vec<PlayerCard>>();
Player{
hand: reversed_hand,
id: self.id
}
}
pub fn remove(&self, cards:&Vec<PlayerCard>) -> Player {
let mut hand = self.remove_jokers(cards);
for &card in cards {
match card {
PlayerCard::Joker(_)|
PlayerCard::Wildcard(_) => (),
_ => {
let reversed = card.reverse();
let pos = hand.iter().position(|&c| { card == c || reversed == c }).unwrap();
hand.remove(pos);
}
}
}
Player {
id: self.id,
hand: hand
}
}
pub fn remove_jokers(&self, cards:&Vec<PlayerCard>)-> Vec<PlayerCard> {
let mut new_hand = vec!();
let mut jokers = 0;
for card in cards.iter() {
match *card {
PlayerCard::Wildcard(_) => jokers += 1,
_ => ()
}
}
for card in self.hand.iter() {
match *card {
PlayerCard::Joker(n) => {
if jokers < 1 {
new_hand.push(PlayerCard::Joker(n));
}else {
jokers -= 1;
}
},
c => new_hand.push(c.to_owned())
}
}
new_hand
}
}