Implemented the card moving
Need to actually check it's working though
This commit is contained in:
@@ -148,8 +148,6 @@ impl Card {
|
||||
}
|
||||
|
||||
pub fn can_be_placed_on_foundation(&self, top: &Option<Card>) -> Result<(), StackingError> {
|
||||
// TODO check suit is correct
|
||||
println!("hello1");
|
||||
match top {
|
||||
None => {
|
||||
if self.value == Value::Ace {
|
||||
@@ -160,7 +158,6 @@ impl Card {
|
||||
},
|
||||
Some(c) => {
|
||||
if self.suit != c.suit {
|
||||
println!("hellosuitsame");
|
||||
return Err(StackingError::WrongSuit);
|
||||
}
|
||||
if self.value.indexed_values() + 1 == c.value.indexed_values() {
|
||||
@@ -330,14 +327,28 @@ impl Klondike {
|
||||
CardPosition::Pile(p, i) => (p, i),
|
||||
CardPosition::TopWaste | CardPosition::Foundation(_) => return false
|
||||
};
|
||||
if dcard_index != self.piles[dpile_index].len() - 1 {
|
||||
// Can't move to anything other than top of pile
|
||||
// this should already have been checked in the is_card_top...
|
||||
// maybe I'll just delete this check...
|
||||
return false;
|
||||
}
|
||||
match source_card.pos {
|
||||
CardPosition::TopWaste => {
|
||||
let card = self.waste.pop().unwrap();
|
||||
self.piles[dpile_index].push(card);
|
||||
},
|
||||
CardPosition::Pile(spile_index, scard_index) => {
|
||||
// When I come to this, need to be careful around moving the whole pile
|
||||
|
||||
let num_cards_to_take = self.piles[spile_index].len() - scard_index; // -1 maybe?
|
||||
let mut cards: Vec<Card> = Vec::new();
|
||||
for _ in 0..num_cards_to_take {
|
||||
cards.push(self.piles[spile_index].pop().unwrap());
|
||||
}
|
||||
for card in cards {
|
||||
self.piles[dpile_index].push(card);
|
||||
}
|
||||
// TODO Properly learn rust and why I can't use drain & extend methods
|
||||
// https://doc.rust-lang.org/std/vec/struct.Vec.html#method.drain
|
||||
},
|
||||
CardPosition::Foundation(s_index) => {
|
||||
let card = self.foundation[s_index].pop().unwrap();
|
||||
@@ -636,8 +647,53 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn klondike() {
|
||||
let k = Klondike::default();
|
||||
//println!("{:#?}", k);
|
||||
fn move_pile_card_to_good_pile() {
|
||||
let mut klon = Klondike::default();
|
||||
let ace = Card {
|
||||
suit: Suit::Heart,
|
||||
value: Value::Ace,
|
||||
.. Default::default()
|
||||
};
|
||||
let two = Card {
|
||||
suit: Suit::Spade,
|
||||
value: Value::Two,
|
||||
.. Default::default()
|
||||
};
|
||||
klon.piles[0].push(two.clone());
|
||||
klon.piles[1].push(ace.clone());
|
||||
let source_card = CardAndPosition {
|
||||
card: Some(ace.clone()),
|
||||
pos: CardPosition::Pile(1, 2),
|
||||
};
|
||||
let dest_card = CardAndPosition {
|
||||
card: Some(two.clone()),
|
||||
pos: CardPosition::Pile(0, 1),
|
||||
};
|
||||
assert!(klon.move_card_to_pile(&source_card, &dest_card));
|
||||
}
|
||||
#[test]
|
||||
fn move_pile_card_to_bad_pile() {
|
||||
let mut klon = Klondike::default();
|
||||
let ace = Card {
|
||||
suit: Suit::Heart,
|
||||
value: Value::Ace,
|
||||
.. Default::default()
|
||||
};
|
||||
let two = Card {
|
||||
suit: Suit::Diamond,
|
||||
value: Value::Two,
|
||||
.. Default::default()
|
||||
};
|
||||
klon.piles[0].push(two.clone());
|
||||
klon.piles[1].push(ace.clone());
|
||||
let source_card = CardAndPosition {
|
||||
card: Some(ace.clone()),
|
||||
pos: CardPosition::Pile(1, 2),
|
||||
};
|
||||
let dest_card = CardAndPosition {
|
||||
card: Some(two.clone()),
|
||||
pos: CardPosition::Pile(0, 1),
|
||||
};
|
||||
assert!(!klon.move_card_to_pile(&source_card, &dest_card));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user