Просмотр исходного кода

Implemented basic gameplay mechanism

Denis Merigoux лет назад: 9
Родитель
Сommit
9d8f16f1de
3 измененных файлов с 305 добавлено и 9 удалено
  1. 177 0
      partie.txt
  2. 1 0
      src/card.rs
  3. 127 9
      src/game.rs

+ 177 - 0
partie.txt

@@ -0,0 +1,177 @@
1
+-> Cartes du chien :
2
+as de carreau
3
+5 de carreau
4
+cavalier de trèfle
5
+4 d'atout
6
+7 d'atout
7
+10 d'atout
8
+-> Cartes du joueur 0:
9
+as de cœur
10
+as de pique
11
+2 de pique
12
+3 de cœur
13
+3 de pique
14
+4 de carreau
15
+4 de pique
16
+6 de carreau
17
+6 de pique
18
+7 de pique
19
+8 de carreau
20
+9 de trèfle
21
+valet de trèfle
22
+valet de pique
23
+cavalier de carreau
24
+5 d'atout
25
+12 d'atout
26
+14 d'atout
27
+-> Cartes du joueur 1:
28
+excuse
29
+2 de trèfle
30
+2 de cœur
31
+5 de trèfle
32
+7 de cœur
33
+8 de cœur
34
+9 de pique
35
+10 de trèfle
36
+10 de carreau
37
+valet de cœur
38
+cavalier de cœur
39
+dame de trèfle
40
+roi de cœur
41
+petit
42
+8 d'atout
43
+9 d'atout
44
+16 d'atout
45
+19 d'atout
46
+-> Cartes du joueur 2:
47
+3 de trèfle
48
+3 de carreau
49
+4 de trèfle
50
+4 de cœur
51
+5 de cœur
52
+6 de trèfle
53
+7 de trèfle
54
+9 de carreau
55
+10 de pique
56
+valet de carreau
57
+dame de carreau
58
+dame de pique
59
+roi de pique
60
+2 d'atout
61
+6 d'atout
62
+11 d'atout
63
+15 d'atout
64
+21 d'atout
65
+-> Cartes du joueur 3:
66
+as de trèfle
67
+2 de carreau
68
+5 de pique
69
+6 de cœur
70
+7 de carreau
71
+8 de trèfle
72
+8 de pique
73
+9 de cœur
74
+10 de cœur
75
+cavalier de pique
76
+dame de cœur
77
+roi de trèfle
78
+roi de carreau
79
+3 d'atout
80
+13 d'atout
81
+17 d'atout
82
+18 d'atout
83
+20 d'atout
84
+===== Début de la partie ! =====
85
+Le joueur 0 joue as de cœur.
86
+Le joueur 1 joue 2 de cœur.
87
+Le joueur 2 joue 4 de cœur.
88
+Le joueur 3 joue 6 de cœur.
89
+>>>>> Le joueur 3 remporte le pli avec la carte 6 de cœur ! <<<<<
90
+Le joueur 3 joue as de trèfle.
91
+Le joueur 0 joue 9 de trèfle.
92
+Le joueur 1 joue 2 de trèfle.
93
+Le joueur 2 joue 3 de trèfle.
94
+>>>>> Le joueur 0 remporte le pli avec la carte 9 de trèfle ! <<<<<
95
+Le joueur 0 joue as de pique.
96
+Le joueur 1 joue 9 de pique.
97
+Le joueur 2 joue 10 de pique.
98
+Le joueur 3 joue 5 de pique.
99
+>>>>> Le joueur 2 remporte le pli avec la carte 10 de pique ! <<<<<
100
+Le joueur 2 joue 3 de carreau.
101
+Le joueur 3 joue 2 de carreau.
102
+Le joueur 0 joue 4 de carreau.
103
+Le joueur 1 joue 10 de carreau.
104
+>>>>> Le joueur 1 remporte le pli avec la carte 10 de carreau ! <<<<<
105
+Le joueur 1 joue excuse.
106
+Le joueur 2 joue 4 de trèfle.
107
+Le joueur 3 joue 8 de trèfle.
108
+Le joueur 0 joue valet de trèfle.
109
+>>>>> Le joueur 0 remporte le pli avec la carte valet de trèfle ! <<<<<
110
+Le joueur 0 joue 2 de pique.
111
+Le joueur 1 joue petit.
112
+Le joueur 2 joue dame de pique.
113
+Le joueur 3 joue 8 de pique.
114
+>>>>> Le joueur 1 remporte le pli avec la carte petit ! <<<<<
115
+Le joueur 1 joue 5 de trèfle.
116
+Le joueur 2 joue 6 de trèfle.
117
+Le joueur 3 joue roi de trèfle.
118
+Le joueur 0 joue 5 d'atout.
119
+>>>>> Le joueur 0 remporte le pli avec la carte 5 d'atout ! <<<<<
120
+Le joueur 0 joue 3 de cœur.
121
+Le joueur 1 joue 7 de cœur.
122
+Le joueur 2 joue 5 de cœur.
123
+Le joueur 3 joue 9 de cœur.
124
+>>>>> Le joueur 3 remporte le pli avec la carte 9 de cœur ! <<<<<
125
+Le joueur 3 joue 7 de carreau.
126
+Le joueur 0 joue 6 de carreau.
127
+Le joueur 1 joue 8 d'atout.
128
+Le joueur 2 joue 9 de carreau.
129
+>>>>> Le joueur 1 remporte le pli avec la carte 8 d'atout ! <<<<<
130
+Le joueur 1 joue 8 de cœur.
131
+Le joueur 2 joue 2 d'atout.
132
+Le joueur 3 joue 10 de cœur.
133
+Le joueur 0 joue 12 d'atout.
134
+>>>>> Le joueur 0 remporte le pli avec la carte 12 d'atout ! <<<<<
135
+Le joueur 0 joue 3 de pique.
136
+Le joueur 1 joue 9 d'atout.
137
+Le joueur 2 joue roi de pique.
138
+Le joueur 3 joue cavalier de pique.
139
+>>>>> Le joueur 1 remporte le pli avec la carte 9 d'atout ! <<<<<
140
+Le joueur 1 joue 10 de trèfle.
141
+Le joueur 2 joue 7 de trèfle.
142
+Le joueur 3 joue 3 d'atout.
143
+Le joueur 0 joue 14 d'atout.
144
+>>>>> Le joueur 0 remporte le pli avec la carte 14 d'atout ! <<<<<
145
+Le joueur 0 joue 4 de pique.
146
+Le joueur 1 joue 16 d'atout.
147
+Le joueur 2 joue 6 d'atout.
148
+Le joueur 3 joue 13 d'atout.
149
+>>>>> Le joueur 1 remporte le pli avec la carte 16 d'atout ! <<<<<
150
+Le joueur 1 joue valet de cœur.
151
+Le joueur 2 joue 11 d'atout.
152
+Le joueur 3 joue dame de cœur.
153
+Le joueur 0 joue 6 de pique.
154
+>>>>> Le joueur 2 remporte le pli avec la carte 11 d'atout ! <<<<<
155
+Le joueur 2 joue valet de carreau.
156
+Le joueur 3 joue roi de carreau.
157
+Le joueur 0 joue 8 de carreau.
158
+Le joueur 1 joue 19 d'atout.
159
+>>>>> Le joueur 1 remporte le pli avec la carte 19 d'atout ! <<<<<
160
+Le joueur 1 joue cavalier de cœur.
161
+Le joueur 2 joue 15 d'atout.
162
+Le joueur 3 joue 17 d'atout.
163
+Le joueur 0 joue 7 de pique.
164
+>>>>> Le joueur 3 remporte le pli avec la carte 17 d'atout ! <<<<<
165
+Le joueur 3 joue 18 d'atout.
166
+plus haut atout joué: 18
167
+Le joueur 0 joue valet de pique.
168
+plus haut atout joué: 18
169
+Le joueur 1 joue dame de trèfle.
170
+plus haut atout joué: 18
171
+Le joueur 2 joue 21 d'atout.
172
+>>>>> Le joueur 2 remporte le pli avec la carte 21 d'atout ! <<<<<
173
+Le joueur 2 joue dame de carreau.
174
+Le joueur 3 joue 20 d'atout.
175
+Le joueur 0 joue cavalier de carreau.
176
+Le joueur 1 joue roi de cœur.
177
+>>>>> Le joueur 3 remporte le pli avec la carte 20 d'atout ! <<<<<

+ 1 - 0
src/card.rs

@@ -200,6 +200,7 @@ impl fmt::Display for Card {
200 200
 impl Ord for Card {
201 201
     fn cmp(&self, card: &Card) -> Ordering {
202 202
         match (self, card) {
203
+            (&Card::Fool, &Card::Fool) => Ordering::Equal,
203 204
             (&Card::Fool, _) => Ordering::Less,
204 205
             (_, &Card::Fool) => Ordering::Greater,
205 206
             (&Card::Trump(_), &Card::Face(_)) => Ordering::Greater,

+ 127 - 9
src/game.rs

@@ -43,7 +43,8 @@ pub fn start_game(_: &deck::Hand, mut players: &mut Vec<Player>) {
43 43
             panic!("the players don't have the same number of cards")
44 44
         }
45 45
     }
46
-    let mut starting_player_id = 1;
46
+    let mut starting_player_id = 0;
47
+    println!("===== Début de la partie ! =====");
47 48
     for _ in 0..cards_per_player {
48 49
         // For each round of the game
49 50
         let mut cards_played: Heap = Vec::new();
@@ -54,33 +55,150 @@ pub fn start_game(_: &deck::Hand, mut players: &mut Vec<Player>) {
54 55
         }
55 56
         // Decide who has won
56 57
         starting_player_id = winning_player(&mut cards_played);
58
+        let last_card_played = match cards_played.first() {
59
+            None => panic!("no card played this round"),
60
+            Some(card) => card,
61
+        };
62
+        println!(">>>>> Le joueur {} remporte le pli avec la carte {} ! <<<<<",
63
+                 last_card_played.1,
64
+                 last_card_played.0);
57 65
     }
58 66
 }
59 67
 
68
+// Keeps the order of the game but puts starting player first
60 69
 fn sort_by_playing_order(mut players: &mut Vec<Player>, starting_player_id: i32) {
70
+    // Implementation via a sort with a complicated comparison function
71
+    // that assume that ids go from 0 to params::NUMBER_OF_PLAYERS-1
61 72
     players.sort_by(|p1, p2| {
62
-        (p1.id + starting_player_id % params::NUMBER_OF_PLAYERS as i32)
63
-            .cmp(&(p2.id + starting_player_id % params::NUMBER_OF_PLAYERS as i32))
73
+        ((params::NUMBER_OF_PLAYERS as i32 + p1.id - starting_player_id) %
74
+         params::NUMBER_OF_PLAYERS as i32)
75
+            .cmp(&((params::NUMBER_OF_PLAYERS as i32 + p2.id - starting_player_id) %
76
+                   params::NUMBER_OF_PLAYERS as i32))
64 77
     });
65 78
 }
66 79
 
67 80
 fn play_card(player: &mut Player, cards_played: &mut Heap) {
68
-    let valid_cards = valid_cards(&player.hand, cards_played);
81
+    let valid_cards = valid_cards(&player, cards_played);
69 82
     let card = select_card(player, &valid_cards, cards_played);
70 83
     player.hand.remove(&card);
71 84
     cards_played.push((card, player.id));
85
+    println!("Le joueur {} joue {}.", player.id, card);
72 86
 }
73 87
 
74
-fn valid_cards(hand: &deck::Hand, cards_played: &Heap) -> deck::Hand {
75
-    unimplemented!();
88
+fn valid_cards(player: &Player, cards_played: &Heap) -> deck::Hand {
89
+    let valid_hand = player.hand.clone();
90
+    match cards_played.first() {
91
+        // If first to play then every card is valid
92
+        None => return valid_hand,
93
+        Some(&(card, _)) => {
94
+            match card {
95
+                // If fool played first you can play what you want
96
+                card::Card::Fool => {
97
+                    let mut new_cards_played = cards_played.clone();
98
+                    let _ = new_cards_played.remove(0);
99
+                    return valid_cards(player, &new_cards_played);
100
+                }
101
+                // If it's a trump you can play only higher trumps,
102
+                // otherwise lower trumps, otherwise anything
103
+                card::Card::Trump(_) => {
104
+                    let max_trump_played = max_trump(cards_played);
105
+                    let higher_trumps: deck::Hand = valid_hand.iter()
106
+                        .map(|&card| card.clone())
107
+                        .filter(|&card| match card {
108
+                            card::Card::Trump(this_trump) => max_trump_played < this_trump,
109
+                            _ => false,
110
+                        })
111
+                        .collect();
112
+                    if !higher_trumps.is_empty() {
113
+                        return higher_trumps;
114
+                    } else {
115
+                        // Play a lower trump
116
+                        let lower_trumps: deck::Hand = valid_hand.iter()
117
+                            .map(|&card| card.clone())
118
+                            .filter(|&card| match card {
119
+                                card::Card::Trump(this_trump) => max_trump_played > this_trump,
120
+                                _ => false,
121
+                            })
122
+                            .collect();
123
+                        if !lower_trumps.is_empty() {
124
+                            return lower_trumps;
125
+                        } else {
126
+                            // Play anaything
127
+                            return valid_hand;
128
+                        }
129
+                    }
130
+                }
131
+                // If it's a face you can only play a face of the same suit, otherwise a trump,
132
+                // otherwise anything
133
+                card::Card::Face(card::Face { suit, symbol: _ }) => {
134
+                    let same_suit_faces: deck::Hand = valid_hand.iter()
135
+                        .map(|&card| card.clone())
136
+                        .filter(|&card| match card {
137
+                            card::Card::Face(card::Face { suit: this_suit, symbol: _ }) => {
138
+                                suit == this_suit
139
+                            }
140
+                            _ => false,
141
+                        })
142
+                        .collect();
143
+                    if !same_suit_faces.is_empty() {
144
+                        return same_suit_faces;
145
+                    } else {
146
+                        // Play a trump
147
+                        let trumps: deck::Hand = valid_hand.iter()
148
+                            .map(|&card| card.clone())
149
+                            .filter(|&card| match card {
150
+                                card::Card::Trump(_) => true,
151
+                                _ => false,
152
+                            })
153
+                            .collect();
154
+                        if !trumps.is_empty() {
155
+                            return trumps;
156
+                        } else {
157
+                            //Play anything
158
+                            return valid_hand;
159
+                        }
160
+                    }
161
+                }
162
+            }
163
+        }
164
+    }
76 165
 }
77 166
 
78
-fn select_card(player: &Player, valid_cards: &deck::Hand, cards_played: &Heap) -> card::Card {
79
-    unimplemented!();
167
+// Returns the max trump in a heap of played cards, panics if no trump
168
+fn max_trump(cards_played: &Heap) -> card::Trump {
169
+    let mut max_trump: Option<card::Trump> = None;
170
+    for &(card, _) in cards_played.iter() {
171
+        match card {
172
+            card::Card::Trump(trump) => {
173
+                match max_trump {
174
+                    None => max_trump = Some(trump),
175
+                    Some(max) => {
176
+                        if max < trump {
177
+                            max_trump = Some(trump);
178
+                        }
179
+                    }
180
+                }
181
+            }
182
+            _ => (),
183
+        }
184
+    }
185
+    match max_trump {
186
+        None => panic!("no trump, cannot find max"),
187
+        Some(max) => max,
188
+    }
189
+}
190
+
191
+// Select a card to play among the valid cards
192
+fn select_card(_: &Player, valid_cards: &deck::Hand, _: &Heap) -> card::Card {
193
+    match valid_cards.iter().next() {
194
+        None => panic!("no valid card to play"),
195
+        Some(card) => card.clone(),
196
+    }
80 197
 }
81 198
 
199
+// Determine who won the round
82 200
 fn winning_player(cards: &mut Heap) -> i32 {
83
-    cards.sort_by(|&(card1, _), &(card2, _)| card1.cmp(&card2));
201
+    cards.sort_by(|&(card1, _), &(card2, _)| card2.cmp(&card1));
84 202
     match cards.first() {
85 203
         Some(&(_, id)) => id,
86 204
         None => panic!("no cards have been played"),