card game stuff
This commit is contained in:
Generated
+16
@@ -7,6 +7,7 @@ name = "card_game"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deranged",
|
"deranged",
|
||||||
|
"rand",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -14,3 +15,18 @@ name = "deranged"
|
|||||||
version = "0.5.8"
|
version = "0.5.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
|
checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.10.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.10.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
|
||||||
|
|||||||
@@ -5,3 +5,4 @@ edition = "2024"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
deranged = "0.5.8"
|
deranged = "0.5.8"
|
||||||
|
rand = { version = "0.10.1", default-features = false }
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ pub trait Game {
|
|||||||
/// 2 bits for suit ID
|
/// 2 bits for suit ID
|
||||||
/// 4 bits for card Value
|
/// 4 bits for card Value
|
||||||
/// TODO: better encoding for slightly more decks
|
/// TODO: better encoding for slightly more decks
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct Card(u8);
|
pub struct Card(u8);
|
||||||
pub struct CardValue(deranged::RangedU8<1, 13>);
|
pub struct CardValue(deranged::RangedU8<1, 13>);
|
||||||
pub enum Suit {
|
pub enum Suit {
|
||||||
@@ -19,8 +20,48 @@ pub enum Suit {
|
|||||||
Clubs,
|
Clubs,
|
||||||
Diamonds,
|
Diamonds,
|
||||||
}
|
}
|
||||||
|
impl Card {
|
||||||
|
pub fn value(&self) -> CardValue {
|
||||||
|
let masked = self.0 & 0b1111;
|
||||||
|
let value = unsafe { deranged::RangedU8::new_unchecked(masked) };
|
||||||
|
CardValue(value)
|
||||||
|
}
|
||||||
|
pub fn suit(&self) -> Suit {
|
||||||
|
let red = self.is_red();
|
||||||
|
let kiki = self.is_kiki();
|
||||||
|
match (kiki, red) {
|
||||||
|
(false, false) => Suit::Spades,
|
||||||
|
(false, true) => Suit::Hearts,
|
||||||
|
(true, false) => Suit::Clubs,
|
||||||
|
(true, true) => Suit::Diamonds,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// Is the suit red.
|
||||||
|
pub fn is_red(&self) -> bool {
|
||||||
|
self.0 & 0b010000 != 0
|
||||||
|
}
|
||||||
|
/// Is the suit shape spikey. (Bouba/kiki)
|
||||||
|
pub fn is_kiki(&self) -> bool {
|
||||||
|
self.0 & 0b100000 != 0
|
||||||
|
}
|
||||||
|
pub fn deck(&self) -> u8 {
|
||||||
|
self.0 >> 6
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Stack(Vec<Card>);
|
pub struct Stack(Vec<Card>);
|
||||||
|
impl Stack {
|
||||||
|
/// Generate a full deck of cards with the specified deck id.
|
||||||
|
pub fn full_deck(deck_id: u8) -> Stack {
|
||||||
|
let mut stack = Vec::with_capacity(52);
|
||||||
|
for suit in 0..4 {
|
||||||
|
for value in 1..=13 {
|
||||||
|
stack.push(Card(deck_id << 6 | suit << 4 | value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Stack(stack)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Session<G: Game> {
|
pub struct Session<G: Game> {
|
||||||
state: G,
|
state: G,
|
||||||
|
|||||||
@@ -32,3 +32,9 @@ pub struct Klondike {
|
|||||||
config: KlondikeConfig,
|
config: KlondikeConfig,
|
||||||
state: KlondikeState,
|
state: KlondikeState,
|
||||||
}
|
}
|
||||||
|
impl Klondike {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
let deck = Stack::full_deck(0);
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user