Compare commits
No commits in common. "73cc6ee67e59f152affa528f4b0400aa26788446" and "866ba611a6115c5c7e9ab8358c7d485e14813420" have entirely different histories.
73cc6ee67e
...
866ba611a6
11 changed files with 150 additions and 561 deletions
251
Cargo.lock
generated
251
Cargo.lock
generated
|
|
@ -2,15 +2,6 @@
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 4
|
version = 4
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "addr2line"
|
|
||||||
version = "0.24.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
|
|
||||||
dependencies = [
|
|
||||||
"gimli",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "adler2"
|
name = "adler2"
|
||||||
version = "2.0.1"
|
version = "2.0.1"
|
||||||
|
|
@ -167,24 +158,6 @@ dependencies = [
|
||||||
"syn 2.0.104",
|
"syn 2.0.104",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "arimaa_engine_step"
|
|
||||||
version = "1.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f1c6726d7896a539a62e157b05fa4b7308ffb7872f2b4a2a592d5adb19837861"
|
|
||||||
dependencies = [
|
|
||||||
"anyhow",
|
|
||||||
"itertools 0.10.5",
|
|
||||||
"log",
|
|
||||||
"regex",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "arrayvec"
|
|
||||||
version = "0.5.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arrayvec"
|
name = "arrayvec"
|
||||||
version = "0.7.6"
|
version = "0.7.6"
|
||||||
|
|
@ -231,7 +204,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8"
|
checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"arrayvec 0.7.6",
|
"arrayvec",
|
||||||
"log",
|
"log",
|
||||||
"nom",
|
"nom",
|
||||||
"num-rational",
|
"num-rational",
|
||||||
|
|
@ -244,22 +217,7 @@ version = "0.8.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e"
|
checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec 0.7.6",
|
"arrayvec",
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "backtrace"
|
|
||||||
version = "0.3.75"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
|
|
||||||
dependencies = [
|
|
||||||
"addr2line",
|
|
||||||
"cfg-if",
|
|
||||||
"libc",
|
|
||||||
"miniz_oxide",
|
|
||||||
"object",
|
|
||||||
"rustc-demangle",
|
|
||||||
"windows-targets 0.52.6",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -356,39 +314,14 @@ dependencies = [
|
||||||
"generic-array",
|
"generic-array",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "board-game"
|
|
||||||
version = "0.8.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "647fc8459363368aae04df3d21da37094430c57dd993d09be2792133d5365e3e"
|
|
||||||
dependencies = [
|
|
||||||
"arimaa_engine_step",
|
|
||||||
"cast_trait",
|
|
||||||
"chess",
|
|
||||||
"decorum",
|
|
||||||
"internal-iterator",
|
|
||||||
"itertools 0.10.5",
|
|
||||||
"lazy_static",
|
|
||||||
"nohash-hasher",
|
|
||||||
"nom",
|
|
||||||
"num-traits",
|
|
||||||
"once_cell",
|
|
||||||
"rand 0.8.5",
|
|
||||||
"rand_xoshiro",
|
|
||||||
"rayon",
|
|
||||||
"static_assertions",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bot"
|
name = "bot"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"board-game",
|
|
||||||
"burn",
|
"burn",
|
||||||
"burn-rl",
|
"burn-rl",
|
||||||
"confy",
|
"confy",
|
||||||
"env_logger 0.10.0",
|
"env_logger 0.10.0",
|
||||||
"internal-iterator",
|
|
||||||
"log",
|
"log",
|
||||||
"pretty_assertions",
|
"pretty_assertions",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
|
|
@ -864,12 +797,6 @@ version = "0.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
|
checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cast_trait"
|
|
||||||
version = "0.1.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c4f8d981c476baadf74cd52897866a1d279d3e14e2d5e2d9af045210e0ae6128"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "castaway"
|
name = "castaway"
|
||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
|
|
@ -936,18 +863,6 @@ dependencies = [
|
||||||
"zeroize",
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "chess"
|
|
||||||
version = "3.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2ed299b171ec34f372945ad6726f7bc1d2afd5f59fb8380f64f48e2bab2f0ec8"
|
|
||||||
dependencies = [
|
|
||||||
"arrayvec 0.5.2",
|
|
||||||
"failure",
|
|
||||||
"nodrop",
|
|
||||||
"rand 0.7.3",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cipher"
|
name = "cipher"
|
||||||
version = "0.4.4"
|
version = "0.4.4"
|
||||||
|
|
@ -1531,15 +1446,6 @@ version = "2.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
|
checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "decorum"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "281759d3c8a14f5c3f0c49363be56810fcd7f910422f97f2db850c2920fde5cf"
|
|
||||||
dependencies = [
|
|
||||||
"num-traits",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deranged"
|
name = "deranged"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
|
|
@ -1853,28 +1759,6 @@ dependencies = [
|
||||||
"zune-inflate",
|
"zune-inflate",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "failure"
|
|
||||||
version = "0.1.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
|
|
||||||
dependencies = [
|
|
||||||
"backtrace",
|
|
||||||
"failure_derive",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "failure_derive"
|
|
||||||
version = "0.1.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 1.0.109",
|
|
||||||
"synstructure 0.12.6",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fallible-iterator"
|
name = "fallible-iterator"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
|
|
@ -2308,12 +2192,6 @@ dependencies = [
|
||||||
"weezl",
|
"weezl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "gimli"
|
|
||||||
version = "0.31.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gix-features"
|
name = "gix-features"
|
||||||
version = "0.42.1"
|
version = "0.42.1"
|
||||||
|
|
@ -2496,7 +2374,7 @@ dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"ordered-float 5.0.0",
|
"ordered-float 5.0.0",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"rand_pcg 0.3.1",
|
"rand_pcg",
|
||||||
"sdl2",
|
"sdl2",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
@ -2695,12 +2573,6 @@ dependencies = [
|
||||||
"syn 2.0.104",
|
"syn 2.0.104",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "internal-iterator"
|
|
||||||
version = "0.2.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "969ee3fc68ec2e88eb21434ce4d9b7e1600d1ce92ff974560a6c4a304f5124b9"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "interpolate_name"
|
name = "interpolate_name"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
|
|
@ -2729,15 +2601,6 @@ version = "1.70.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "itertools"
|
|
||||||
version = "0.10.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
|
|
||||||
dependencies = [
|
|
||||||
"either",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.12.1"
|
version = "0.12.1"
|
||||||
|
|
@ -3096,7 +2959,7 @@ version = "25.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632"
|
checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec 0.7.6",
|
"arrayvec",
|
||||||
"bit-set",
|
"bit-set",
|
||||||
"bitflags 2.9.1",
|
"bitflags 2.9.1",
|
||||||
"cfg_aliases",
|
"cfg_aliases",
|
||||||
|
|
@ -3173,18 +3036,6 @@ version = "1.0.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
|
checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nodrop"
|
|
||||||
version = "0.1.14"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nohash-hasher"
|
|
||||||
version = "0.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nom"
|
name = "nom"
|
||||||
version = "7.1.3"
|
version = "7.1.3"
|
||||||
|
|
@ -3384,15 +3235,6 @@ dependencies = [
|
||||||
"malloc_buf",
|
"malloc_buf",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "object"
|
|
||||||
version = "0.36.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
|
|
||||||
dependencies = [
|
|
||||||
"memchr",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "octets"
|
name = "octets"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
|
|
@ -3750,18 +3592,6 @@ dependencies = [
|
||||||
"uuid",
|
"uuid",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand"
|
|
||||||
version = "0.7.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
|
|
||||||
dependencies = [
|
|
||||||
"rand_chacha 0.2.2",
|
|
||||||
"rand_core 0.5.1",
|
|
||||||
"rand_hc",
|
|
||||||
"rand_pcg 0.2.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.8.5"
|
version = "0.8.5"
|
||||||
|
|
@ -3784,16 +3614,6 @@ dependencies = [
|
||||||
"rand_core 0.9.3",
|
"rand_core 0.9.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_chacha"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
|
|
||||||
dependencies = [
|
|
||||||
"ppv-lite86",
|
|
||||||
"rand_core 0.5.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_chacha"
|
name = "rand_chacha"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
|
|
@ -3814,12 +3634,6 @@ dependencies = [
|
||||||
"rand_core 0.9.3",
|
"rand_core 0.9.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.5.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.6.4"
|
version = "0.6.4"
|
||||||
|
|
@ -3849,24 +3663,6 @@ dependencies = [
|
||||||
"rand 0.9.1",
|
"rand 0.9.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_hc"
|
|
||||||
version = "0.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.5.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_pcg"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.5.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_pcg"
|
name = "rand_pcg"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
|
|
@ -3876,15 +3672,6 @@ dependencies = [
|
||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_xoshiro"
|
|
||||||
version = "0.6.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.6.4",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "range-alloc"
|
name = "range-alloc"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
|
|
@ -3942,7 +3729,7 @@ checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arbitrary",
|
"arbitrary",
|
||||||
"arg_enum_proc_macro",
|
"arg_enum_proc_macro",
|
||||||
"arrayvec 0.7.6",
|
"arrayvec",
|
||||||
"av1-grain",
|
"av1-grain",
|
||||||
"bitstream-io",
|
"bitstream-io",
|
||||||
"built",
|
"built",
|
||||||
|
|
@ -4226,12 +4013,6 @@ dependencies = [
|
||||||
"smallvec",
|
"smallvec",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustc-demangle"
|
|
||||||
version = "0.1.26"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc-hash"
|
name = "rustc-hash"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
|
@ -4741,18 +4522,6 @@ dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "synstructure"
|
|
||||||
version = "0.12.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 1.0.109",
|
|
||||||
"unicode-xid",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "synstructure"
|
name = "synstructure"
|
||||||
version = "0.13.2"
|
version = "0.13.2"
|
||||||
|
|
@ -5504,7 +5273,7 @@ version = "25.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ec8fb398f119472be4d80bc3647339f56eb63b2a331f6a3d16e25d8144197dd9"
|
checksum = "ec8fb398f119472be4d80bc3647339f56eb63b2a331f6a3d16e25d8144197dd9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec 0.7.6",
|
"arrayvec",
|
||||||
"bitflags 2.9.1",
|
"bitflags 2.9.1",
|
||||||
"cfg_aliases",
|
"cfg_aliases",
|
||||||
"document-features",
|
"document-features",
|
||||||
|
|
@ -5532,7 +5301,7 @@ version = "25.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f7b882196f8368511d613c6aeec80655160db6646aebddf8328879a88d54e500"
|
checksum = "f7b882196f8368511d613c6aeec80655160db6646aebddf8328879a88d54e500"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec 0.7.6",
|
"arrayvec",
|
||||||
"bit-set",
|
"bit-set",
|
||||||
"bit-vec",
|
"bit-vec",
|
||||||
"bitflags 2.9.1",
|
"bitflags 2.9.1",
|
||||||
|
|
@ -5591,7 +5360,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f968767fe4d3d33747bbd1473ccd55bf0f6451f55d733b5597e67b5deab4ad17"
|
checksum = "f968767fe4d3d33747bbd1473ccd55bf0f6451f55d733b5597e67b5deab4ad17"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"android_system_properties",
|
"android_system_properties",
|
||||||
"arrayvec 0.7.6",
|
"arrayvec",
|
||||||
"ash",
|
"ash",
|
||||||
"bit-set",
|
"bit-set",
|
||||||
"bitflags 2.9.1",
|
"bitflags 2.9.1",
|
||||||
|
|
@ -6014,7 +5783,7 @@ dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.104",
|
"syn 2.0.104",
|
||||||
"synstructure 0.13.2",
|
"synstructure",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -6055,7 +5824,7 @@ dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.104",
|
"syn 2.0.104",
|
||||||
"synstructure 0.13.2",
|
"synstructure",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
||||||
|
|
@ -24,5 +24,3 @@ burn = { version = "0.17", features = ["ndarray", "autodiff"] }
|
||||||
burn-rl = { git = "https://github.com/yunjhongwu/burn-rl-examples.git", package = "burn-rl" }
|
burn-rl = { git = "https://github.com/yunjhongwu/burn-rl-examples.git", package = "burn-rl" }
|
||||||
log = "0.4.20"
|
log = "0.4.20"
|
||||||
confy = "1.0.0"
|
confy = "1.0.0"
|
||||||
board-game = "0.8.2"
|
|
||||||
internal-iterator = "0.2.3"
|
|
||||||
|
|
|
||||||
|
|
@ -281,8 +281,79 @@ impl TrictracEnvironment {
|
||||||
let mut reward = 0.0;
|
let mut reward = 0.0;
|
||||||
let mut is_rollpoint = false;
|
let mut is_rollpoint = false;
|
||||||
|
|
||||||
|
let event = match action {
|
||||||
|
TrictracAction::Roll => {
|
||||||
|
// Lancer les dés
|
||||||
|
Some(GameEvent::Roll {
|
||||||
|
player_id: self.active_player_id,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// TrictracAction::Mark => {
|
||||||
|
// // Marquer des points
|
||||||
|
// let points = self.game.
|
||||||
|
// Some(GameEvent::Mark {
|
||||||
|
// player_id: self.active_player_id,
|
||||||
|
// points,
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
TrictracAction::Go => {
|
||||||
|
// Continuer après avoir gagné un trou
|
||||||
|
Some(GameEvent::Go {
|
||||||
|
player_id: self.active_player_id,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
TrictracAction::Move {
|
||||||
|
dice_order,
|
||||||
|
checker1,
|
||||||
|
checker2,
|
||||||
|
} => {
|
||||||
|
// Effectuer un mouvement
|
||||||
|
let (dice1, dice2) = if dice_order {
|
||||||
|
(self.game.dice.values.0, self.game.dice.values.1)
|
||||||
|
} else {
|
||||||
|
(self.game.dice.values.1, self.game.dice.values.0)
|
||||||
|
};
|
||||||
|
|
||||||
|
let color = &store::Color::White;
|
||||||
|
let from1 = self
|
||||||
|
.game
|
||||||
|
.board
|
||||||
|
.get_checker_field(color, checker1 as u8)
|
||||||
|
.unwrap_or(0);
|
||||||
|
let mut to1 = from1 + dice1 as usize;
|
||||||
|
let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default();
|
||||||
|
|
||||||
|
let mut tmp_board = self.game.board.clone();
|
||||||
|
let move_result = tmp_board.move_checker(color, checker_move1);
|
||||||
|
if move_result.is_err() {
|
||||||
|
None
|
||||||
|
// panic!("Error while moving checker {move_result:?}")
|
||||||
|
} else {
|
||||||
|
let from2 = tmp_board
|
||||||
|
.get_checker_field(color, checker2 as u8)
|
||||||
|
.unwrap_or(0);
|
||||||
|
let mut to2 = from2 + dice2 as usize;
|
||||||
|
|
||||||
|
// Gestion prise de coin par puissance
|
||||||
|
let opp_rest_field = 13;
|
||||||
|
if to1 == opp_rest_field && to2 == opp_rest_field {
|
||||||
|
to1 -= 1;
|
||||||
|
to2 -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default();
|
||||||
|
let checker_move2 = store::CheckerMove::new(from2, to2).unwrap_or_default();
|
||||||
|
|
||||||
|
Some(GameEvent::Move {
|
||||||
|
player_id: self.active_player_id,
|
||||||
|
moves: (checker_move1, checker_move2),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Appliquer l'événement si valide
|
// Appliquer l'événement si valide
|
||||||
if let Some(event) = action.to_event(&self.game) {
|
if let Some(event) = event {
|
||||||
if self.game.validate(&event) {
|
if self.game.validate(&event) {
|
||||||
self.game.consume(&event);
|
self.game.consume(&event);
|
||||||
reward += REWARD_VALID_MOVE;
|
reward += REWARD_VALID_MOVE;
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ pub mod dqn_simple;
|
||||||
pub mod strategy;
|
pub mod strategy;
|
||||||
pub mod training_common;
|
pub mod training_common;
|
||||||
pub mod training_common_big;
|
pub mod training_common_big;
|
||||||
pub mod trictrac_board;
|
|
||||||
|
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use store::{CheckerMove, Color, GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage};
|
use store::{CheckerMove, Color, GameEvent, GameState, PlayerId, PointsRules, Stage, TurnStage};
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
use std::cmp::{max, min};
|
use std::cmp::{max, min};
|
||||||
use std::fmt::{Debug, Display, Formatter};
|
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use store::{CheckerMove, GameEvent, GameState};
|
use store::CheckerMove;
|
||||||
|
|
||||||
/// Types d'actions possibles dans le jeu
|
/// Types d'actions possibles dans le jeu
|
||||||
#[derive(Debug, Copy, Clone, Eq, Serialize, Deserialize, PartialEq)]
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
pub enum TrictracAction {
|
pub enum TrictracAction {
|
||||||
/// Lancer les dés
|
/// Lancer les dés
|
||||||
Roll,
|
Roll,
|
||||||
|
|
@ -21,14 +20,6 @@ pub enum TrictracAction {
|
||||||
// Mark,
|
// Mark,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for TrictracAction {
|
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
||||||
let s = format!("{self:?}");
|
|
||||||
writeln!(f, "{}", s.chars().rev().collect::<String>())?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TrictracAction {
|
impl TrictracAction {
|
||||||
/// Encode une action en index pour le réseau de neurones
|
/// Encode une action en index pour le réseau de neurones
|
||||||
pub fn to_action_index(&self) -> usize {
|
pub fn to_action_index(&self) -> usize {
|
||||||
|
|
@ -53,78 +44,6 @@ impl TrictracAction {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_event(&self, state: &GameState) -> Option<GameEvent> {
|
|
||||||
match self {
|
|
||||||
TrictracAction::Roll => {
|
|
||||||
// Lancer les dés
|
|
||||||
Some(GameEvent::Roll {
|
|
||||||
player_id: state.active_player_id,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
// TrictracAction::Mark => {
|
|
||||||
// // Marquer des points
|
|
||||||
// let points = self.game.
|
|
||||||
// Some(GameEvent::Mark {
|
|
||||||
// player_id: self.active_player_id,
|
|
||||||
// points,
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
TrictracAction::Go => {
|
|
||||||
// Continuer après avoir gagné un trou
|
|
||||||
Some(GameEvent::Go {
|
|
||||||
player_id: state.active_player_id,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
TrictracAction::Move {
|
|
||||||
dice_order,
|
|
||||||
checker1,
|
|
||||||
checker2,
|
|
||||||
} => {
|
|
||||||
// Effectuer un mouvement
|
|
||||||
let (dice1, dice2) = if *dice_order {
|
|
||||||
(state.dice.values.0, state.dice.values.1)
|
|
||||||
} else {
|
|
||||||
(state.dice.values.1, state.dice.values.0)
|
|
||||||
};
|
|
||||||
|
|
||||||
let color = &store::Color::White;
|
|
||||||
let from1 = state
|
|
||||||
.board
|
|
||||||
.get_checker_field(color, *checker1 as u8)
|
|
||||||
.unwrap_or(0);
|
|
||||||
let mut to1 = from1 + dice1 as usize;
|
|
||||||
let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default();
|
|
||||||
|
|
||||||
let mut tmp_board = state.board.clone();
|
|
||||||
let move_result = tmp_board.move_checker(color, checker_move1);
|
|
||||||
if move_result.is_err() {
|
|
||||||
None
|
|
||||||
// panic!("Error while moving checker {move_result:?}")
|
|
||||||
} else {
|
|
||||||
let from2 = tmp_board
|
|
||||||
.get_checker_field(color, *checker2 as u8)
|
|
||||||
.unwrap_or(0);
|
|
||||||
let mut to2 = from2 + dice2 as usize;
|
|
||||||
|
|
||||||
// Gestion prise de coin par puissance
|
|
||||||
let opp_rest_field = 13;
|
|
||||||
if to1 == opp_rest_field && to2 == opp_rest_field {
|
|
||||||
to1 -= 1;
|
|
||||||
to2 -= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
let checker_move1 = store::CheckerMove::new(from1, to1).unwrap_or_default();
|
|
||||||
let checker_move2 = store::CheckerMove::new(from2, to2).unwrap_or_default();
|
|
||||||
|
|
||||||
Some(GameEvent::Move {
|
|
||||||
player_id: state.active_player_id,
|
|
||||||
moves: (checker_move1, checker_move2),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Décode un index d'action en TrictracAction
|
/// Décode un index d'action en TrictracAction
|
||||||
pub fn from_action_index(index: usize) -> Option<TrictracAction> {
|
pub fn from_action_index(index: usize) -> Option<TrictracAction> {
|
||||||
match index {
|
match index {
|
||||||
|
|
|
||||||
|
|
@ -1,149 +0,0 @@
|
||||||
// https://docs.rs/board-game/ implementation
|
|
||||||
use crate::training_common::{get_valid_actions, TrictracAction};
|
|
||||||
use board_game::board::{
|
|
||||||
Board as BoardGameBoard, BoardDone, BoardMoves, Outcome, PlayError, Player as BoardGamePlayer,
|
|
||||||
};
|
|
||||||
use board_game::impl_unit_symmetry_board;
|
|
||||||
use internal_iterator::InternalIterator;
|
|
||||||
use std::fmt;
|
|
||||||
use std::ops::ControlFlow;
|
|
||||||
use store::Color;
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
||||||
pub struct TrictracBoard(crate::GameState);
|
|
||||||
|
|
||||||
impl Default for TrictracBoard {
|
|
||||||
fn default() -> Self {
|
|
||||||
TrictracBoard(crate::GameState::new_with_players("white", "black"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for TrictracBoard {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
self.0.fmt(f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl_unit_symmetry_board!(TrictracBoard);
|
|
||||||
|
|
||||||
impl BoardGameBoard for TrictracBoard {
|
|
||||||
// impl TrictracBoard {
|
|
||||||
type Move = TrictracAction;
|
|
||||||
|
|
||||||
fn next_player(&self) -> BoardGamePlayer {
|
|
||||||
self.0
|
|
||||||
.who_plays()
|
|
||||||
.map(|p| {
|
|
||||||
if p.color == Color::Black {
|
|
||||||
BoardGamePlayer::B
|
|
||||||
} else {
|
|
||||||
BoardGamePlayer::A
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.unwrap_or(BoardGamePlayer::A)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn is_available_move(&self, mv: Self::Move) -> Result<bool, BoardDone> {
|
|
||||||
self.check_done()?;
|
|
||||||
let is_valid = mv
|
|
||||||
.to_event(&self.0)
|
|
||||||
.map(|evt| self.0.validate(&evt))
|
|
||||||
.unwrap_or(false);
|
|
||||||
Ok(is_valid)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn play(&mut self, mv: Self::Move) -> Result<(), PlayError> {
|
|
||||||
self.check_can_play(mv)?;
|
|
||||||
self.0.consume(&mv.to_event(&self.0).unwrap());
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn outcome(&self) -> Option<Outcome> {
|
|
||||||
if self.0.stage == crate::Stage::Ended {
|
|
||||||
self.0.determine_winner().map(|player_id| {
|
|
||||||
Outcome::WonBy(if player_id == 1 {
|
|
||||||
BoardGamePlayer::A
|
|
||||||
} else {
|
|
||||||
BoardGamePlayer::B
|
|
||||||
})
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn can_lose_after_move() -> bool {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> BoardMoves<'a, TrictracBoard> for TrictracBoard {
|
|
||||||
type AllMovesIterator = TrictracAllMovesIterator;
|
|
||||||
type AvailableMovesIterator = TrictracAvailableMovesIterator<'a>;
|
|
||||||
|
|
||||||
fn all_possible_moves() -> Self::AllMovesIterator {
|
|
||||||
TrictracAllMovesIterator::default()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn available_moves(&'a self) -> Result<Self::AvailableMovesIterator, BoardDone> {
|
|
||||||
TrictracAvailableMovesIterator::new(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub struct TrictracAllMovesIterator;
|
|
||||||
|
|
||||||
impl Default for TrictracAllMovesIterator {
|
|
||||||
fn default() -> Self {
|
|
||||||
TrictracAllMovesIterator
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InternalIterator for TrictracAllMovesIterator {
|
|
||||||
type Item = TrictracAction;
|
|
||||||
|
|
||||||
fn try_for_each<R, F: FnMut(Self::Item) -> ControlFlow<R>>(self, mut f: F) -> ControlFlow<R> {
|
|
||||||
f(TrictracAction::Roll)?;
|
|
||||||
f(TrictracAction::Go)?;
|
|
||||||
for dice_order in [false, true] {
|
|
||||||
for checker1 in 0..16 {
|
|
||||||
for checker2 in 0..16 {
|
|
||||||
f(TrictracAction::Move {
|
|
||||||
dice_order,
|
|
||||||
checker1,
|
|
||||||
checker2,
|
|
||||||
})?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ControlFlow::Continue(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub struct TrictracAvailableMovesIterator<'a> {
|
|
||||||
board: &'a TrictracBoard,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> TrictracAvailableMovesIterator<'a> {
|
|
||||||
pub fn new(board: &'a TrictracBoard) -> Result<Self, BoardDone> {
|
|
||||||
board.check_done()?;
|
|
||||||
Ok(TrictracAvailableMovesIterator { board })
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn board(&self) -> &'a TrictracBoard {
|
|
||||||
self.board
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InternalIterator for TrictracAvailableMovesIterator<'_> {
|
|
||||||
type Item = TrictracAction;
|
|
||||||
|
|
||||||
fn try_for_each<R, F>(self, f: F) -> ControlFlow<R>
|
|
||||||
where
|
|
||||||
F: FnMut(Self::Item) -> ControlFlow<R>,
|
|
||||||
{
|
|
||||||
get_valid_actions(&self.board.0).into_iter().try_for_each(f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +1,46 @@
|
||||||
# Inspirations
|
# Inspirations
|
||||||
|
|
||||||
tools
|
tools
|
||||||
|
- config clippy ?
|
||||||
- config clippy ?
|
- bacon : tests runner (ou loom ?)
|
||||||
- bacon : tests runner (ou loom ?)
|
|
||||||
|
|
||||||
## Rust libs
|
## Rust libs
|
||||||
|
|
||||||
cf. <https://blessed.rs/crates>
|
cf. https://blessed.rs/crates
|
||||||
|
|
||||||
nombres aléatoires avec seed : <https://richard.dallaway.com/posts/2021-01-04-repeat-resume/>
|
nombres aléatoires avec seed : https://richard.dallaway.com/posts/2021-01-04-repeat-resume/
|
||||||
|
|
||||||
- cli : <https://lib.rs/crates/pico-args> ( ou clap )
|
- cli : https://lib.rs/crates/pico-args ( ou clap )
|
||||||
- reseau async : tokio
|
- reseau async : tokio
|
||||||
- web serveur : axum (uses tokio)
|
- web serveur : axum (uses tokio)
|
||||||
- <https://fasterthanli.me/series/updating-fasterthanli-me-for-2022/part-2#the-opinions-of-axum-also-nice-error-handling>
|
- https://fasterthanli.me/series/updating-fasterthanli-me-for-2022/part-2#the-opinions-of-axum-also-nice-error-handling
|
||||||
- db : sqlx
|
- db : sqlx
|
||||||
|
|
||||||
|
|
||||||
- eyre, color-eyre (Results)
|
- eyre, color-eyre (Results)
|
||||||
- tracing (logging)
|
- tracing (logging)
|
||||||
- rayon ( sync <-> parallel )
|
- rayon ( sync <-> parallel )
|
||||||
|
|
||||||
- front : yew + tauri
|
- front : yew + tauri
|
||||||
- egui
|
- egui
|
||||||
|
|
||||||
- <https://docs.rs/board-game/latest/board_game/>
|
- https://docs.rs/board-game/latest/board_game/
|
||||||
|
|
||||||
## network games
|
|
||||||
|
|
||||||
- <https://www.mattkeeter.com/projects/pont/>
|
|
||||||
- <https://github.com/jackadamson/onitama> (wasm, rooms)
|
|
||||||
- <https://github.com/UkoeHB/renet2>
|
|
||||||
|
|
||||||
## Others
|
## Others
|
||||||
|
- plugins avec https://github.com/extism/extism
|
||||||
- plugins avec <https://github.com/extism/extism>
|
|
||||||
|
|
||||||
## Backgammon existing projects
|
## Backgammon existing projects
|
||||||
|
|
||||||
- go : <https://bgammon.org/blog/20240101-hello-world/>
|
* go : https://bgammon.org/blog/20240101-hello-world/
|
||||||
- protocole de communication : <https://code.rocket9labs.com/tslocum/bgammon/src/branch/main/PROTOCOL.md>
|
- protocole de communication : https://code.rocket9labs.com/tslocum/bgammon/src/branch/main/PROTOCOL.md
|
||||||
- ocaml : <https://github.com/jacobhilton/backgammon?tab=readme-ov-file>
|
* ocaml : https://github.com/jacobhilton/backgammon?tab=readme-ov-file
|
||||||
cli example : <https://www.jacobh.co.uk/backgammon/>
|
cli example : https://www.jacobh.co.uk/backgammon/
|
||||||
- lib rust backgammon
|
* lib rust backgammon
|
||||||
- <https://github.com/carlostrub/backgammon>
|
- https://github.com/carlostrub/backgammon
|
||||||
- <https://github.com/marktani/backgammon>
|
- https://github.com/marktani/backgammon
|
||||||
- network webtarot
|
* network webtarot
|
||||||
- front ?
|
* front ?
|
||||||
|
|
||||||
|
|
||||||
## cli examples
|
## cli examples
|
||||||
|
|
||||||
|
|
@ -54,7 +48,7 @@ nombres aléatoires avec seed : <https://richard.dallaway.com/posts/2021-01-04-r
|
||||||
|
|
||||||
(No game) new game
|
(No game) new game
|
||||||
gnubg rolls 3, anthon rolls 1.
|
gnubg rolls 3, anthon rolls 1.
|
||||||
|
|
||||||
GNU Backgammon Positions ID: 4HPwATDgc/ABMA
|
GNU Backgammon Positions ID: 4HPwATDgc/ABMA
|
||||||
Match ID : MIEFAAAAAAAA
|
Match ID : MIEFAAAAAAAA
|
||||||
+12-11-10--9--8--7-------6--5--4--3--2--1-+ O: gnubg
|
+12-11-10--9--8--7-------6--5--4--3--2--1-+ O: gnubg
|
||||||
|
|
@ -70,7 +64,7 @@ nombres aléatoires avec seed : <https://richard.dallaway.com/posts/2021-01-04-r
|
||||||
| O X | | X O |
|
| O X | | X O |
|
||||||
| O X | | X O | 0 points
|
| O X | | X O | 0 points
|
||||||
+13-14-15-16-17-18------19-20-21-22-23-24-+ X: anthon
|
+13-14-15-16-17-18------19-20-21-22-23-24-+ X: anthon
|
||||||
|
|
||||||
gnubg moves 8/5 6/5.
|
gnubg moves 8/5 6/5.
|
||||||
|
|
||||||
### jacobh
|
### jacobh
|
||||||
|
|
@ -78,37 +72,33 @@ nombres aléatoires avec seed : <https://richard.dallaway.com/posts/2021-01-04-r
|
||||||
Move 11: player O rolls a 6-2.
|
Move 11: player O rolls a 6-2.
|
||||||
Player O estimates that they have a 90.6111% chance of winning.
|
Player O estimates that they have a 90.6111% chance of winning.
|
||||||
|
|
||||||
Os borne off: none
|
Os borne off: none
|
||||||
24 23 22 21 20 19 18 17 16 15 14 13
|
24 23 22 21 20 19 18 17 16 15 14 13
|
||||||
|
-------------------------------------------------------------------
|
||||||
---
|
| v v v v v v | | v v v v v v |
|
||||||
|
| | | |
|
||||||
| v v v v v v | | v v v v v v |
|
| X O O O | | O O O |
|
||||||
| | | |
|
| X O O O | | O O |
|
||||||
| X O O O | | O O O |
|
| O | | |
|
||||||
| X O O O | | O O |
|
| | X | |
|
||||||
| O | | |
|
| | | |
|
||||||
| | X | |
|
| | | |
|
||||||
| | | |
|
| | | |
|
||||||
| | | |
|
| | | |
|
||||||
| | | |
|
|------------------------------| |------------------------------|
|
||||||
| | | |
|
| | | |
|
||||||
|------------------------------| |------------------------------|
|
| | | |
|
||||||
| | | |
|
| | | |
|
||||||
| | | |
|
| | | |
|
||||||
| | | |
|
| X | | |
|
||||||
| | | |
|
| X X | | X |
|
||||||
| X | | |
|
| X X X | | X O |
|
||||||
| X X | | X |
|
| X X X | | X O O |
|
||||||
| X X X | | X O |
|
| | | |
|
||||||
| X X X | | X O O |
|
| ^ ^ ^ ^ ^ ^ | | ^ ^ ^ ^ ^ ^ |
|
||||||
| | | |
|
-------------------------------------------------------------------
|
||||||
| ^ ^ ^ ^ ^ ^ | | ^ ^ ^ ^ ^ ^ |
|
1 2 3 4 5 6 7 8 9 10 11 12
|
||||||
|
Xs borne off: none
|
||||||
---
|
|
||||||
|
|
||||||
1 2 3 4 5 6 7 8 9 10 11 12
|
|
||||||
Xs borne off: none
|
|
||||||
|
|
||||||
Move 12: player X rolls a 6-3.
|
Move 12: player X rolls a 6-3.
|
||||||
Your move (? for help): bar/22
|
Your move (? for help): bar/22
|
||||||
|
|
@ -117,12 +107,13 @@ Your move (? for help): ?
|
||||||
Enter the start and end positions, separated by a forward slash (or any non-numeric character), of each counter you want to move.
|
Enter the start and end positions, separated by a forward slash (or any non-numeric character), of each counter you want to move.
|
||||||
Each position should be number from 1 to 24, "bar" or "off".
|
Each position should be number from 1 to 24, "bar" or "off".
|
||||||
Unlike in standard notation, you should enter each counter movement individually. For example:
|
Unlike in standard notation, you should enter each counter movement individually. For example:
|
||||||
24/18 18/13
|
24/18 18/13
|
||||||
bar/3 13/10 13/10 8/5
|
bar/3 13/10 13/10 8/5
|
||||||
2/off 1/off
|
2/off 1/off
|
||||||
You can also enter these commands:
|
You can also enter these commands:
|
||||||
p - show the previous move
|
p - show the previous move
|
||||||
n - show the next move
|
n - show the next move
|
||||||
<enter> - toggle between showing the current and last moves
|
<enter> - toggle between showing the current and last moves
|
||||||
help - show this help text
|
help - show this help text
|
||||||
quit - abandon game
|
quit - abandon game
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ use std::fmt;
|
||||||
pub type Field = usize;
|
pub type Field = usize;
|
||||||
pub type FieldWithCount = (Field, i8);
|
pub type FieldWithCount = (Field, i8);
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, Serialize, PartialEq, Eq, Deserialize)]
|
#[derive(Debug, Copy, Clone, Serialize, PartialEq, Deserialize)]
|
||||||
pub struct CheckerMove {
|
pub struct CheckerMove {
|
||||||
from: Field,
|
from: Field,
|
||||||
to: Field,
|
to: Field,
|
||||||
|
|
@ -94,7 +94,7 @@ impl CheckerMove {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents the Tric Trac board
|
/// Represents the Tric Trac board
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct Board {
|
pub struct Board {
|
||||||
positions: [i8; 24],
|
positions: [i8; 24],
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ impl DiceRoller {
|
||||||
/// Represents the two dice
|
/// Represents the two dice
|
||||||
///
|
///
|
||||||
/// Trictrac is always played with two dice.
|
/// Trictrac is always played with two dice.
|
||||||
#[derive(Debug, Clone, Copy, Serialize, PartialEq, Eq, Deserialize, Default)]
|
#[derive(Debug, Clone, Copy, Serialize, PartialEq, Deserialize, Default)]
|
||||||
pub struct Dice {
|
pub struct Dice {
|
||||||
/// The two dice values
|
/// The two dice values
|
||||||
pub values: (u8, u8),
|
pub values: (u8, u8),
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ impl From<TurnStage> for u8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents a TricTrac game
|
/// Represents a TricTrac game
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct GameState {
|
pub struct GameState {
|
||||||
pub stage: Stage,
|
pub stage: Stage,
|
||||||
pub turn_stage: TurnStage,
|
pub turn_stage: TurnStage,
|
||||||
|
|
@ -123,15 +123,6 @@ impl GameState {
|
||||||
gs
|
gs
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_with_players(p1_name: &str, p2_name: &str) -> Self {
|
|
||||||
let mut game = Self::default();
|
|
||||||
if let Some(p1) = game.init_player(p1_name) {
|
|
||||||
game.init_player(p2_name);
|
|
||||||
game.consume(&GameEvent::BeginGame { goes_first: p1 });
|
|
||||||
}
|
|
||||||
game
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_schools_enabled(&mut self, schools_enabled: bool) {
|
fn set_schools_enabled(&mut self, schools_enabled: bool) {
|
||||||
self.schools_enabled = schools_enabled;
|
self.schools_enabled = schools_enabled;
|
||||||
}
|
}
|
||||||
|
|
@ -716,14 +707,14 @@ impl GameState {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The reasons why a game could end
|
/// The reasons why a game could end
|
||||||
#[derive(Debug, Clone, Copy, Serialize, PartialEq, Eq, Deserialize)]
|
#[derive(Debug, Clone, Copy, Serialize, PartialEq, Deserialize)]
|
||||||
pub enum EndGameReason {
|
pub enum EndGameReason {
|
||||||
PlayerLeft { player_id: PlayerId },
|
PlayerLeft { player_id: PlayerId },
|
||||||
PlayerWon { winner: PlayerId },
|
PlayerWon { winner: PlayerId },
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An event that progresses the GameState forward
|
/// An event that progresses the GameState forward
|
||||||
#[derive(Debug, Clone, Serialize, PartialEq, Eq, Deserialize)]
|
#[derive(Debug, Clone, Serialize, PartialEq, Deserialize)]
|
||||||
pub enum GameEvent {
|
pub enum GameEvent {
|
||||||
BeginGame {
|
BeginGame {
|
||||||
goes_first: PlayerId,
|
goes_first: PlayerId,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use std::fmt;
|
||||||
// This just makes it easier to dissern between a player id and any ol' u64
|
// This just makes it easier to dissern between a player id and any ol' u64
|
||||||
pub type PlayerId = u64;
|
pub type PlayerId = u64;
|
||||||
|
|
||||||
#[derive(Copy, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Copy, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub enum Color {
|
pub enum Color {
|
||||||
White,
|
White,
|
||||||
Black,
|
Black,
|
||||||
|
|
@ -20,7 +20,7 @@ impl Color {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Struct for storing player related data.
|
/// Struct for storing player related data.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct Player {
|
pub struct Player {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub color: Color,
|
pub color: Color,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue