Make output optional

This commit is contained in:
hal8174 2025-07-12 19:18:21 +02:00
parent fad9798aed
commit ecec35b20f
Signed by: hal8174
SSH key fingerprint: SHA256:JwuqS+eVfISfKr+DkDQ6NWAbGd1jFAHkPpCM1yCnlTs
3 changed files with 28 additions and 16 deletions

View file

@ -9,7 +9,7 @@ fn compare(player_builders: &[Box<dyn PlayerBuilder>], games: usize) {
let r = (0..games) let r = (0..games)
.into_par_iter() .into_par_iter()
.map_init(SmallRng::from_entropy, |rng, _| { .map_init(SmallRng::from_entropy, |rng, _| {
herzen(player_builders, 0, rng) herzen::<false>(player_builders, 0, rng)
}) })
.fold( .fold(
|| vec![[0_u64; 13]; player_builders.len()], || vec![[0_u64; 13]; player_builders.len()],
@ -48,11 +48,11 @@ fn compare(player_builders: &[Box<dyn PlayerBuilder>], games: usize) {
fn main() { fn main() {
let player: Vec<Box<dyn PlayerBuilder>> = vec![ let player: Vec<Box<dyn PlayerBuilder>> = vec![
Box::new(player::random::Random { seed: 0 }), Box::new(player::highest::Highest {}),
Box::new(player::random::Random { seed: 0 }), Box::new(player::highest::Highest {}),
Box::new(player::random::Random { seed: 0 }), Box::new(player::highest::Highest {}),
Box::new(player::random::Random { seed: 0 }), Box::new(player::highest::Highest {}),
]; ];
compare(&player, 10000); compare(&player, 10000000);
} }

View file

@ -89,7 +89,7 @@ pub fn playeble(card: Card, hand: &[Card], stack_color: Option<Color>) -> bool {
} }
} }
pub fn herzen( pub fn herzen<const OUTPUT: bool>(
player_builders: &[Box<dyn PlayerBuilder>], player_builders: &[Box<dyn PlayerBuilder>],
starting_player: usize, starting_player: usize,
rng: &mut impl Rng, rng: &mut impl Rng,
@ -125,12 +125,16 @@ pub fn herzen(
for i in 0..hand_size { for i in 0..hand_size {
let mut stack = Vec::with_capacity(player.len()); let mut stack = Vec::with_capacity(player.len());
if OUTPUT {
println!("## Round {i}:"); println!("## Round {i}:");
}
for j in 0..player.len() { for j in 0..player.len() {
let index = (round_starting_player + j) % player.len(); let index = (round_starting_player + j) % player.len();
if OUTPUT {
println!("# Player {index}"); println!("# Player {index}");
}
let ai = AdditionalInformation {}; let ai = AdditionalInformation {};
@ -146,7 +150,9 @@ pub fn herzen(
hands[index].remove(card_index); hands[index].remove(card_index);
if OUTPUT {
println!("# Player {index} played {played_card:?}"); println!("# Player {index} played {played_card:?}");
}
stack.push(played_card); stack.push(played_card);
} }
@ -166,9 +172,11 @@ pub fn herzen(
let cost = stack.iter().map(|c| c.cost()).sum::<u8>(); let cost = stack.iter().map(|c| c.cost()).sum::<u8>();
if OUTPUT {
println!( println!(
"## Player {winner} takes the stack {stack:?} with {winning_card:?}, {cost} points" "## Player {winner} takes the stack {stack:?} with {winning_card:?}, {cost} points"
); );
}
points[winner] += cost; points[winner] += cost;
@ -178,13 +186,17 @@ pub fn herzen(
let remainder = &full_deck[hand_size * player.len()..]; let remainder = &full_deck[hand_size * player.len()..];
let remainder_cost = remainder.iter().map(|c| c.cost()).sum::<u8>(); let remainder_cost = remainder.iter().map(|c| c.cost()).sum::<u8>();
if OUTPUT {
println!( println!(
"## Player {round_starting_player} takes the remaining cards {remainder:?}, {remainder_cost} points" "## Player {round_starting_player} takes the remaining cards {remainder:?}, {remainder_cost} points"
); );
}
points[round_starting_player] += remainder_cost; points[round_starting_player] += remainder_cost;
if OUTPUT {
println!("## Game ended. Points: {points:?}"); println!("## Game ended. Points: {points:?}");
}
points points
} }

View file

@ -130,5 +130,5 @@ fn main() {
let mut rng = SmallRng::from_entropy(); let mut rng = SmallRng::from_entropy();
game::herzen(&player, 0, &mut rng); game::herzen::<true>(&player, 0, &mut rng);
} }