Kaynağa Gözat

Fixed bug tied to rule: when you play trump on a first face, your trump must be higher than those already played

Denis Merigoux 9 yıl önce
ebeveyn
işleme
2ce4783722
1 değiştirilmiş dosya ile 32 ekleme ve 13 silme
  1. 32 13
      src/game.rs

+ 32 - 13
src/game.rs

@@ -101,7 +101,10 @@ fn valid_cards(player: &Player, cards_played: &Heap) -> deck::Hand {
101 101
                 // If it's a trump you can play only higher trumps,
102 102
                 // otherwise lower trumps, otherwise anything
103 103
                 card::Card::Trump(_) => {
104
-                    let max_trump_played = max_trump(cards_played);
104
+                    let max_trump_played = match max_trump(cards_played) {
105
+                        Some(trump) => trump,
106
+                        None => panic!("this shouldn't happen"),
107
+                    };
105 108
                     let higher_trumps: deck::Hand = valid_hand.iter()
106 109
                         .map(|&card| card.clone())
107 110
                         .filter(|&card| match card {
@@ -143,19 +146,38 @@ fn valid_cards(player: &Player, cards_played: &Heap) -> deck::Hand {
143 146
                     if !same_suit_faces.is_empty() {
144 147
                         return same_suit_faces;
145 148
                     } else {
146
-                        // Play a trump
147
-                        let trumps: deck::Hand = valid_hand.iter()
149
+                        // Play a trump higher than those alreay played
150
+                        let max_trump_played = max_trump(cards_played);
151
+                        let valid_trumps: deck::Hand = valid_hand.iter()
148 152
                             .map(|&card| card.clone())
149 153
                             .filter(|&card| match card {
150
-                                card::Card::Trump(_) => true,
154
+                                card::Card::Trump(trump1) => {
155
+                                    match max_trump_played {
156
+                                        Some(trump2) => trump1 > trump2,
157
+                                        None => true,
158
+                                    }
159
+                                }
151 160
                                 _ => false,
152 161
                             })
153 162
                             .collect();
154
-                        if !trumps.is_empty() {
155
-                            return trumps;
163
+                        if !valid_trumps.is_empty() {
164
+                            return valid_trumps;
156 165
                         } else {
157
-                            //Play anything
158
-                            return valid_hand;
166
+                            // Play any other trump
167
+                            let trumps: deck::Hand = valid_hand.iter()
168
+                                .map(|&card| card.clone())
169
+                                .filter(|&card| match card {
170
+                                    card::Card::Trump(_) => true,
171
+                                    _ => false,
172
+                                })
173
+                                .collect();
174
+                            if !trumps.is_empty() {
175
+                                return trumps;
176
+                            } else {
177
+
178
+                                //Play anything
179
+                                return valid_hand;
180
+                            }
159 181
                         }
160 182
                     }
161 183
                 }
@@ -165,7 +187,7 @@ fn valid_cards(player: &Player, cards_played: &Heap) -> deck::Hand {
165 187
 }
166 188
 
167 189
 // Returns the max trump in a heap of played cards, panics if no trump
168
-fn max_trump(cards_played: &Heap) -> card::Trump {
190
+fn max_trump(cards_played: &Heap) -> Option<card::Trump> {
169 191
     let mut max_trump: Option<card::Trump> = None;
170 192
     for &(card, _) in cards_played.iter() {
171 193
         match card {
@@ -182,10 +204,7 @@ fn max_trump(cards_played: &Heap) -> card::Trump {
182 204
             _ => (),
183 205
         }
184 206
     }
185
-    match max_trump {
186
-        None => panic!("no trump, cannot find max"),
187
-        Some(max) => max,
188
-    }
207
+    max_trump
189 208
 }
190 209
 
191 210
 // Select a card to play among the valid cards