ms-toollib
Advanced tools
+1
-1
| [package] | ||
| name = "ms_toollib" | ||
| version = "1.4.17" | ||
| version = "1.5.2" | ||
| description = "Algorithms for Minesweeper" | ||
@@ -5,0 +5,0 @@ documentation = "https://docs.rs/ms_toollib" |
+1
-1
@@ -62,3 +62,3 @@ //! # 扫雷算法工具箱 | ||
| // cargo bench | ||
| // cargo publish --features rs | ||
| // cargo publish --features rs --allow-dirty | ||
| // 需要换成官方的源,不能用镜像 | ||
@@ -65,0 +65,0 @@ // cargo yank --vers 0.0.1 |
| #[cfg(any(feature = "py", feature = "rs"))] | ||
| use rand::Rng; | ||
| // 轻量级的安全局面,防住简单的内存读取攻击。假如不读源码,攻击者需要花一些时间。 | ||
| #[cfg(any(feature = "py", feature = "rs"))] | ||
@@ -5,0 +7,0 @@ fn encode(v: i32, rng: &mut rand::rngs::ThreadRng) -> (i32, i32, i32) { |
@@ -6,2 +6,4 @@ use crate::miscellaneous::s_to_ms; | ||
| use std::cmp::{max, min}; | ||
| use std::path::Path; | ||
| use std::thread; | ||
@@ -591,3 +593,3 @@ #[cfg(any(feature = "py", feature = "rs"))] | ||
| // } | ||
| /// 存evf文件,自动加后缀,xxx.evf重复变成xxx(2).evf | ||
| /// 存evf文件,自动加后缀,xxx.evf重复变成xxx(2).evf。后台线程执行,即使对象销毁也不影响。 | ||
| pub fn save_to_evf_file(&self, file_name: &str) -> String { | ||
@@ -599,28 +601,34 @@ if self.raw_data.is_empty() { | ||
| } | ||
| let file_exist = | ||
| std::path::Path::new((file_name.to_string() + &(".evf".to_string())).as_str()).exists(); | ||
| if !file_exist { | ||
| fs::write( | ||
| (file_name.to_string() + &(".evf".to_string())).as_str(), | ||
| &self.raw_data, | ||
| ) | ||
| .unwrap(); | ||
| return (file_name.to_string() + &(".evf".to_string())) | ||
| .as_str() | ||
| .to_string(); | ||
| } else { | ||
| let mut id = 2; | ||
| let mut format_name; | ||
| loop { | ||
| format_name = file_name.to_string() + &(format!("({}).evf", id).to_string()); | ||
| let new_file_name = format_name.as_str(); | ||
| let file_exist = std::path::Path::new(new_file_name).exists(); | ||
| if !file_exist { | ||
| fs::write(new_file_name, &self.raw_data).unwrap(); | ||
| return new_file_name.to_string(); | ||
| let base = file_name.to_string(); | ||
| let data = self.raw_data.clone(); | ||
| // 先计算文件名(同步,极快) | ||
| let final_name = { | ||
| let first = format!("{}.evf", base); | ||
| if !Path::new(&first).exists() { | ||
| first | ||
| } else { | ||
| let mut id = 2; | ||
| loop { | ||
| let name = format!("{}({}).evf", base, id); | ||
| if !Path::new(&name).exists() { | ||
| break name; | ||
| } | ||
| id += 1; | ||
| } | ||
| id += 1; | ||
| } | ||
| } | ||
| }; | ||
| // 后台线程写入文件 | ||
| let write_name = final_name.clone(); | ||
| thread::spawn(move || { | ||
| if let Err(e) = fs::write(&write_name, data) { | ||
| eprintln!("Failed to write evf file: {}", e); | ||
| } | ||
| }); | ||
| // 立刻返回,不阻塞 | ||
| final_name | ||
| } | ||
| } |
@@ -32,2 +32,3 @@ // 录像相关的类,局面在board | ||
| use crate::videos::byte_reader::ByteReader; | ||
| use crate::videos::types::{ | ||
@@ -37,3 +38,2 @@ ErrReadVideoReason, Event, GameDynamicParams, KeyDynamicParams, MouseEvent, StaticParams, | ||
| }; | ||
| use crate::videos::byte_reader::ByteReader; | ||
| /// 扫雷游戏状态机 | ||
@@ -377,6 +377,3 @@ /// 功能:整局游戏的全部信息。自动推导局面、计算数据、计时、保存文件等功能。 | ||
| // println!("{:?}, ", self.board); | ||
| assert!( | ||
| self.can_analyse, | ||
| "调用parse或扫完前,不能调用analyse方法" | ||
| ); | ||
| assert!(self.can_analyse, "调用parse或扫完前,不能调用analyse方法"); | ||
| // self.minesweeper_board | ||
@@ -395,3 +392,3 @@ let mut b = MinesweeperBoard::<Vec<Vec<i32>>>::new(self.board.clone()); | ||
| let old_state = b.game_board_state; | ||
| // println!(">>> {:?}, {:?}", svi.mouse, b.mouse_state); | ||
| // println!(">>> {:?}, {:?}", mouse_event.mouse, b.mouse_state); | ||
| let u_level = b | ||
@@ -719,4 +716,3 @@ .step( | ||
| impl ByteReader for BaseVideo<Vec<Vec<i32>>> { | ||
| impl ByteReader for BaseVideo<Vec<Vec<i32>>> { | ||
| fn raw_data(&self) -> &[u8] { | ||
@@ -731,3 +727,2 @@ &self.raw_data | ||
| pub trait NewBaseVideo<T> { | ||
@@ -1039,2 +1034,3 @@ fn new(file_name: T) -> Self; | ||
| self.game_board_state = GameBoardState::Loss; | ||
| self.is_completed = false; | ||
| self.gather_params_after_game(time_ms, None); | ||
@@ -1159,40 +1155,48 @@ Ok(0) | ||
| let num = 0; | ||
| // for e in &self.video_action_state_recorder { | ||
| // if num < 800 { | ||
| // if e.mouse != "mv" { | ||
| // println!( | ||
| // "time = {:?}, mouse = {:?}, x = {:?}, y = {:?}, level = {:?}", | ||
| // e.time, e.mouse, e.x, e.y, e.useful_level | ||
| // ); | ||
| // } | ||
| // } | ||
| // println!( | ||
| // "time = {:?}, mouse = {:?}, x = {:?}, y = {:?}, level = {:?}", | ||
| // e.time, e.mouse, e.x, e.y, e.useful_level | ||
| // ); | ||
| // if e.mouse != "mv" { | ||
| // println!( | ||
| // "my_board.step_flow(vec![({:?}, ({:?}, {:?}))]).unwrap();", | ||
| // // "video.step({:?}, ({:?}, {:?})).unwrap();", | ||
| // e.mouse, | ||
| // e.y / self.cell_pixel_size as u16, | ||
| // e.x / self.cell_pixel_size as u16 | ||
| // ); | ||
| // } | ||
| // num += 1; | ||
| // if e.mouse != "mv" { | ||
| // println!( | ||
| // "time = {:?}, mouse = {:?}, x = {:?}, y = {:?}", | ||
| // e.time, e.mouse, e.x, e.y | ||
| // ); | ||
| // e.prior_game_board | ||
| // .game_board | ||
| // .iter() | ||
| // .for_each(|v| println!("{:?}", v)); | ||
| // e.prior_game_board | ||
| // .poss | ||
| // .iter() | ||
| // .for_each(|v| println!("{:?}", v)); | ||
| // } | ||
| // } | ||
| for e in &self.video_action_state_recorder { | ||
| if num < 800 { | ||
| if let Some(Event::Mouse(mouse_event)) = &e.event { | ||
| if mouse_event.mouse != "mv" { | ||
| println!( | ||
| "time = {:?}, mouse = {:?}, x = {:?}, y = {:?}, level = {:?}", | ||
| e.time, mouse_event.mouse, mouse_event.x, mouse_event.y, e.useful_level | ||
| ); | ||
| } | ||
| } | ||
| // if e.mouse != "mv" { | ||
| // println!( | ||
| // "time = {:?}, mouse = {:?}, x = {:?}, y = {:?}, level = {:?}", | ||
| // e.time, e.mouse, e.x, e.y, e.useful_level | ||
| // ); | ||
| // } | ||
| } | ||
| // println!( | ||
| // "time = {:?}, mouse = {:?}, x = {:?}, y = {:?}, level = {:?}", | ||
| // e.time, e.mouse, e.x, e.y, e.useful_level | ||
| // ); | ||
| // if e.mouse != "mv" { | ||
| // println!( | ||
| // "my_board.step_flow(vec![({:?}, ({:?}, {:?}))]).unwrap();", | ||
| // // "video.step({:?}, ({:?}, {:?})).unwrap();", | ||
| // e.mouse, | ||
| // e.y / self.cell_pixel_size as u16, | ||
| // e.x / self.cell_pixel_size as u16 | ||
| // ); | ||
| // } | ||
| // num += 1; | ||
| // if e.mouse != "mv" { | ||
| // println!( | ||
| // "time = {:?}, mouse = {:?}, x = {:?}, y = {:?}", | ||
| // e.time, e.mouse, e.x, e.y | ||
| // ); | ||
| // e.prior_game_board | ||
| // .game_board | ||
| // .iter() | ||
| // .for_each(|v| println!("{:?}", v)); | ||
| // e.prior_game_board | ||
| // .poss | ||
| // .iter() | ||
| // .for_each(|v| println!("{:?}", v)); | ||
| // } | ||
| } | ||
| } | ||
@@ -1199,0 +1203,0 @@ pub fn print_comments(&self) { |
@@ -431,3 +431,4 @@ use crate::utils::refresh_board; | ||
| GameBoardState::Ready => match e { | ||
| "mv" => { | ||
| "mv" | "mc" | "mr" => { | ||
| // arbiter这个奇葩,录像可能以中键的按下和抬起开始 | ||
| return Ok(0); | ||
@@ -434,0 +435,0 @@ } |
@@ -285,3 +285,23 @@ // 测试录像分析模块 | ||
| #[test] | ||
| // cargo test --features rs -- --nocapture temp_avf_video_works | ||
| fn temp_avf_video_works() { | ||
| // 录像解析工具测试 | ||
| let mut video = | ||
| AvfVideo::new("fff.avf"); | ||
| let r = video.parse(); | ||
| assert_eq!(r.unwrap(), ()); | ||
| // video.data.print_event(); | ||
| video.data.analyse(); | ||
| println!("bbbv: {:?}", video.data.static_params.bbbv); | ||
| video.data.set_current_time(999.99); | ||
| println!("left: {:?}", video.data.get_left()); | ||
| println!("right: {:?}", video.data.get_right()); | ||
| println!("double: {:?}", video.data.get_double()); | ||
| } | ||
| #[test] | ||
| // cargo test --features rs -- --nocapture RmvVideo_works | ||
@@ -499,3 +519,4 @@ fn rmv_video_works() { | ||
| let test_file_name = video.save_to_evf_file("test"); | ||
| // println!("{:?}", test_file_name); | ||
| println!("{:?}", test_file_name); | ||
| _sleep_ms(50); | ||
| let mut video = EvfVideo::new(&test_file_name); | ||
@@ -502,0 +523,0 @@ let r = video.parse(); |
+1
-1
| Metadata-Version: 2.4 | ||
| Name: ms_toollib | ||
| Version: 1.5.1 | ||
| Version: 1.5.2 | ||
| Summary: Algorithms for minesweeper. | ||
@@ -5,0 +5,0 @@ Keywords: minesweeper,sweeper,probability,solver,3BV |
+1
-1
| [project] | ||
| name = "ms_toollib" | ||
| version = "1.5.1" | ||
| version = "1.5.2" | ||
| description = "Algorithms for minesweeper." | ||
@@ -5,0 +5,0 @@ readme = "readme.md" |
@@ -100,5 +100,5 @@ # This file is automatically @generated by Cargo. | ||
| name = "cc" | ||
| version = "1.2.47" | ||
| version = "1.2.49" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" | ||
| checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" | ||
| dependencies = [ | ||
@@ -372,5 +372,5 @@ "find-msvc-tools", | ||
| name = "libc" | ||
| version = "0.2.177" | ||
| version = "0.2.178" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" | ||
| checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" | ||
@@ -385,9 +385,9 @@ [[package]] | ||
| name = "libredox" | ||
| version = "0.1.10" | ||
| version = "0.1.11" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" | ||
| checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" | ||
| dependencies = [ | ||
| "bitflags", | ||
| "libc", | ||
| "redox_syscall", | ||
| "redox_syscall 0.6.0", | ||
| ] | ||
@@ -440,3 +440,3 @@ | ||
| "quote", | ||
| "syn 2.0.110", | ||
| "syn 2.0.111", | ||
| ] | ||
@@ -470,5 +470,5 @@ | ||
| name = "log" | ||
| version = "0.4.28" | ||
| version = "0.4.29" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" | ||
| checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" | ||
@@ -536,3 +536,3 @@ [[package]] | ||
| "itertools 0.6.5", | ||
| "ms_toollib 1.4.17", | ||
| "ms_toollib 1.5.2", | ||
| "pyo3", | ||
@@ -543,3 +543,3 @@ ] | ||
| name = "ms_toollib" | ||
| version = "1.4.17" | ||
| version = "1.5.2" | ||
| dependencies = [ | ||
@@ -635,3 +635,3 @@ "encoding_rs", | ||
| "libc", | ||
| "redox_syscall", | ||
| "redox_syscall 0.5.18", | ||
| "smallvec", | ||
@@ -683,3 +683,3 @@ "windows-link", | ||
| "quote", | ||
| "syn 2.0.110", | ||
| "syn 2.0.111", | ||
| ] | ||
@@ -770,5 +770,5 @@ | ||
| name = "pyo3" | ||
| version = "0.27.1" | ||
| version = "0.27.2" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "37a6df7eab65fc7bee654a421404947e10a0f7085b6951bf2ea395f4659fb0cf" | ||
| checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d" | ||
| dependencies = [ | ||
@@ -788,5 +788,5 @@ "indoc", | ||
| name = "pyo3-build-config" | ||
| version = "0.27.1" | ||
| version = "0.27.2" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "f77d387774f6f6eec64a004eac0ed525aab7fa1966d94b42f743797b3e395afb" | ||
| checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6" | ||
| dependencies = [ | ||
@@ -798,5 +798,5 @@ "target-lexicon", | ||
| name = "pyo3-ffi" | ||
| version = "0.27.1" | ||
| version = "0.27.2" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "2dd13844a4242793e02df3e2ec093f540d948299a6a77ea9ce7afd8623f542be" | ||
| checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089" | ||
| dependencies = [ | ||
@@ -809,5 +809,5 @@ "libc", | ||
| name = "pyo3-macros" | ||
| version = "0.27.1" | ||
| version = "0.27.2" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "eaf8f9f1108270b90d3676b8679586385430e5c0bb78bb5f043f95499c821a71" | ||
| checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02" | ||
| dependencies = [ | ||
@@ -817,3 +817,3 @@ "proc-macro2", | ||
| "quote", | ||
| "syn 2.0.110", | ||
| "syn 2.0.111", | ||
| ] | ||
@@ -823,5 +823,5 @@ | ||
| name = "pyo3-macros-backend" | ||
| version = "0.27.1" | ||
| version = "0.27.2" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "70a3b2274450ba5288bc9b8c1b69ff569d1d61189d4bff38f8d22e03d17f932b" | ||
| checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9" | ||
| dependencies = [ | ||
@@ -832,3 +832,3 @@ "heck", | ||
| "quote", | ||
| "syn 2.0.110", | ||
| "syn 2.0.111", | ||
| ] | ||
@@ -901,2 +901,11 @@ | ||
| [[package]] | ||
| name = "redox_syscall" | ||
| version = "0.6.0" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" | ||
| dependencies = [ | ||
| "bitflags", | ||
| ] | ||
| [[package]] | ||
| name = "regex" | ||
@@ -1014,3 +1023,3 @@ version = "1.12.2" | ||
| "quote", | ||
| "syn 2.0.110", | ||
| "syn 2.0.111", | ||
| ] | ||
@@ -1037,5 +1046,5 @@ | ||
| name = "simd-adler32" | ||
| version = "0.3.7" | ||
| version = "0.3.8" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" | ||
| checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" | ||
@@ -1084,5 +1093,5 @@ [[package]] | ||
| name = "syn" | ||
| version = "2.0.110" | ||
| version = "2.0.111" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" | ||
| checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" | ||
| dependencies = [ | ||
@@ -1475,5 +1484,5 @@ "proc-macro2", | ||
| name = "zerocopy" | ||
| version = "0.8.28" | ||
| version = "0.8.31" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc345afb90" | ||
| checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" | ||
| dependencies = [ | ||
@@ -1485,9 +1494,9 @@ "zerocopy-derive", | ||
| name = "zerocopy-derive" | ||
| version = "0.8.28" | ||
| version = "0.8.31" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27ac2cbc26" | ||
| checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" | ||
| dependencies = [ | ||
| "proc-macro2", | ||
| "quote", | ||
| "syn 2.0.110", | ||
| "syn 2.0.111", | ||
| ] |
@@ -403,3 +403,3 @@ use pyo3::exceptions::PyRuntimeError; | ||
| name = "mark_board", | ||
| signature = (game_board, remark) | ||
| signature = (game_board, remark = false) | ||
| )] | ||
@@ -406,0 +406,0 @@ fn py_mark_board(mut game_board: Vec<Vec<i32>>, remark: bool) -> PyResult<Vec<Vec<i32>>> { |
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
678452
0.24%