klondike instruction validation
This commit is contained in:
@@ -27,7 +27,27 @@ impl Suit {
|
|||||||
self as u8 & 0b10 != 0
|
self as u8 & 0b10 != 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
|
||||||
pub struct CardValue(u8);
|
pub struct CardValue(u8);
|
||||||
|
impl CardValue {
|
||||||
|
pub fn checked_add(self, offset: u8) -> Option<CardValue> {
|
||||||
|
let new_value = self.0.checked_add(offset)?;
|
||||||
|
if 13 < new_value {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(CardValue(new_value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn checked_sub(self, offset: u8) -> Option<CardValue> {
|
||||||
|
let new_value = self.0.checked_sub(offset)?;
|
||||||
|
if new_value < 1 {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(CardValue(new_value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/// An identifier which specifies the deck id, suit, and card value.
|
/// An identifier which specifies the deck id, suit, and card value.
|
||||||
/// 2 bits for deck ID
|
/// 2 bits for deck ID
|
||||||
/// 2 bits for suit ID
|
/// 2 bits for suit ID
|
||||||
|
|||||||
+55
-1
@@ -86,7 +86,61 @@ impl Game for Klondike {
|
|||||||
vec![].into_iter()
|
vec![].into_iter()
|
||||||
}
|
}
|
||||||
fn validate_instruction(&self, instruction: Self::Instruction) -> bool {
|
fn validate_instruction(&self, instruction: Self::Instruction) -> bool {
|
||||||
todo!()
|
match instruction {
|
||||||
|
// Stock -> Stock draws a card or resets the stock
|
||||||
|
KlondikeInstruction {
|
||||||
|
src: KlondikePileId::Stock,
|
||||||
|
dst: KlondikePileId::Stock,
|
||||||
|
} => {
|
||||||
|
// cannot move stock when stock is empty
|
||||||
|
!self.pile(KlondikePileId::Stock).is_empty()
|
||||||
|
}
|
||||||
|
|
||||||
|
// cannot move cards to stock
|
||||||
|
KlondikeInstruction {
|
||||||
|
src: _,
|
||||||
|
dst: KlondikePileId::Stock,
|
||||||
|
} => false,
|
||||||
|
|
||||||
|
// moving to foundation has special rules
|
||||||
|
KlondikeInstruction { src, dst }
|
||||||
|
if matches!(
|
||||||
|
dst,
|
||||||
|
KlondikePileId::Foundation0
|
||||||
|
| KlondikePileId::Foundation1
|
||||||
|
| KlondikePileId::Foundation2
|
||||||
|
| KlondikePileId::Foundation3
|
||||||
|
) =>
|
||||||
|
{
|
||||||
|
// get the top cards
|
||||||
|
if let Some(src_card) = self.pile(src).face_up().last()
|
||||||
|
&& let Some(dst_card) = self.pile(dst).face_up().last()
|
||||||
|
// suit matches?
|
||||||
|
&& src_card.suit() == dst_card.suit()
|
||||||
|
// value is +1?
|
||||||
|
&& dst_card.value().checked_add(1) == Some(src_card.value())
|
||||||
|
{
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// other = move to tableau
|
||||||
|
KlondikeInstruction { src, dst } => {
|
||||||
|
// get the top cards
|
||||||
|
if let Some(src_card) = self.pile(src).face_up().last()
|
||||||
|
&& let Some(dst_card) = self.pile(dst).face_up().last()
|
||||||
|
// red-ness is opposite?
|
||||||
|
&& src_card.is_red() != dst_card.is_red()
|
||||||
|
// value is -1?
|
||||||
|
&& dst_card.value().checked_sub(1) == Some(src_card.value())
|
||||||
|
{
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fn process_instruction(&mut self, instruction: Self::Instruction) {
|
fn process_instruction(&mut self, instruction: Self::Instruction) {
|
||||||
let card = self.pile_mut(instruction.src).pop().unwrap();
|
let card = self.pile_mut(instruction.src).pop().unwrap();
|
||||||
|
|||||||
Reference in New Issue
Block a user