display game vertically

This commit is contained in:
2026-05-27 22:33:21 -07:00
parent 5ab1b8bac7
commit 035875c893
+43 -21
View File
@@ -17,7 +17,7 @@ impl Display for Displayed<&Card> {
Rank::Jack => write!(f, " J"), Rank::Jack => write!(f, " J"),
Rank::Queen => write!(f, " Q"), Rank::Queen => write!(f, " Q"),
Rank::King => write!(f, " K"), Rank::King => write!(f, " K"),
other => write!(f, "{}", other as u8), other => write!(f, "{:>2}", other as u8),
}?; }?;
match self.0.suit() { match self.0.suit() {
Suit::Spades => write!(f, ""), Suit::Spades => write!(f, ""),
@@ -33,7 +33,7 @@ impl Display for OptionalCard<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self { match self {
&OptionalCard(Some(card)) => write!(f, "{}", Displayed(card)), &OptionalCard(Some(card)) => write!(f, "{}", Displayed(card)),
OptionalCard(None) => write!(f, "None"), OptionalCard(None) => write!(f, " []"),
} }
} }
} }
@@ -42,16 +42,17 @@ impl Display for Displayed<&Klondike> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
// Stock // Stock
let stock_count = self.0.state().stock().face_down().len(); let stock_count = self.0.state().stock().face_down().len();
writeln!(f, "Stock: {stock_count}")?;
// Hand // Hand
let hand = self.0.state().stock().face_up().last(); let hand = self.0.state().stock().face_up().last();
writeln!(f, "Hand: {}", OptionalCard(hand))?;
// Foundations // Foundations
writeln!(f, " STOCK F1 F2 F3 F4")?;
write!( write!(
f, f,
"Foundations: {} {} {} {}", " {:>2} {} {} {} {} {}",
stock_count,
OptionalCard(hand),
OptionalCard(self.0.state().foundation1().last()), OptionalCard(self.0.state().foundation1().last()),
OptionalCard(self.0.state().foundation2().last()), OptionalCard(self.0.state().foundation2().last()),
OptionalCard(self.0.state().foundation3().last()), OptionalCard(self.0.state().foundation3().last()),
@@ -59,28 +60,49 @@ impl Display for Displayed<&Klondike> {
)?; )?;
writeln!(f)?; writeln!(f)?;
fn write_pile<const DN: usize, const UP: usize>( writeln!(f, " T1 T2 T3 T4 T5 T6 T7")?;
fn write_pile_card<const DN: usize, const UP: usize>(
f: &mut std::fmt::Formatter<'_>, f: &mut std::fmt::Formatter<'_>,
pile: &Pile<DN, UP>, pile: &Pile<DN, UP>,
pile_id: usize, row: usize,
) -> std::fmt::Result { ) -> std::fmt::Result {
write!(f, "T{} ", pile_id)?; if let Some(_card) = pile.face_down().get(row) {
for _ in pile.face_down() { return write!(f, " ⎾⏋"); // └┘ ⨽⨼ ⫭⫬
write!(f, "]")?;
} }
for card in pile.face_up() { let Some(row) = row.checked_sub(pile.face_down().len()) else {
write!(f, "{}", Displayed(card))?; return write!(f, " ");
};
if let Some(card) = pile.face_up().get(row) {
return write!(f, "{}", Displayed(card));
} }
writeln!(f)?; write!(f, " ")
Ok(()) }
fn write_row(
f: &mut std::fmt::Formatter<'_>,
game: &Klondike,
row: usize,
) -> std::fmt::Result {
write_pile_card(f, game.state().tableau1(), row)?;
write!(f, " ")?;
write_pile_card(f, game.state().tableau2(), row)?;
write!(f, " ")?;
write_pile_card(f, game.state().tableau3(), row)?;
write!(f, " ")?;
write_pile_card(f, game.state().tableau4(), row)?;
write!(f, " ")?;
write_pile_card(f, game.state().tableau5(), row)?;
write!(f, " ")?;
write_pile_card(f, game.state().tableau6(), row)?;
write!(f, " ")?;
write_pile_card(f, game.state().tableau7(), row)?;
writeln!(f)
}
for row in 0..7 + 13 {
write_row(f, self.0, row)?;
} }
write_pile(f, self.0.state().tableau1(), 1)?;
write_pile(f, self.0.state().tableau2(), 2)?;
write_pile(f, self.0.state().tableau3(), 3)?;
write_pile(f, self.0.state().tableau4(), 4)?;
write_pile(f, self.0.state().tableau5(), 5)?;
write_pile(f, self.0.state().tableau6(), 6)?;
write_pile(f, self.0.state().tableau7(), 7)?;
Ok(()) Ok(())
} }