Kaynağa Gözat

Can distribute game

Denis Merigoux 9 yıl önce
ebeveyn
işleme
7e18b50d19
3 değiştirilmiş dosya ile 69 ekleme ve 14 silme
  1. 25 5
      src/card.rs
  2. 33 6
      src/deck.rs
  3. 11 3
      src/main.rs

+ 25 - 5
src/card.rs

1
 use std::fmt;
1
 use std::fmt;
2
+use std::cmp::Ordering;
2
 
3
 
3
-#[derive(Copy, Clone)]
4
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
4
 pub enum Suit {
5
 pub enum Suit {
5
     Clubs,
6
     Clubs,
6
     Diamonds,
7
     Diamonds,
25
     }
26
     }
26
 }
27
 }
27
 
28
 
28
-#[derive(Copy, Clone)]
29
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
29
 pub enum Symbol {
30
 pub enum Symbol {
30
     Ace,
31
     Ace,
31
     Two,
32
     Two,
83
     }
84
     }
84
 }
85
 }
85
 
86
 
86
-#[derive(Copy, Clone)]
87
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd)]
87
 pub struct Face {
88
 pub struct Face {
88
     pub suit: Suit,
89
     pub suit: Suit,
89
     pub symbol: Symbol,
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
 pub enum Trump {
100
 pub enum Trump {
94
     One,
101
     One,
95
     Two,
102
     Two,
168
     }
175
     }
169
 }
176
 }
170
 
177
 
171
-#[derive(Copy, Clone)]
178
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd)]
172
 pub enum Card {
179
 pub enum Card {
173
     Face(Face),
180
     Face(Face),
174
     Trump(Trump),
181
     Trump(Trump),
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
 use card;
1
 use card;
2
 use rand::{thread_rng, Rng};
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
     for suit in card::Suit::values() {
16
     for suit in card::Suit::values() {
7
         for symbol in card::Symbol::values() {
17
         for symbol in card::Symbol::values() {
8
-            deck.push(card::Card::Face(card::Face {
18
+            deck[counter] = card::Card::Face(card::Face {
9
                 suit: suit,
19
                 suit: suit,
10
                 symbol: symbol,
20
                 symbol: symbol,
11
-            }))
21
+            });
22
+            counter += 1
12
         }
23
         }
13
     }
24
     }
14
     for trump in card::Trump::values() {
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
     let mut rng = thread_rng();
30
     let mut rng = thread_rng();
19
     rng.shuffle(&mut deck);
31
     rng.shuffle(&mut deck);
20
     deck
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
 extern crate rand;
4
 extern crate rand;
5
 
5
 
6
 fn main() {
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
 }