Skip to content

Commit 7e6855f

Browse files
created dominoes program in Rust for practice
1 parent 04e82f8 commit 7e6855f

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed

Languages/Rust/dominoes.rs

+128
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
2+
use rand::prelude::*;
3+
4+
type Tile = [u8; 2];
5+
type Set = Vec<Tile>;
6+
type Game = Vec<Set>;
7+
8+
9+
struct Dominoes {
10+
highest_suit: u8,
11+
number_of_players: u8,
12+
}
13+
14+
impl Dominoes {
15+
fn get_set(&self)-> Set {
16+
let mut set: Set = Set::new();
17+
18+
let mut repeated_piece_index: u8 = 0;
19+
for left in 0..self.highest_suit + 1 {
20+
for right in 0..self.highest_suit + 1 {
21+
if right >= repeated_piece_index {
22+
let tile: Tile = [left, right];
23+
set.push(tile);
24+
}
25+
}
26+
repeated_piece_index += 1;
27+
}
28+
set
29+
}
30+
31+
fn get_number_of_pieces_per_player(&self) -> u8 {
32+
let suite: Set = self.get_set();
33+
let len: u8 = suite.len() as u8;
34+
len / self.number_of_players
35+
36+
}
37+
38+
fn get_game(&self) -> Game {
39+
let suite: Set = self.get_set();
40+
let number_of_pieces_per_player: u8 = self.get_number_of_pieces_per_player();
41+
let mut game: Game = Vec::new();
42+
43+
let mut rng: ThreadRng = rand::thread_rng();
44+
let mut nums: Vec<u8> = (0..suite.len() as u8).collect();
45+
nums.shuffle(&mut rng);
46+
47+
let mut counter: usize = 0;
48+
49+
for _player in 0..self.number_of_players {
50+
let mut set: Set = Set::new();
51+
for _hand in 0..usize::from(number_of_pieces_per_player) {
52+
let random_position: u8 = nums[counter];
53+
let tile: Tile = suite[usize::from(random_position)];
54+
set.push(tile);
55+
counter += 1;
56+
}
57+
game.push(set);
58+
59+
}
60+
game
61+
}
62+
}
63+
64+
fn main() {
65+
let dominoes: Dominoes = Dominoes{ highest_suit: 6, number_of_players: 4 };
66+
let game: Game = dominoes.get_game();
67+
68+
for index in 0..game.len() {
69+
println!("Player {:?} has this set of pieces: {:?}", index + 1, game[index]);
70+
println!();
71+
72+
}
73+
}
74+
75+
#[test]
76+
fn each_player_should_have_correct_number_of_pieces(){
77+
let dominoes: Dominoes = Dominoes{ highest_suit: 6, number_of_players: 4 };
78+
let players: Game = dominoes.get_game();
79+
80+
// Number of players
81+
assert_eq!(players.len(), 4);
82+
83+
let mut total: usize = 0;
84+
85+
for pieces in players {
86+
// Each player should have 7 pieces
87+
assert_eq!(pieces.len(), 7);
88+
total += pieces.len();
89+
90+
}
91+
92+
assert_eq!(total, 28);
93+
94+
95+
}
96+
97+
#[test]
98+
fn should_not_have_repeated_pieces() {
99+
let dominoes: Dominoes = Dominoes{ highest_suit: 6, number_of_players: 4 };
100+
let game: Game = dominoes.get_game();
101+
let mut flat_vector: Vec<u8> = Vec::new();
102+
103+
104+
for player in game{
105+
for tile in player{
106+
for value in tile {
107+
flat_vector.push(value);
108+
109+
}
110+
}
111+
}
112+
flat_vector.sort();
113+
114+
let mut expected: Vec<u8> = Vec::new();
115+
116+
for value in 0..7 as u8 {
117+
for _index in 0..8 as u8{
118+
expected.push(value);
119+
}
120+
}
121+
122+
assert_eq!(expected, flat_vector);
123+
124+
}
125+
126+
127+
128+

0 commit comments

Comments
 (0)