add jank auto player
This commit is contained in:
parent
c0a3f318b1
commit
5e73d7627e
|
@ -484,9 +484,12 @@ dependencies = [
|
||||||
name = "tidepool"
|
name = "tidepool"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"fish",
|
||||||
"mino",
|
"mino",
|
||||||
"rand",
|
"rand",
|
||||||
"rand_xoshiro",
|
"rand_xoshiro",
|
||||||
|
"tracing",
|
||||||
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -497,9 +500,21 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
|
"tracing-attributes",
|
||||||
"tracing-core",
|
"tracing-core",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tracing-attributes"
|
||||||
|
version = "0.1.23"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing-core"
|
name = "tracing-core"
|
||||||
version = "0.1.30"
|
version = "0.1.30"
|
||||||
|
|
|
@ -6,5 +6,10 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
mino = { path = "../mino" }
|
mino = { path = "../mino" }
|
||||||
|
fish = { path = "../fish" }
|
||||||
|
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
rand_xoshiro = "0.6"
|
rand_xoshiro = "0.6"
|
||||||
|
|
||||||
|
tracing = { version = "0.1" }
|
||||||
|
tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"]}
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
use fish::ai;
|
||||||
|
use rand::Rng as _;
|
||||||
|
use tidepool::sim;
|
||||||
|
|
||||||
|
struct RngSeed([u8; 32]);
|
||||||
|
|
||||||
|
impl rand::distributions::Distribution<RngSeed> for rand::distributions::Standard {
|
||||||
|
fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> RngSeed {
|
||||||
|
RngSeed(self.sample(rng))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for RngSeed {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
self.0.iter().try_for_each(|&b| write!(f, "{b:02x}"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() -> std::io::Result<()> {
|
||||||
|
const AI_CYCLES: usize = 5_000;
|
||||||
|
const GOAL: usize = 50;
|
||||||
|
|
||||||
|
tracing_subscriber::fmt::fmt()
|
||||||
|
.with_writer(std::io::stderr)
|
||||||
|
.with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env())
|
||||||
|
.init();
|
||||||
|
|
||||||
|
let seed = rand::thread_rng().gen::<RngSeed>();
|
||||||
|
println!("using seed: {seed}");
|
||||||
|
|
||||||
|
let mut sim = sim::Simul::new(seed.0, sim::Options::jstris(GOAL));
|
||||||
|
|
||||||
|
let mut ds = 0;
|
||||||
|
let mut ps = 0;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let (hold, next) = sim.queue();
|
||||||
|
let hold_str = hold.map_or("", |p| p.name());
|
||||||
|
let next_str = next.iter().map(|p| p.as_char()).collect::<String>();
|
||||||
|
println!("Q: [{hold_str}]{next_str}");
|
||||||
|
|
||||||
|
let mat = sim.matrix();
|
||||||
|
for y in (0..mat.rows() + 1).rev() {
|
||||||
|
print!("{y:2} |");
|
||||||
|
for x in 0..10 {
|
||||||
|
print!("{}", if mat.get(x, y) { '#' } else { '.' });
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
|
let ll = sim.lines_left();
|
||||||
|
|
||||||
|
let mut ai = ai::Ai::new(mat, &next, hold);
|
||||||
|
for i in 0..AI_CYCLES {
|
||||||
|
if i > 0 && i % 1000 == 0 {
|
||||||
|
tracing::debug!("iteration {i}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ai.think().is_err() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut best = ai.suggestion();
|
||||||
|
let best = best.nth(0);
|
||||||
|
|
||||||
|
if let Some(pc) = best {
|
||||||
|
sim.play(pc);
|
||||||
|
} else {
|
||||||
|
println!("no suggestion!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ds += ll - sim.lines_left();
|
||||||
|
ps += 1;
|
||||||
|
print!("#{ps}, ds: {ds}");
|
||||||
|
if ds > 0 {
|
||||||
|
print!(", ppd: {:.2}", ps as f64 / ds as f64);
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
|
||||||
|
if ll == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!();
|
||||||
|
println!("pieces: {ps}");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
Loading…
Reference in New Issue