From 02483cc6ac87c003319512916341e732ee494985 Mon Sep 17 00:00:00 2001 From: mux Date: Tue, 13 Aug 2024 22:07:23 +0200 Subject: [PATCH] compiled gerade, daher zwischendurch commit --- src/lib.rs | 217 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 149 insertions(+), 68 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ffe8703..3e1527d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,6 @@ extern crate rand; use std::{ - arch::global_asm, - io::{ prelude::*, BufReader, BufWriter, WriterPanicked }, - net::{ TcpListener, TcpStream }, - usize, + arch::global_asm, clone, io::{ prelude::*, BufReader, BufWriter, WriterPanicked }, net::{ TcpListener, TcpStream }, usize, vec }; use rand::Rng; @@ -42,6 +39,7 @@ impl PlayerConnection<'_> { struct Card { value: CardValue, color: CardColors, + color_change : CardColors, } impl PartialEq for Card{ @@ -69,7 +67,7 @@ impl PartialEq for CardColors{ impl Clone for Card { fn clone(&self) -> Self { - Self { value: self.value.clone(), color: self.color.clone() } + Self { value: self.value.clone(), color: self.color.clone(), color_change: self.color_change.clone() } } } #[derive(Clone)] @@ -99,30 +97,97 @@ impl PartialEq for CardValue{ pub struct GameState<'a>{ pub turns : u64, - pub current_turn : PlayerState<'a>, + pub current_turn : u32, deck : Deck, + trash : Deck, pub current_card : Card, player_states : Vec>, player_connections : Vec>, pub current_color : CardColors, pub current_direction : Direction, + pub plus_twos : u32, } impl GameState<'_>{ - pub fn next_turn(game : GameState) -> GameState{ - return game; + + fn play(player : &mut PlayerState, card_to_be_played : Card) -> Result{ + if player.cards.contains(&card_to_be_played){ + return Ok(player.cards.remove(player.cards.iter().position(|x| *x == card_to_be_played).expect("game integrity compromised"))); + } + else { + return Err(String::from("Card not held by player")); + } + } + + fn check_if_legal(current_card : Card, card_to_be_played : Card, current_color : CardColors) -> bool{ + if card_to_be_played.color == CardColors::BLACK || card_to_be_played.color == current_color || card_to_be_played.value == current_card.value { + return true; + } else { + return false; + } + } + + pub fn next_turn<'a>(mut self, card_to_be_played : Card) -> Result{ + if self.turns == 0 { + let mut players : Vec = vec![]; + for player in &self.player_states{ + &mut players.push(player.to_owned()); + } + for mut player in &mut players{ + self.draw(&mut player, 7); + } + self.turns+=1; + + return Ok(String::from("Game initialized")); + } + if !GameState::check_if_legal(self.current_card.clone(), card_to_be_played.clone(), self.current_color.clone()){ + return Err(String::from("Please learn the rules at https://www.unorules.com/")); + } + + let card = self.current_card.clone(); + let card_value = card.value; + if card_value == CardValue::PLUS_TWO && card_to_be_played.value != CardValue::PLUS_TWO{ + let current_turn = self.current_turn; + let plus_twos = self.plus_twos*2; + let player = &mut self.player_states.clone(); + self.draw(player.get_mut(current_turn as usize).expect("game integrity compromised"), plus_twos) + } + else if card_value == CardValue::PLUS_TWO && 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; + } + return Ok(String::from("Next turn")); + } + if self.current_card.value == CardValue::PLUS_FOUR{ + let current_turn = self.current_turn as usize; + let mut player = self.player_states.clone(); + self.draw(player.get_mut(current_turn).expect("game integrity compromised"), 4); + } + else if card_value == CardValue::CHANGE_COLOR { + self.current_color = card_to_be_played.color_change; + } + else if card_value == CardValue::PLUS_FOUR{ + self.current_color = card_to_be_played.color; + + } + + self.turns+=1; + return Ok(String::from("Next turn")); } fn new_game_helper<'a>(player_states: Vec>, player_connections: Vec>) -> GameState<'a>{ - GameState{ + GameState{ turns : 0, - current_turn : player_states[0].clone(), + current_turn : 0, deck : GameState::base_deck(), - current_card : Card{ value : CardValue::ZERO, color : CardColors::RED,}, - player_states : player_states.clone(), + trash : vec![], + current_card : Card{ value : CardValue::ZERO, color : CardColors::RED, color_change: CardColors::BLACK,}, + player_states : player_states.clone(), player_connections : player_connections, current_color : CardColors::RED, current_direction : Direction::CLOCKWISE, + plus_twos : 0, } } @@ -140,7 +205,7 @@ impl GameState<'_>{ return currently_held; } - fn reset_deck(&mut self, currently_held : Vec) -> Deck{ + pub fn reset_deck(&mut self, currently_held : Vec) -> Deck{ self.deck = GameState::base_deck(); for current_cart in currently_held{ self.deck.remove(self.deck.iter().position(|x| *x == current_cart).expect("game integrity compromised")); @@ -151,80 +216,95 @@ impl GameState<'_>{ fn base_deck()-> Vec{ let mut deck : Deck = vec![]; + for color in [CardColors::BLACK, CardColors::BLUE, CardColors::GREEN, CardColors::RED, CardColors::YELLOW]{ + for value in [CardValue::CHANGE_COLOR, CardValue::EIGHT, CardValue::FIVE, CardValue::FOUR, CardValue::NINE, CardValue::ONE, CardValue::PLUS_FOUR, CardValue::PLUS_TWO, CardValue::REVERSE, CardValue::SEVEN, CardValue::SIX, CardValue::SKIP, CardValue::THREE, CardValue::TWO, CardValue::ZERO]{ + if ![CardValue::CHANGE_COLOR, CardValue::PLUS_FOUR].contains(&value) { + for _ in 0..1 {deck.push(Card{value : value.clone(), color : color.clone(), color_change : CardColors::BLACK})}; + } + else if value == CardValue::ZERO + { + deck.push(Card{value : value, color : color.clone(), color_change : CardColors::BLACK}); + } + else { + for _ in 0..4 {deck.push(Card {value : value.clone(), color : color.clone(), color_change : CardColors::BLACK})}; + } + + } + } //CHANGE COLOR - for _ in 0..3 {deck.push(Card {value : CardValue::CHANGE_COLOR, color : CardColors::BLACK,})}; + /* for _ in 0..3 {deck.push(Card {value : CardValue::CHANGE_COLOR, color : CardColors::BLACK, color_change : CardColors::BLACK})}; //PLUS FOUR - for _ in 0..3 {deck.push(Card{ value : CardValue::PLUS_FOUR, color : CardColors::BLACK})}; + for _ in 0..3 {deck.push(Card{ value : CardValue::PLUS_FOUR, color : CardColors::BLACK, color_change : CardColors::BLACK})}; //PLUS TWO - for _ in 0..1 {deck.push(Card{ value : CardValue::PLUS_TWO, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::PLUS_TWO, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::PLUS_TWO, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::PLUS_TWO, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::PLUS_TWO, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::PLUS_TWO, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::PLUS_TWO, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::PLUS_TWO, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //REVERSE - for _ in 0..1 {deck.push(Card{ value : CardValue::REVERSE, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::REVERSE, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::REVERSE, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::REVERSE, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::REVERSE, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::REVERSE, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::REVERSE, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::REVERSE, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //SKIP - for _ in 0..1 {deck.push(Card{ value : CardValue::SKIP, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::SKIP, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::SKIP, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::SKIP, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SKIP, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SKIP, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SKIP, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SKIP, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //NINE - for _ in 0..1 {deck.push(Card{ value : CardValue::NINE, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::NINE, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::NINE, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::NINE, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::NINE, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::NINE, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::NINE, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::NINE, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //EIGHT - for _ in 0..1 {deck.push(Card{ value : CardValue::EIGHT, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::EIGHT, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::EIGHT, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::EIGHT, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::EIGHT, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::EIGHT, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::EIGHT, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::EIGHT, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //SEVEN - for _ in 0..1 {deck.push(Card{ value : CardValue::SEVEN, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::SEVEN, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::SEVEN, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::SEVEN, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SEVEN, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SEVEN, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SEVEN, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SEVEN, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //SIX - for _ in 0..1 {deck.push(Card{ value : CardValue::SIX, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::SIX, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::SIX, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::SIX, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SIX, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SIX, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SIX, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::SIX, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //FIVE - for _ in 0..1 {deck.push(Card{ value : CardValue::FIVE, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::FIVE, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::FIVE, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::FIVE, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::FIVE, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::FIVE, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::FIVE, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::FIVE, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //FOUR - for _ in 0..1 {deck.push(Card{ value : CardValue::FOUR, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::FOUR, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::FOUR, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::FOUR, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::FOUR, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::FOUR, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::FOUR, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::FOUR, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //THREE - for _ in 0..1 {deck.push(Card{ value : CardValue::THREE, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::THREE, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::THREE, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::THREE, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::THREE, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::THREE, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::THREE, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::THREE, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //TWO - for _ in 0..1 {deck.push(Card{ value : CardValue::TWO, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::TWO, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::TWO, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::TWO, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::TWO, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::TWO, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::TWO, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::TWO, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //ONE - for _ in 0..1 {deck.push(Card{ value : CardValue::ONE, color : CardColors::RED})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::ONE, color : CardColors::BLUE})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::ONE, color : CardColors::GREEN})}; - for _ in 0..1 {deck.push(Card{ value : CardValue::ONE, color : CardColors::YELLOW})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::ONE, color : CardColors::RED, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::ONE, color : CardColors::BLUE, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::ONE, color : CardColors::GREEN, color_change : CardColors::BLACK})}; + for _ in 0..1 {deck.push(Card{ value : CardValue::ONE, color : CardColors::YELLOW, color_change : CardColors::BLACK})}; //ZERO - deck.push(Card{ value : CardValue::ZERO, color : CardColors::RED}); - deck.push(Card{ value : CardValue::ZERO, color : CardColors::BLUE}); - deck.push(Card{ value : CardValue::ZERO, color : CardColors::GREEN}); - deck.push(Card{ value : CardValue::ZERO, color : CardColors::YELLOW}); + deck.push(Card{ value : CardValue::ZERO, color : CardColors::RED, color_change : CardColors::BLACK}); + deck.push(Card{ value : CardValue::ZERO, color : CardColors::BLUE, color_change : CardColors::BLACK}); + deck.push(Card{ value : CardValue::ZERO, color : CardColors::GREEN, color_change : CardColors::BLACK}); + deck.push(Card{ value : CardValue::ZERO, color : CardColors::YELLOW, color_change : CardColors::BLACK}); */ return deck; } - fn get_cards(&mut self, count : u32) -> Vec{ + pub fn get_cards(&mut self, count : u32) -> Vec{ let mut cards_drawn = vec![]; for _ in 0..count{ let mut rng = rand::thread_rng(); @@ -243,6 +323,7 @@ impl GameState<'_>{ player.cards.append(&mut cards_drawn); } + } enum Direction {