From 552b09730fdd15c2b6ba35f90784099c19a4bc40 Mon Sep 17 00:00:00 2001 From: mux Date: Mon, 2 Sep 2024 23:53:03 +0200 Subject: [PATCH] tbc --- src/uno_logic.rs | 90 +++++++++++++++++++++++++++------------------ src/uno_protocol.rs | 1 - 2 files changed, 54 insertions(+), 37 deletions(-) diff --git a/src/uno_logic.rs b/src/uno_logic.rs index b6e71ef..e2bc9cd 100644 --- a/src/uno_logic.rs +++ b/src/uno_logic.rs @@ -37,7 +37,6 @@ pub enum CardColor { BLUE, GREEN, YELLOW, - BLACK, } pub enum Direction { @@ -79,7 +78,6 @@ pub struct GameState<'a, S: Read + Write> { pub current_card: Card, pub player_states: Vec>, pub player_connections: Vec>, - pub current_color: CardColor, pub current_direction: Direction, plus_twos: u32, } @@ -153,7 +151,6 @@ impl CardValue { impl CardColor { pub fn to_string<'a>(self) -> &'a str { match self { - CardColor::BLACK => "BLACK", CardColor::BLUE => "BLUE", CardColor::GREEN => "GREEN", CardColor::YELLOW => "YELLOW", @@ -250,7 +247,6 @@ impl GameState<'_, S> where S: Read + Write { if GameState::::check_if_legal( self.current_card, card, - self.current_color ) { return true; @@ -281,11 +277,10 @@ impl GameState<'_, S> where S: Read + Write { fn check_if_legal( current_card: Card, card_to_be_played: Card, - current_color: CardColor ) -> bool { if - card_to_be_played.color == CardColor::BLACK || - card_to_be_played.color == current_color || + [CardValue::PLUS_FOUR,CardValue::CHANGE_COLOR].contains(&card_to_be_played.value) || + card_to_be_played.color == current_card.color || card_to_be_played.value == current_card.value { return true; @@ -316,7 +311,6 @@ impl GameState<'_, S> where S: Read + Write { ).get(0) .expect(&GAME_INTEGRITY_ERROR) .to_owned(), - self.current_color ){ self.next_player(); return TURN_RESULT::NEXT_TURN; @@ -336,7 +330,6 @@ impl GameState<'_, S> where S: Read + Write { !GameState::::check_if_legal( self.current_card, card_to_be_played, - self.current_color ) { return TURN_RESULT::REPEAT_TURN; @@ -358,8 +351,8 @@ impl GameState<'_, S> where S: Read + Write { card_to_be_played.value == CardValue::PLUS_TWO { self.plus_twos += 1; - if self.current_color != card_to_be_played.color { - self.current_color = card_to_be_played.color; + if self.current_card.color != card_to_be_played.color { + self.current_card.color = card_to_be_played.color; } let mut player = self.player_states.clone(); self.add_to_trash( @@ -374,14 +367,18 @@ impl GameState<'_, S> where S: Read + Write { return TURN_RESULT::NEXT_TURN; } - if self.current_card.value == CardValue::PLUS_FOUR { + if card_to_be_played.value == CardValue::PLUS_FOUR { let mut player = self.player_states.clone(); self.draw( player - .get_mut(self.current_turn as usize) + .get_mut((self.current_turn + 1) as usize) .expect(&GAME_INTEGRITY_ERROR).player_name, 4 ); + self.next_player(); + self.current_card = card_to_be_played; + self.turns += 1; + return TURN_RESULT::NEXT_TURN; } if card_to_be_played.value == CardValue::SKIP { @@ -418,7 +415,7 @@ impl GameState<'_, S> where S: Read + Write { } if [CardValue::CHANGE_COLOR, CardValue::PLUS_FOUR].contains(&card_to_be_played.value) { - self.current_color = card_to_be_played.color; + self.current_card.color = card_to_be_played.color; } else if [ CardValue::EIGHT, @@ -437,8 +434,8 @@ impl GameState<'_, S> where S: Read + Write { CardValue::PLUS_TWO, ].contains(&card_to_be_played.value) { - if card_to_be_played.color != self.current_color { - self.current_color = card_to_be_played.color; + if card_to_be_played.color != self.current_card.color { + self.current_card.color = card_to_be_played.color; } } @@ -469,7 +466,6 @@ impl GameState<'_, S> where S: Read + Write { current_card: Card { value: CardValue::ZERO, color: CardColor::RED }, player_states: player_states.clone(), player_connections: player_connections, - current_color: CardColor::RED, current_direction: Direction::CLOCKWISE, plus_twos: 0, } @@ -480,7 +476,6 @@ impl GameState<'_, S> where S: Read + Write { player_connections: Vec> ) -> GameState<'a, S> { let mut new_game = GameState::new_game_helper(player_states, player_connections); - new_game.current_color = new_game.current_card.color; return new_game; } @@ -509,7 +504,6 @@ impl GameState<'_, S> where S: Read + Write { let mut deck: Deck = vec![]; for color in [ - CardColor::BLACK, CardColor::BLUE, CardColor::GREEN, CardColor::RED, @@ -532,13 +526,13 @@ impl GameState<'_, S> where S: Read + Write { CardValue::REVERSE, CardValue::SKIP, ] { - if ![CardValue::CHANGE_COLOR, CardValue::PLUS_FOUR, CardValue::ZERO].contains(&value) && color != CardColor::BLACK { + if ![CardValue::CHANGE_COLOR, CardValue::PLUS_FOUR, CardValue::ZERO].contains(&value) { for _ in 0..2 { deck.push(Card { value: value, color: color }); } - } else if value == CardValue::ZERO && color != CardColor::BLACK{ + } else if value == CardValue::ZERO{ deck.push(Card { value: value, color: color }); - } else if [CardValue::CHANGE_COLOR, CardValue::PLUS_FOUR].contains(&value) && color == CardColor::BLACK { + } else if [CardValue::CHANGE_COLOR, CardValue::PLUS_FOUR].contains(&value) && color == CardColor::RED { for _ in 0..4 { deck.push(Card { value: value, color: color }); } @@ -647,6 +641,8 @@ impl GameState<'_, S> where S: Read + Write { mod tests { use std::{collections::{HashSet, VecDeque}, iter::Skip}; + use rand::random; + use super::*; fn get_card_set() -> Vec{ @@ -660,12 +656,15 @@ mod tests { } fn get_card(card_value : CardValue, card_color : CardColor) -> Card{ - for card in get_card_set(){ + let card_set = get_card_set(); + for card in &card_set{ if card_value == card.value && card_color == card.color { - return card; + return card.to_owned(); } } - return Card {value : CardValue::ZERO, color : CardColor::BLACK}; + let mut rng = rand::thread_rng(); + let n: usize = rng.gen_range(0..card_set.len()); + return card_set.get(n).unwrap().to_owned(); } fn get_test_gs<'a>() -> GameState<'a, VecDeque> { @@ -732,7 +731,6 @@ mod tests { let mut gs = get_test_gs(); //no moves gs.current_card = Card {value : CardValue::TWO, color : CardColor::GREEN}; - gs.current_color = CardColor::GREEN; let player = PlayerState::new("detlef", [get_card(CardValue::FOUR, CardColor::RED), get_card(CardValue::EIGHT, CardColor::YELLOW)].to_vec()); assert_eq!(gs.has_any_moves(player), false); } @@ -742,16 +740,16 @@ mod tests { let mut gs = get_test_gs(); //has moves gs.current_card = Card {value : CardValue::TWO, color : CardColor::GREEN}; - gs.current_color = CardColor::GREEN; let player = PlayerState::new("detlef", [get_card(CardValue::FOUR, CardColor::RED), get_card(CardValue::EIGHT, CardColor::GREEN)].to_vec()); + assert_eq!(gs.has_any_moves(player), true); } #[test] fn test_check_if_legal_false(){ //illegal let current_card = Card {value : CardValue::TWO, color : CardColor::GREEN}; - assert_eq!(GameState::>::check_if_legal(current_card, get_card(CardValue::FOUR, CardColor::RED), CardColor::GREEN), false); - assert_eq!(GameState::>::check_if_legal(current_card, get_card(CardValue::EIGHT, CardColor::YELLOW), CardColor::GREEN), false); + assert_eq!(GameState::>::check_if_legal(current_card, get_card(CardValue::FOUR, CardColor::RED)), false); + assert_eq!(GameState::>::check_if_legal(current_card, get_card(CardValue::EIGHT, CardColor::YELLOW)), false); } #[test] @@ -775,15 +773,19 @@ mod tests { assert_eq!(GameState::>::play(gs.player_states.get_mut(0).unwrap(),get_card(CardValue::EIGHT, CardColor::BLUE)), Err("Card not held by player".to_owned())); } + #[test] + fn test_draw(){ + + } + #[test] fn test_next_turn_green_two_to_red_two(){ let mut gs = get_test_gs(); gs.game_init(); gs.current_card = get_card(CardValue::TWO, CardColor::GREEN); - gs.current_color = CardColor::GREEN; gs.player_states.get_mut(0).unwrap().cards.push(get_card(CardValue::TWO, CardColor::RED)); assert_eq!(gs.next_turn(get_card(CardValue::TWO, CardColor::RED)), TURN_RESULT::NEXT_TURN); - assert_eq!(gs.current_color, CardColor::RED); + assert_eq!(gs.current_card.color, CardColor::RED); assert_eq!(gs.current_card, get_card(CardValue::TWO, CardColor::RED)); assert_eq!(gs.plus_twos, 0); assert_eq!(gs.turns, 2); @@ -795,10 +797,9 @@ mod tests { let mut gs = get_test_gs(); gs.game_init(); gs.current_card = get_card(CardValue::TWO, CardColor::GREEN); - gs.current_color = CardColor::GREEN; gs.player_states.get_mut(0).unwrap().cards.push(get_card(CardValue::FOUR, CardColor::YELLOW)); assert_eq!(gs.next_turn(get_card(CardValue::FOUR, CardColor::YELLOW)), TURN_RESULT::REPEAT_TURN); - assert_eq!(gs.current_color, CardColor::GREEN); + assert_eq!(gs.current_card.color, CardColor::GREEN); assert_eq!(gs.current_card, get_card(CardValue::TWO, CardColor::GREEN)); assert_eq!(gs.turns, 1); assert_eq!(gs.current_turn, 0); @@ -809,10 +810,9 @@ mod tests { let mut gs = get_test_gs(); gs.game_init(); gs.current_card = get_card(CardValue::TWO, CardColor::GREEN); - gs.current_color = CardColor::GREEN; gs.player_states.get_mut(0).unwrap().cards.push(get_card(CardValue::SKIP, CardColor::GREEN)); assert_eq!(gs.next_turn(get_card(CardValue::SKIP, CardColor::GREEN)), TURN_RESULT::NEXT_TURN); - assert_eq!(gs.current_color, CardColor::GREEN); + assert_eq!(gs.current_card.color, CardColor::GREEN); assert_eq!(gs.current_card, get_card(CardValue::SKIP, CardColor::GREEN)); assert_eq!(gs.turns, 2); assert_eq!(gs.current_turn, 2); @@ -820,7 +820,15 @@ mod tests { #[test] fn test_next_turn_green_two_to_plus_four(){ - + let mut gs = get_test_gs(); + gs.game_init(); + gs.current_card = get_card(CardValue::TWO, CardColor::GREEN); + gs.player_states.get_mut(0).unwrap().cards.push(get_card(CardValue::PLUS_FOUR, CardColor::BLUE)); + assert_eq!(gs.next_turn(get_card(CardValue::PLUS_FOUR, CardColor::BLUE)), TURN_RESULT::NEXT_TURN); + assert_eq!(gs.player_states.get(gs.current_turn as usize).unwrap().cards.len(), 11); + assert_eq!(gs.current_turn, 1); + assert_eq!(gs.current_card.color, CardColor::BLUE); + assert_eq!(gs.current_card, get_card(CardValue::PLUS_FOUR, CardColor::BLUE)); } #[test] @@ -832,4 +840,14 @@ mod tests { fn test_next_turn_green_two_to_change_color(){ } + + #[test] + fn test_next_turn_yellow_five_to_yello_three_last_card_no_uno(){ + + } + + #[test] + fn test_next_turn_yellow_five_to_yellow_three_last_card_yes_uno(){ + + } } diff --git a/src/uno_protocol.rs b/src/uno_protocol.rs index 901d5c1..abd8962 100644 --- a/src/uno_protocol.rs +++ b/src/uno_protocol.rs @@ -38,7 +38,6 @@ impl Turn{ fn get_color(card_color_line : &str) -> Result { match &card_color_line.split(":").collect::>().get(1).unwrap()[..] { - "BLACK" => Ok(CardColor::BLACK), "BLUE" => Ok(CardColor::BLUE), "GREEN" => Ok(CardColor::GREEN), "YELLOW" => Ok(CardColor::YELLOW),