diff --git a/src/card_game.rs b/src/card_game.rs index 1f8e49f..69d7fac 100644 --- a/src/card_game.rs +++ b/src/card_game.rs @@ -152,18 +152,28 @@ impl Pile { face_up: Stack::new(), } } + pub fn flip_it_and_reverse_it(&mut self) { + self.swap_up_down(); + self.face_up.reverse(); + } pub fn swap_up_down(&mut self) { core::mem::swap(&mut self.face_up, &mut self.face_down); } + pub fn flip_up(&mut self) { + if let Some(card) = self.face_down.pop() { + self.face_up.push(card); + } + } pub fn is_empty(&self) -> bool { self.face_down.is_empty() && self.face_up.is_empty() } pub fn pop(&mut self) -> Option { - let card = self.face_up.pop()?; + self.face_up.pop() + } + pub fn pop_flip_up(&mut self) -> Option { + let card = self.pop()?; if self.face_up.is_empty() { - if let Some(card) = self.face_down.pop() { - self.face_up.push(card); - } + self.flip_up(); } Some(card) } diff --git a/src/klondike.rs b/src/klondike.rs index bb29c21..0f59f2c 100644 --- a/src/klondike.rs +++ b/src/klondike.rs @@ -234,12 +234,20 @@ impl Game for Klondike { KlondikeInstruction { src: KlondikePileId::Stock, dst: KlondikePileId::Stock, - } if self.pile(KlondikePileId::Stock).is_empty() => { - self.pile_mut(KlondikePileId::Stock).swap_up_down(); + } => { + if self.pile(KlondikePileId::Stock).face_down().is_empty() { + self.pile_mut(KlondikePileId::Stock).flip_it_and_reverse_it(); + }else{ + self.pile_mut(KlondikePileId::Stock).flip_up(); + } } KlondikeInstruction { src, dst } => { - let card = self.pile_mut(src).pop().unwrap(); - self.pile_mut(dst).push(card); + if let Some(card) = self.pile_mut(src).pop_flip_up() { + self.pile_mut(dst).push(card); + } else { + println!("Attempted to move from an empty src"); + dbg!(instruction); + } } } }