Sfoglia il codice sorgente

Starting to implement game

Denis Merigoux 9 anni fa
parent
commit
77b15a8800
3 ha cambiato i file con 34 aggiunte e 14 eliminazioni
  1. 3 0
      src/deck.rs
  2. 25 8
      src/game.rs
  3. 6 6
      src/main.rs

+ 3 - 0
src/deck.rs

@@ -30,6 +30,9 @@ pub fn new_deck() -> Deck {
30 30
 pub fn distribute_cards(deck: &Deck) -> (Hand, Vec<Hand>) {
31 31
     let mut dog: Hand = BTreeSet::new();
32 32
     let mut hands: Vec<Hand> = Vec::new();
33
+    for _ in 0..(params::NUMBER_OF_PLAYERS) {
34
+        hands.push(BTreeSet::new())
35
+    }
33 36
     for i in 0..deck.len() {
34 37
         if i < params::DOG_SIZE {
35 38
             dog.insert(deck[i]);

+ 25 - 8
src/game.rs

@@ -1,20 +1,22 @@
1 1
 use params;
2 2
 use deck;
3 3
 use card;
4
-use std::collections::BTreeSet;
5 4
 
6
-type Heap = Vec<card::Card>;
5
+type Heap = Vec<(card::Card, i32)>;
6
+
7
+#[derive(Clone)]
7 8
 pub struct Player {
8 9
     pub id: i32,
9 10
     pub name: String,
10 11
     pub hand: deck::Hand,
11 12
 }
12 13
 
14
+// Empty the hands and names vector and creates a player vector instead
13 15
 pub fn initialize_players(hands: &mut Vec<deck::Hand>, names: &mut Vec<String>) -> Vec<Player> {
14 16
     if hands.len() != names.len() {}
15 17
     let mut counter = 0;
16 18
     let mut players = Vec::new();
17
-    for i in 0..hands.len() {
19
+    for _ in 0..hands.len() {
18 20
         let name = match names.pop() {
19 21
             Some(name) => name,
20 22
             None => panic!("the number of hands is different from the number of players"),
@@ -33,7 +35,7 @@ pub fn initialize_players(hands: &mut Vec<deck::Hand>, names: &mut Vec<String>)
33 35
     players
34 36
 }
35 37
 
36
-pub fn start_game(dog: &deck::Hand, players: &mut Vec<Player>) {
38
+pub fn start_game(_: &deck::Hand, mut players: &mut Vec<Player>) {
37 39
     let cards_per_player = players[0].hand.len();
38 40
     //Check if all players have same number of cards
39 41
     for i in 1..params::NUMBER_OF_PLAYERS {
@@ -41,10 +43,25 @@ pub fn start_game(dog: &deck::Hand, players: &mut Vec<Player>) {
41 43
             panic!("the players don't have the same number of cards")
42 44
         }
43 45
     }
44
-    for i in 0..cards_per_player {
45
-        for player in players.iter_mut() {}
46
+    let mut starting_player_id = 1;
47
+    for _ in 0..cards_per_player {
48
+        // For each round of the game
49
+        let mut cards_played: Heap = Vec::new();
50
+        sort_by_playing_order(&mut players, starting_player_id);
51
+        for player in players.iter_mut() {
52
+            // For each player
53
+            play_card(player, &mut cards_played)
54
+        }
55
+        // Decide who has won
56
+        starting_player_id = winning_player(&cards_played);
46 57
     }
47
-    unimplemented!();
58
+}
59
+
60
+fn sort_by_playing_order(mut players: &mut Vec<Player>, starting_player_id: i32) {
61
+    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))
64
+    });
48 65
 }
49 66
 
50 67
 fn play_card(player: &mut Player, cards_played: &mut Heap) {
@@ -59,6 +76,6 @@ fn select_card(player: &Player, cards_played: &Heap) -> card::Card {
59 76
     unimplemented!();
60 77
 }
61 78
 
62
-fn winning_card(cards: &Heap) -> usize {
79
+fn winning_player(cards: &Heap) -> i32 {
63 80
     unimplemented!();
64 81
 }

+ 6 - 6
src/main.rs

@@ -10,20 +10,20 @@ pub const NUMBER_OF_PLAYERS: usize = 4;
10 10
 pub const CARDS_PER_DISTRIBUTION: usize = 3;
11 11
 
12 12
 fn main() {
13
+    let mut names: Vec<String> =
14
+        vec!["A".to_string(), "B".to_string(), "C".to_string(), "D".to_string()];
13 15
     let deck = deck::new_deck();
14 16
     let (dog, mut hands) = deck::distribute_cards(&deck);
17
+    let mut players = game::initialize_players(&mut hands, &mut names);
15 18
     println!("-> Cartes du chien :");
16 19
     for card in dog.iter() {
17 20
         println!("{}", card);
18 21
     }
19
-    for hand in hands.iter() {
20
-        println!("-> Cartes du joueur {}:", 0);
21
-        for card in hand.iter() {
22
+    for player in players.iter() {
23
+        println!("-> Cartes du joueur {}:", player.id);
24
+        for card in player.hand.iter() {
22 25
             println!("{}", card);
23 26
         }
24 27
     }
25
-    let mut names: Vec<String> =
26
-        vec!["A".to_string(), "B".to_string(), "C".to_string(), "D".to_string()];
27
-    let mut players = game::initialize_players(&mut hands, &mut names);
28 28
     game::start_game(&dog, &mut players);
29 29
 }