From 13589ea2814a44f8c25421dc9298f6e9f6cd1175 Mon Sep 17 00:00:00 2001 From: eee555 <2234208506@qq.com> Date: Tue, 16 Jul 2024 22:57:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8F=AF=E7=8C=9C=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B1=80=E9=9D=A2=E5=90=8E=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E6=B8=85=E9=9B=B6=E6=89=AB=E5=BC=80=E6=8C=87=E9=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/src/videos/base_video.rs | 31 ++++++++++---------- base/src/videos/minesweeper_board.rs | 6 ++++ base/tests/test_analyse.rs | 44 +++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/base/src/videos/base_video.rs b/base/src/videos/base_video.rs index 933ee0e..c3490ef 100644 --- a/base/src/videos/base_video.rs +++ b/base/src/videos/base_video.rs @@ -650,7 +650,16 @@ impl BaseVideo { pub fn set_board(&mut self, board: Vec>) -> Result { assert!(!board.is_empty()); match self.game_board_state { - GameBoardState::Playing | GameBoardState::Ready | GameBoardState::PreFlaging => { + GameBoardState::Ready | GameBoardState::PreFlaging => { + if self.width != board[0].len() || self.height != board.len() { + return Err(()); + } + } + GameBoardState::Playing => { + if self.mode != 9 && self.mode != 10 { + println!("{:?}", self.mode); + return Err(()); + } if self.width != board[0].len() || self.height != board.len() { return Err(()); } @@ -674,7 +683,8 @@ impl BaseVideo { self.level = 6; } self.board = SafeBoard::new(board); - self.minesweeper_board.board = self.board.clone(); + // self.minesweeper_board.board = self.board.clone(); + self.minesweeper_board.set_board(self.board.clone()); Ok(0) } } @@ -773,18 +783,7 @@ impl BaseVideo { T::Output: std::ops::Index, { let step_instant = Instant::now(); - // match self.game_board_state { - // GameBoardState::Ready | GameBoardState::PreFlaging => { - // let mut time_ms = step_instant - // .duration_since(self.video_start_instant) - // .as_millis() as u32; - // let mut time = time_ms as f64 / 1000.0; - // } - // } - // 这是和录像时间戳有关 - // let mut time_ms = step_instant - // .duration_since(self.video_start_instant) - // .as_millis() as u32; + let mut time_ms = time_ms_between(step_instant, self.video_start_instant); let mut time = time_ms as f64 / 1000.0; let old_state = self.minesweeper_board.game_board_state; @@ -865,7 +864,7 @@ impl BaseVideo { self.start_time = self.end_time.clone(); self.game_start_ms = time_ms; // println!("334") - } + } let t_ms = time_ms - self.game_start_ms; self.is_completed = true; let t = t_ms as f64 / 1000.0; @@ -1278,9 +1277,11 @@ impl BaseVideo { self.is_fair = is_fair; Ok(0) } + /// 可猜模式必须在ready时设置模式,其它模式扫完再设置也可以 pub fn set_mode(&mut self, mode: u16) -> Result { if self.game_board_state != GameBoardState::Loss && self.game_board_state != GameBoardState::Win + && self.game_board_state != GameBoardState::Ready { return Err(()); }; diff --git a/base/src/videos/minesweeper_board.rs b/base/src/videos/minesweeper_board.rs index 8c7d236..6929b16 100644 --- a/base/src/videos/minesweeper_board.rs +++ b/base/src/videos/minesweeper_board.rs @@ -160,6 +160,12 @@ impl MinesweeperBoard { ..MinesweeperBoard::::default() } } + /// 两种情况调用:游戏开始前、可猜模式(不做检查) + pub fn set_board(&mut self, board: SafeBoard) { + self.board = board; + self.pointer_x = 0; + self.pointer_y = 0; + } } impl MinesweeperBoard { diff --git a/base/tests/test_analyse.rs b/base/tests/test_analyse.rs index 231a249..62f0996 100644 --- a/base/tests/test_analyse.rs +++ b/base/tests/test_analyse.rs @@ -1,5 +1,5 @@ // 测试录像分析模块 -use ms_toollib::{AvfVideo, BaseVideo, EvfVideo, MinesweeperBoard, MvfVideo, RmvVideo}; +use ms_toollib::{AvfVideo, BaseVideo, EvfVideo, MinesweeperBoard, MvfVideo, RmvVideo, SafeBoard}; use std::thread; #[test] @@ -809,4 +809,46 @@ fn BaseVideo_works_5_1bv() { println!("时间毫秒:{:?}", video.get_rtime_ms()); println!("时间毫秒:{:?}", video.get_bbbv_s()); +} + + +#[test] +fn BaseVideo_works_set_board() { + let board = vec![ + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 1, 1], + vec![ 0, 0, 0, 0, 0, 0, 1, -1], + ]; + let board2 = vec![ + vec![ -1, 1, 0, 0, 0, 0, 0, 0], + vec![ 1, 1, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + vec![ 0, 0, 0, 0, 0, 0, 0, 0], + ]; + let mut video = BaseVideo::::new_before_game(board, 16); + video.set_mode(9).unwrap(); + video.step("lc", (97, 97)).unwrap(); + thread::sleep_ms(200); + video.step("lr", (97, 97)).unwrap(); + video.set_board(board2).unwrap(); + video.step("lc", (77, 77)).unwrap(); + thread::sleep_ms(200); + video.step("lr", (77, 77)).unwrap(); + + // video.generate_evf_v0_raw_data(); + // video.set_checksum([8; 32]).unwrap(); + // video.save_to_evf_file("test"); + + println!("局面:{:?}", video.get_game_board()); + println!("局面状态:{:?}", video.game_board_state); + } \ No newline at end of file