|
|
@@ -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
|