1 use std
::cmp
::{ Ordering
, PartialOrd
};
2 use rand
::{thread_rng
, Rng
};
3 use rand
::distributions
::{Distribution
, Uniform
};
5 #[derive(PartialEq, Debug, Clone)]
14 impl PartialOrd
for Card
{
15 fn partial_cmp(&self, other
: &Self) -> Option
<Ordering
> {
17 return Some(Ordering
::Equal
);
20 let figures
= vec
![Card
::As
, Card
::King
, Card
::Queen
, Card
::Jack
];
22 for figure
in figures
{
24 return Some(Ordering
::Greater
);
27 return Some(Ordering
::Less
);
32 (Card
::Value(self_val
), Card
::Value(other_val
)) => self_val
.partial_cmp(other_val
),
39 fn create_deck() -> Vec
<Card
> {
40 let mut deck
: Vec
<Card
> = vec
![];
43 deck
.push(Card
::King
);
44 deck
.push(Card
::Queen
);
45 deck
.push(Card
::Jack
);
47 deck
.push(Card
::Value(v
));
53 fn shuffle_deck(deck
: &mut Vec
<Card
>) {
54 let mut rng
= thread_rng();
57 let mut new_deck
= Vec
::<Card
>::new();
60 let deck_range
= Uniform
::new(0, deck
.len());
61 let pos
= deck_range
.sample(&mut rng
);
62 new_deck
.push(deck
[pos
].clone());
66 std
::mem
::swap(deck
, &mut new_deck
);
75 fn new(deck
: &[Card
]) -> Self {
76 Player
{ deck
: deck
.to_vec(), captured
: Vec
::new() }
79 fn draw(&mut self) -> Option
<Card
> {
80 if self.deck
.len() == 0 {
81 if self.captured
.len() == 0 { return None
}
82 std
::mem
::swap(&mut self.deck
, &mut self.captured
);
83 shuffle_deck(&mut self.deck
);
86 Some(self.deck
.pop().unwrap())
89 fn add(&mut self, cards
: &[Card
]) {
90 self.captured
.append(&mut cards
.to_vec());
95 let mut current_turn
= 0u32;
97 let mut deck
= create_deck();
98 shuffle_deck(&mut deck
);
100 let mut player1
= Player
::new(&deck
[0..deck
.len() / 2]);
101 let mut player2
= Player
::new(&deck
[deck
.len() / 2 .. deck
.len()]);
103 let mut face_down
= Vec
::<Card
>::new();
109 println!("nb card: {}", player1.deck.len() + player2.deck.len() + player1.captured.len() + player2.captured.len() + face_down.len());
110 println!("Player 1: {}", player1.deck.len() + player1.captured.len());
111 println!("Player 2: {}", player2.deck.len() + player2.captured.len());
112 println!("Face down: {}", face_down.len());
113 println!("---------");
116 match (player1
.draw(), player2
.draw()) {
117 (Some(c1
), Some(c2
)) =>
119 player1
.add(&vec
![c1
, c2
]);
120 if face_down
.len() > 0 {
121 player1
.add(&face_down
);
125 player2
.add(&vec
![c1
, c2
]);
126 if face_down
.len() > 0 {
127 player2
.add(&face_down
);
133 match (player1
.draw(), player2
.draw()) {
134 (Some(c3
), Some(c4
)) => {
150 println!("Bataille simulator");
153 let time_per_turn
= 5.0; // [s].
160 let nb_of_turns
= (sum
as f64) / (n
as f64);
161 println!("Nb turn: {}, time: {} min", nb_of_turns
, nb_of_turns
* time_per_turn
/ 60.0);
169 fn test_card_comparisons() {
170 assert!(Card
::As
== Card
::As
);
171 assert!(Card
::King
== Card
::King
);
172 assert!(Card
::Queen
== Card
::Queen
);
173 assert!(Card
::Jack
== Card
::Jack
);
174 assert!(Card
::Value(10) == Card
::Value(10));
175 assert!(Card
::Value(2) == Card
::Value(2));
176 assert!(Card
::As
> Card
::King
);
177 assert!(Card
::As
> Card
::Queen
);
178 assert!(Card
::As
> Card
::Jack
);
179 assert!(Card
::As
> Card
::Value(10));
180 assert!(Card
::King
> Card
::Queen
);
181 assert!(Card
::King
> Card
::Jack
);
182 assert!(Card
::King
> Card
::Value(10));
183 assert!(Card
::Queen
> Card
::Jack
);
184 assert!(Card
::Queen
> Card
::Value(10));
185 assert!(Card
::Jack
> Card
::Value(10));
186 assert!(Card
::Value(10) > Card
::Value(9));