Removed a useless Enum and started the moving to piles

This commit is contained in:
2025-03-09 22:19:46 +00:00
parent e86c705b5b
commit b3b9fb61a5
2 changed files with 47 additions and 34 deletions

View File

@@ -223,7 +223,6 @@ pub struct CardAndPosition {
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub enum CardPosition { pub enum CardPosition {
Deck, // I don't think this will need to be used
TopWaste, // I don't think we'd ever interact with anything other than the top of the Waste TopWaste, // I don't think we'd ever interact with anything other than the top of the Waste
Pile(usize, usize), // (PileNumber, Index) Pile(usize, usize), // (PileNumber, Index)
Foundation(usize) Foundation(usize)
@@ -280,7 +279,6 @@ impl Klondike {
// TODO raise errors properly // TODO raise errors properly
assert!(source_card.card.is_some()); assert!(source_card.card.is_some());
assert_eq!(source_card.card.unwrap().visible, true); assert_eq!(source_card.card.unwrap().visible, true);
source_card.pos.is_valid_source();
dest_card.pos.is_valid_dest(); dest_card.pos.is_valid_dest();
// Maybe TODO - check the .cards is the actual card in that position // Maybe TODO - check the .cards is the actual card in that position
@@ -288,12 +286,13 @@ impl Klondike {
match dest_card.pos { match dest_card.pos {
CardPosition::Pile(_, _) => self.move_card_to_pile(&source_card, &dest_card), CardPosition::Pile(_, _) => self.move_card_to_pile(&source_card, &dest_card),
CardPosition::Foundation(_f) => self.move_card_to_foundation(source_card, dest_card), CardPosition::Foundation(_f) => self.move_card_to_foundation(source_card, dest_card),
CardPosition::Deck | CardPosition::TopWaste => unreachable!() CardPosition::TopWaste => unreachable!()
} }
} }
pub fn move_card_to_foundation(mut self, source_card: &CardAndPosition, dest_card: &CardAndPosition) -> bool { pub fn move_card_to_foundation(mut self, source_card: &CardAndPosition, dest_card: &CardAndPosition) -> bool {
// TODO Check whether the card is the top of a pile / waste - it needs to be // TODO check the cards referenced in source and dest are the ones that are actually there
// TODO - ditto this for the "move to pile" function
// TODO actually learn Rust properly so I can figure out why I need to clone the whole struct to check a value // TODO actually learn Rust properly so I can figure out why I need to clone the whole struct to check a value
if source_card.pos != CardPosition::TopWaste && !self.clone().is_card_top_of_pile(&source_card.pos) { if source_card.pos != CardPosition::TopWaste && !self.clone().is_card_top_of_pile(&source_card.pos) {
// TODO as above - make all these proper errors // TODO as above - make all these proper errors
@@ -302,8 +301,7 @@ impl Klondike {
if source_card.card.unwrap().can_be_placed_on_foundation(&dest_card.card).is_err() { if source_card.card.unwrap().can_be_placed_on_foundation(&dest_card.card).is_err() {
return false; return false;
} }
// TODO actually move the cards - it should be possible from here
// There really must be a better way to extract an enum "value" than this...
if let CardPosition::Foundation(foundation_index) = dest_card.pos { if let CardPosition::Foundation(foundation_index) = dest_card.pos {
match source_card.pos { match source_card.pos {
CardPosition::TopWaste => { CardPosition::TopWaste => {
@@ -316,7 +314,7 @@ impl Klondike {
self.foundation[foundation_index].push(card); self.foundation[foundation_index].push(card);
return true; return true;
}, },
CardPosition::Deck | CardPosition::Foundation(_) => { CardPosition::Foundation(_) => {
unreachable!() unreachable!()
}, },
} }
@@ -324,7 +322,28 @@ impl Klondike {
unreachable!(); unreachable!();
} }
pub fn move_card_to_pile(self, source_card: &CardAndPosition, dest_card: &CardAndPosition) -> bool { pub fn move_card_to_pile(mut self, source_card: &CardAndPosition, dest_card: &CardAndPosition) -> bool {
if source_card.card.unwrap().can_be_placed_on_pile(&dest_card.card.unwrap()).is_err() {
return false;
}
let (dpile_index, dcard_index) = match dest_card.pos {
CardPosition::Pile(p, i) => (p, i),
CardPosition::TopWaste | CardPosition::Foundation(_) => 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
},
CardPosition::Foundation(s_index) => {
let card = self.foundation[s_index].pop().unwrap();
self.piles[dpile_index].push(card);
},
}
true true
} }
@@ -334,7 +353,6 @@ impl Klondike {
CardPosition::Pile(pile_index, card_index) => { CardPosition::Pile(pile_index, card_index) => {
match self.piles.get(*pile_index) { match self.piles.get(*pile_index) {
Some(pile_index) => { Some(pile_index) => {
// TODO - this is the correct palce to put a - 1
if *card_index == (pile_index.len() - 1) { if *card_index == (pile_index.len() - 1) {
true true
} else { } else {
@@ -344,27 +362,19 @@ impl Klondike {
None => false None => false
} }
}, },
CardPosition::Deck | CardPosition::TopWaste | CardPosition::Foundation(_) => false CardPosition::TopWaste | CardPosition::Foundation(_) => false
} }
} }
} }
impl CardPosition { impl CardPosition {
// Unsure this is "correct" to just panic - but it really shouldn't happen
fn is_valid_dest(&self) { fn is_valid_dest(&self) {
// TODO as with many other places - should probably raise an error instead of panic
match self { match self {
CardPosition::Deck => panic!("You can't move cards to deck"),
CardPosition::TopWaste => panic!("You can't move cards to waste"), CardPosition::TopWaste => panic!("You can't move cards to waste"),
CardPosition::Pile(_, _) | CardPosition::Foundation(_) => (), CardPosition::Pile(_, _) | CardPosition::Foundation(_) => (),
} }
} }
fn is_valid_source(&self) {
match self {
CardPosition::Deck => panic!("You can't move cards from deck"),
CardPosition::TopWaste | CardPosition::Pile(_, _) | CardPosition::Foundation(_) => (),
}
}
} }
impl Default for Klondike { impl Default for Klondike {

View File

@@ -209,7 +209,6 @@ impl App {
let selected = self.selected_card.is_some() && *c == self.selected_card.unwrap(); let selected = self.selected_card.is_some() && *c == self.selected_card.unwrap();
let a_card = match c.visible { let a_card = match c.visible {
true => card_widget(c, is_top_card, highlight, selected), true => card_widget(c, is_top_card, highlight, selected),
//false => turned_over_card(is_top_card),
false => card_widget(c, is_top_card, highlight, selected), false => card_widget(c, is_top_card, highlight, selected),
}; };
frame.render_widget( frame.render_widget(
@@ -223,20 +222,7 @@ impl App {
} }
if self.show_help { if self.show_help {
let block = Block::bordered().title("Help"); show_help(frame, &area);
let text =
"You are playing \"Legends of Soltar\" - a Klondike thingy
Press 'q' to Quit
Press '1' or '3' to change the number of cards you draw from the deck
Press 'd' to draw from your deck
Press 'w' to put the waste pile back into the deck (you can only do this when the waste is empty)";
let p = Paragraph::new(text).wrap(Wrap { trim: true });
let vertical = Layout::vertical([Constraint::Max(10)]).flex(Flex::Center);
let horizontal = Layout::horizontal([Constraint::Percentage(70)]).flex(Flex::Center);
let [area] = vertical.areas(area);
let [area] = horizontal.areas(area);
frame.render_widget(Clear, area);
frame.render_widget(p.block(block), area);
} }
} }
@@ -276,6 +262,23 @@ fn main() -> io::Result<()> {
app_result app_result
} }
fn show_help(frame: &mut Frame, area: &Rect) {
let block = Block::bordered().title("Help");
let text =
"You are playing \"Legends of Soltar\" - a Klondike thingy
Press 'q' to Quit
Press '1' or '3' to change the number of cards you draw from the deck
Press 'd' to draw from your deck
Press 'w' to put the waste pile back into the deck (you can only do this when the waste is empty)";
let p = Paragraph::new(text).wrap(Wrap { trim: true });
let vertical = Layout::vertical([Constraint::Max(10)]).flex(Flex::Center);
let horizontal = Layout::horizontal([Constraint::Percentage(70)]).flex(Flex::Center);
let [area] = vertical.areas(*area);
let [area] = horizontal.areas(area);
frame.render_widget(Clear, area);
frame.render_widget(p.block(block), area);
}
fn deck_widget(cards_in_deck: &Vec<card_stuffs::Card>) -> Paragraph<'static> { fn deck_widget(cards_in_deck: &Vec<card_stuffs::Card>) -> Paragraph<'static> {
let card_image = format!( let card_image = format!(