Parcourir la Source

Can distribute game

Denis Merigoux il y a 9 ans
Parent
commit
7e18b50d19
3 fichiers modifiés avec 69 ajouts et 14 suppressions
  1. 25 5
      src/card.rs
  2. 33 6
      src/deck.rs
  3. 11 3
      src/main.rs

+ 25 - 5
src/card.rs

@@ -1,6 +1,7 @@
1 1
 use std::fmt;
2
+use std::cmp::Ordering;
2 3
 
3
-#[derive(Copy, Clone)]
4
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
4 5
 pub enum Suit {
5 6
     Clubs,
6 7
     Diamonds,
@@ -25,7 +26,7 @@ impl Suit {
25 26
     }
26 27
 }
27 28
 
28
-#[derive(Copy, Clone)]
29
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
29 30
 pub enum Symbol {
30 31
     Ace,
31 32
     Two,
@@ -83,13 +84,19 @@ impl Symbol {
83 84
     }
84 85
 }
85 86
 
86
-#[derive(Copy, Clone)]
87
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd)]
87 88
 pub struct Face {
88 89
     pub suit: Suit,
89 90
     pub symbol: Symbol,
90 91
 }
91 92
 
92
-#[derive(Copy, Clone)]
93
+impl Ord for Face {
94
+    fn cmp(&self, face: &Face) -> Ordering {
95
+        self.symbol.cmp(&face.symbol)
96
+    }
97
+}
98
+
99
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
93 100
 pub enum Trump {
94 101
     One,
95 102
     Two,
@@ -168,7 +175,7 @@ impl Trump {
168 175
     }
169 176
 }
170 177
 
171
-#[derive(Copy, Clone)]
178
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd)]
172 179
 pub enum Card {
173 180
     Face(Face),
174 181
     Trump(Trump),
@@ -185,3 +192,16 @@ impl fmt::Display for Card {
185 192
         }
186 193
     }
187 194
 }
195
+
196
+impl Ord for Card {
197
+    fn cmp(&self, card: &Card) -> Ordering {
198
+        match (self, card) {
199
+            (&Card::Fool, _) => Ordering::Less,
200
+            (_, &Card::Fool) => Ordering::Greater,
201
+            (&Card::Trump(_), &Card::Face(_)) => Ordering::Greater,
202
+            (&Card::Face(_), &Card::Trump(_)) => Ordering::Less,
203
+            (&Card::Trump(trump1), &Card::Trump(trump2)) => trump1.cmp(&trump2),
204
+            (&Card::Face(face1), &Card::Face(face2)) => face1.cmp(&face2),
205
+        }
206
+    }
207
+}

+ 33 - 6
src/deck.rs

@@ -1,21 +1,48 @@
1 1
 use card;
2 2
 use rand::{thread_rng, Rng};
3
+use std::collections::BTreeSet;
3 4
 
4
-pub fn new_deck() -> Vec<card::Card> {
5
-    let mut deck: Vec<card::Card> = Vec::new();
5
+pub const DECK_SIZE: usize = 78;
6
+pub const NUMBER_OF_PLAYERS: usize = 4;
7
+pub const CARDS_PER_DISTRIBUTION: usize = 3;
8
+pub type Deck = [card::Card; DECK_SIZE];
9
+pub type Hand = BTreeSet<card::Card>;
10
+
11
+
12
+// Creates a deck_size cards tarot deck, shuffled
13
+pub fn new_deck() -> Deck {
14
+    let mut deck: [card::Card; DECK_SIZE] = [card::Card::Fool; DECK_SIZE];
15
+    let mut counter = 0;
6 16
     for suit in card::Suit::values() {
7 17
         for symbol in card::Symbol::values() {
8
-            deck.push(card::Card::Face(card::Face {
18
+            deck[counter] = card::Card::Face(card::Face {
9 19
                 suit: suit,
10 20
                 symbol: symbol,
11
-            }))
21
+            });
22
+            counter += 1
12 23
         }
13 24
     }
14 25
     for trump in card::Trump::values() {
15
-        deck.push(card::Card::Trump(trump))
26
+        deck[counter] = card::Card::Trump(trump);
27
+        counter += 1
16 28
     }
17
-    deck.push(card::Card::Fool);
29
+    deck[counter] = card::Card::Fool;
18 30
     let mut rng = thread_rng();
19 31
     rng.shuffle(&mut deck);
20 32
     deck
21 33
 }
34
+
35
+// Distributes the deck between the four players and the dog
36
+pub fn distribute_cards(deck: Deck) -> (Hand, [Hand; 4]) {
37
+    let mut dog: Hand = BTreeSet::new();
38
+    let mut hands: [Hand; NUMBER_OF_PLAYERS] =
39
+        [BTreeSet::new(), BTreeSet::new(), BTreeSet::new(), BTreeSet::new()];
40
+    for i in 0..(DECK_SIZE - 1) {
41
+        if i <= 5 {
42
+            dog.insert(deck[i]);
43
+        } else {
44
+            hands[(i / CARDS_PER_DISTRIBUTION) % NUMBER_OF_PLAYERS].insert(deck[i]);
45
+        }
46
+    }
47
+    (dog, hands)
48
+}

+ 11 - 3
src/main.rs

@@ -4,8 +4,16 @@ mod deck;
4 4
 extern crate rand;
5 5
 
6 6
 fn main() {
7
-    let mut deck = deck::new_deck();
8
-    for card in deck {
9
-        println!("{}", card)
7
+    let deck = deck::new_deck();
8
+    let (dog, hands) = deck::distribute_cards(deck);
9
+    println!("-> Cartes du chien :");
10
+    for card in dog.iter() {
11
+        println!("{}", card);
12
+    }
13
+    for i in 0..(deck::NUMBER_OF_PLAYERS) {
14
+        println!("-> Cartes du joueur {} :", i + 1);
15
+        for card in hands[i].iter() {
16
+            println!("{}", card);
17
+        }
10 18
     }
11 19
 }