minsweeper_rs/solver/
start.rs1use std::fmt::{Display, Formatter};
2use crate::{CellType, GameState, GameStatus, Minsweeper};
3use crate::solver::{GameResult, Logic, Move, Solver};
4
5#[derive(Copy, Clone, Debug)]
6pub struct SafeStart;
7
8impl Solver for SafeStart {
9
10 fn solve(&self, _game_state: &GameState) -> Option<Move> {
11 None
12 }
13
14 fn solve_game(&self, minsweeper: &mut dyn Minsweeper) -> GameResult {
15 match minsweeper.gamestate().status {
16 GameStatus::Playing | GameStatus::Won => GameResult::Won,
17 GameStatus::Lost => GameResult::Lost,
18 GameStatus::Never => GameResult::Resigned
19 }
20 }
21}
22
23#[derive(Copy, Clone, Debug)]
24pub struct ZeroStart;
25
26impl Solver for ZeroStart {
27
28 fn solve(&self, _game_state: &GameState) -> Option<Move> {
29 None
30 }
31
32 fn solve_game(&self, minsweeper: &mut dyn Minsweeper) -> GameResult {
33 match minsweeper.gamestate().status {
34 GameStatus::Playing if minsweeper.gamestate().board
35 .iter()
36 .any(|e| matches!(e.cell_type, CellType::Safe(0))) => GameResult::Won,
37 GameStatus::Playing => GameResult::Lost,
38 GameStatus::Won => GameResult::Won,
39 GameStatus::Lost => GameResult::Lost,
40 GameStatus::Never => GameResult::Resigned
41 }
42 }
43}
44
45#[derive(Copy, Clone, Debug)]
46pub struct WinStart;
47
48impl Solver for WinStart {
49
50 fn solve(&self, _game_state: &GameState) -> Option<Move> {
51 None
52 }
53
54 fn solve_game(&self, minsweeper: &mut dyn Minsweeper) -> GameResult {
55 match minsweeper.gamestate().status {
56 GameStatus::Won => GameResult::Won,
57 GameStatus::Lost => GameResult::Lost,
58 GameStatus::Playing | GameStatus::Never => GameResult::Resigned
59 }
60 }
61}
62
63#[derive(Copy, Clone, Debug)]
64pub enum StartLogic {}
65
66impl Display for StartLogic {
67 fn fmt(&self, _f: &mut Formatter<'_>) -> std::fmt::Result {
68 unreachable!()
69 }
70}
71
72impl Logic for StartLogic {
73
74}