This commit is contained in:
2026-05-15 08:54:07 -07:00
parent 64d7780939
commit 78a5b9cc3d
4 changed files with 22 additions and 9 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ use card_game::klondike::Klondike;
// create game session // create game session
let seed = Rng::default(); let seed = Rng::default();
let game = Klondike::new(seed.clone(), Default::default()); let game = Klondike::new(seed.clone(), Default::default());
let mut session = Session::new(seed, game); let mut session = Session::new(game);
// is winnable // is winnable
let is_winnable = session.is_winnable().is_some(); let is_winnable = session.is_winnable().is_some();
+16 -4
View File
@@ -165,14 +165,17 @@ impl Pile {
} }
pub struct Session<G: Game> { pub struct Session<G: Game> {
seed: Rng, seed: G,
state: G, state: G,
history: Vec<G::Instruction>, history: Vec<G::Instruction>,
} }
impl<G: Game> Session<G> { impl<G: Game + Clone> Session<G>
pub fn new(seed: Rng, state: G) -> Self { where
G::Instruction: Clone,
{
pub fn new(state: G) -> Self {
Self { Self {
seed, seed: state.clone(),
state, state,
history: Vec::new(), history: Vec::new(),
} }
@@ -183,6 +186,15 @@ impl<G: Game> Session<G> {
pub fn is_winnable(&self) -> Option<Vec<G::Instruction>> { pub fn is_winnable(&self) -> Option<Vec<G::Instruction>> {
None None
} }
pub fn undo(&mut self) {
// replay the entire history of the game except one move
self.history.pop();
let mut state = self.seed.clone();
for instruction in self.history() {
state.process_instruction(instruction.clone());
}
self.state = state;
}
} }
impl<G: Game> Game for Session<G> impl<G: Game> Game for Session<G>
where where
+3 -1
View File
@@ -1,6 +1,7 @@
use crate::Rng; use crate::Rng;
use crate::card_game::{Game, Pile, Stack}; use crate::card_game::{Game, Pile, Stack};
#[derive(Clone, Debug)]
pub struct KlondikeConfig {} pub struct KlondikeConfig {}
impl Default for KlondikeConfig { impl Default for KlondikeConfig {
fn default() -> Self { fn default() -> Self {
@@ -66,7 +67,7 @@ impl KlondikeInstruction {
} }
} }
#[derive(Clone, Hash)] #[derive(Clone, Debug, Hash)]
struct KlondikeState { struct KlondikeState {
piles: [Pile; 13], piles: [Pile; 13],
} }
@@ -157,6 +158,7 @@ impl Iterator for KlondikeIter {
} }
} }
#[derive(Clone, Debug)]
pub struct Klondike { pub struct Klondike {
config: KlondikeConfig, config: KlondikeConfig,
state: KlondikeState, state: KlondikeState,
+2 -3
View File
@@ -5,9 +5,8 @@ fn test_klondike() {
use crate::klondike::Klondike; use crate::klondike::Klondike;
// create game session // create game session
let seed = Rng::default(); let game = Klondike::new(Rng::default(), Default::default());
let game = Klondike::new(seed.clone(), Default::default()); let mut session = Session::new(game);
let mut session = Session::new(seed, game);
// is winnable // is winnable
let is_winnable = session.is_winnable().is_some(); let is_winnable = session.is_winnable().is_some();