compiled gerade, daher zwischendurch commit

This commit is contained in:
mux 2024-08-13 22:07:23 +02:00
parent 3f905dca89
commit 02483cc6ac

View File

@ -1,9 +1,6 @@
extern crate rand; extern crate rand;
use std::{ use std::{
arch::global_asm, arch::global_asm, clone, io::{ prelude::*, BufReader, BufWriter, WriterPanicked }, net::{ TcpListener, TcpStream }, usize, vec
io::{ prelude::*, BufReader, BufWriter, WriterPanicked },
net::{ TcpListener, TcpStream },
usize,
}; };
use rand::Rng; use rand::Rng;
@ -42,6 +39,7 @@ impl PlayerConnection<'_> {
struct Card { struct Card {
value: CardValue, value: CardValue,
color: CardColors, color: CardColors,
color_change : CardColors,
} }
impl PartialEq for Card{ impl PartialEq for Card{
@ -69,7 +67,7 @@ impl PartialEq for CardColors{
impl Clone for Card { impl Clone for Card {
fn clone(&self) -> Self { 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)] #[derive(Clone)]
@ -99,30 +97,97 @@ impl PartialEq for CardValue{
pub struct GameState<'a>{ pub struct GameState<'a>{
pub turns : u64, pub turns : u64,
pub current_turn : PlayerState<'a>, pub current_turn : u32,
deck : Deck, deck : Deck,
trash : Deck,
pub current_card : Card, pub current_card : Card,
player_states : Vec<PlayerState<'a>>, player_states : Vec<PlayerState<'a>>,
player_connections : Vec<PlayerConnection<'a>>, player_connections : Vec<PlayerConnection<'a>>,
pub current_color : CardColors, pub current_color : CardColors,
pub current_direction : Direction, pub current_direction : Direction,
pub plus_twos : u32,
} }
impl GameState<'_>{ impl GameState<'_>{
pub fn next_turn(game : GameState) -> GameState{
return game; fn play(player : &mut PlayerState, card_to_be_played : Card) -> Result<Card, String>{
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<String, String>{
if self.turns == 0 {
let mut players : Vec<PlayerState> = 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<PlayerState<'a>>, player_connections: Vec<PlayerConnection<'a>>) -> GameState<'a>{ fn new_game_helper<'a>(player_states: Vec<PlayerState<'a>>, player_connections: Vec<PlayerConnection<'a>>) -> GameState<'a>{
GameState{ GameState{
turns : 0, turns : 0,
current_turn : player_states[0].clone(), current_turn : 0,
deck : GameState::base_deck(), deck : GameState::base_deck(),
current_card : Card{ value : CardValue::ZERO, color : CardColors::RED,}, trash : vec![],
player_states : player_states.clone(), current_card : Card{ value : CardValue::ZERO, color : CardColors::RED, color_change: CardColors::BLACK,},
player_states : player_states.clone(),
player_connections : player_connections, player_connections : player_connections,
current_color : CardColors::RED, current_color : CardColors::RED,
current_direction : Direction::CLOCKWISE, current_direction : Direction::CLOCKWISE,
plus_twos : 0,
} }
} }
@ -140,7 +205,7 @@ impl GameState<'_>{
return currently_held; return currently_held;
} }
fn reset_deck(&mut self, currently_held : Vec<Card>) -> Deck{ pub fn reset_deck(&mut self, currently_held : Vec<Card>) -> Deck{
self.deck = GameState::base_deck(); self.deck = GameState::base_deck();
for current_cart in currently_held{ for current_cart in currently_held{
self.deck.remove(self.deck.iter().position(|x| *x == current_cart).expect("game integrity compromised")); 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<Card>{ fn base_deck()-> Vec<Card>{
let mut deck : 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 //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 //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 //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//REVERSE //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//SKIP //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//NINE //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//EIGHT //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//SEVEN //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//SIX //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//FIVE //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//FOUR //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//THREE //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//TWO //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//ONE //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::RED, color_change : CardColors::BLACK})};
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::BLUE, color_change : CardColors::BLACK})};
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::GREEN, color_change : CardColors::BLACK})};
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::YELLOW, color_change : CardColors::BLACK})};
//ZERO //ZERO
deck.push(Card{ value : CardValue::ZERO, color : CardColors::RED}); deck.push(Card{ value : CardValue::ZERO, color : CardColors::RED, color_change : CardColors::BLACK});
deck.push(Card{ value : CardValue::ZERO, color : CardColors::BLUE}); deck.push(Card{ value : CardValue::ZERO, color : CardColors::BLUE, color_change : CardColors::BLACK});
deck.push(Card{ value : CardValue::ZERO, color : CardColors::GREEN}); deck.push(Card{ value : CardValue::ZERO, color : CardColors::GREEN, color_change : CardColors::BLACK});
deck.push(Card{ value : CardValue::ZERO, color : CardColors::YELLOW}); deck.push(Card{ value : CardValue::ZERO, color : CardColors::YELLOW, color_change : CardColors::BLACK}); */
return deck; return deck;
} }
fn get_cards(&mut self, count : u32) -> Vec<Card>{ pub fn get_cards(&mut self, count : u32) -> Vec<Card>{
let mut cards_drawn = vec![]; let mut cards_drawn = vec![];
for _ in 0..count{ for _ in 0..count{
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
@ -243,6 +323,7 @@ impl GameState<'_>{
player.cards.append(&mut cards_drawn); player.cards.append(&mut cards_drawn);
} }
} }
enum Direction { enum Direction {