structure of Game (very cool)
cargo devel CI / cargo CI (push) Failing after 38s Details

my commits are super professional
This commit is contained in:
Christoph J. Scherr 2024-03-21 11:17:01 +01:00
parent 8a38b9ec6f
commit 6c267b66a5
Signed by: cscherrNT
GPG Key ID: 8E2B45BC51A27EA7
9 changed files with 144 additions and 7 deletions

View File

@ -10,16 +10,25 @@ readme = "README.md"
homepage = "https://git.cscherr.de/PlexSheep/wordle-analyzer" homepage = "https://git.cscherr.de/PlexSheep/wordle-analyzer"
repository = "https://git.cscherr.de/PlexSheep/wordle-analyzer" repository = "https://git.cscherr.de/PlexSheep/wordle-analyzer"
keywords = ["wordle", "benchmark"] keywords = ["wordle", "benchmark"]
default-run = "wordle" default-run = "wordlec"
[features] [features]
default = ["game", "bench"] default = ["game", "bench", "tui"]
game = [] game = []
tui = ["game"]
bench = [] bench = []
[dependencies] [dependencies]
anyhow = "1.0.81"
clap = { version = "4.5.3", features = ["derive"] }
libpt = "0.4.2"
[[bin]] [[bin]]
name = "cliwordle" name = "wordlec"
path = "src/bin/cliwordle.rs" path = "src/bin/game/cli.rs"
required-features = ["game"] required-features = ["game"]
[[bin]]
name = "wordlet"
path = "src/bin/game/tui.rs"
required-features = ["tui", "game"]

0
src/bench/mod.rs Normal file
View File

View File

@ -1,3 +0,0 @@
fn main() {
unimplemented!();
}

39
src/bin/game/cli.rs Normal file
View File

@ -0,0 +1,39 @@
use clap::Parser;
use libpt::log::*;
use wordle_analyzer::{game,self};
#[derive(Parser, Clone, Debug)]
#[command(version, about, long_about, author)]
struct Cli {
/// precompute all possibilities for better performance at runtime
#[arg(short, long)]
precompute: bool,
/// how long should the word be?
#[arg(short, long, default_value_t = wordle_analyzer::DEFAULT_WORD_LENGTH)]
length: usize,
/// how many times can we guess?
#[arg(short, long, default_value_t = wordle_analyzer::DEFAULT_MAX_STEPS)]
max_steps: usize
}
fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
Logger::build_mini(Some(Level::TRACE))?;
debug!("dumping CLI: {:#?}", cli);
let game = game::Game::builder()
.length(cli.length)
.precompute(cli.precompute).build()?;
Ok(())
}
fn get_word(cli: &Cli) -> String {
let mut word = String::new();
todo!("get user input");
todo!("validate user input");
assert_eq!(word.len(), cli.length);
word
}

0
src/bin/game/tui.rs Normal file
View File

87
src/game/mod.rs Normal file
View File

@ -0,0 +1,87 @@
pub struct Game {
length: usize,
precompute: bool,
max_steps: usize,
step: usize,
solution: String
}
impl Game {
/// get a new [`GameBuilder`]
pub fn builder() -> GameBuilder {
GameBuilder::default()
}
/// Create a [Game] of wordle
///
/// This method will load the wordlist, determine if a word may be used as a solution for a
/// game, and select a solution at random.
///
/// It will also set a few values to their initial state.
///
/// Don't use this method directly, instead, make use of the [`GameBuilder`].
///
/// # Errors
///
/// This function will return an error if .
pub(crate) fn build(length: usize, precompute: bool, max_steps: usize) -> anyhow::Result<(Self)> {
let mut game = Game {
length, precompute, max_steps,
step: 0,
solution: String::default() // we actually set this later
};
// TODO: load wordlist of possible answers
// TODO: select one as a solution at random
// NOTE: The possible answers should be determined with a wordlist that has the
// frequencies/probabilities of the words. We then use a sigmoid function to determine if a
// word can be a solution based on that value. Only words above some threshold of
// commonness will be available as solutions then. Next, we choose one of the allowed words
// randomly.
todo!();
}
}
impl Default for Game {
fn default() -> Self {
GameBuilder::default()
.build()
.expect("could not build game with defaults")
}
}
pub struct GameBuilder {
length: usize,
precompute: bool,
max_steps: usize
}
impl GameBuilder {
/// build a [`Game`] with the stored configuration
pub fn build(self) -> anyhow::Result<Game> {
let game: Game = Game::build(self.length, self.precompute, self.max_steps)?;
Ok(game)
}
/// Sets the precompute of this [`GameBuilder`].
pub fn precompute(mut self, precompute: bool) -> Self {
self.precompute = precompute;
self
}
/// Sets the length of this [`GameBuilder`].
pub fn length(mut self, length: usize) -> Self {
self.length = length;
self
}
}
impl Default for GameBuilder {
fn default() -> Self {
Self {
length: super::DEFAULT_WORD_LENGTH,
precompute: false,
max_steps: super::DEFAULT_MAX_STEPS
}
}
}

View File

@ -0,0 +1,5 @@
pub const DEFAULT_WORD_LENGTH: usize = 5;
pub const DEFAULT_MAX_STEPS: usize = 6;
pub mod game;
pub mod solvers;

0
src/solvers/mod.rs Normal file
View File

0
src/solvers/naive/mod.rs Normal file
View File