undo
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user