From d90e270cd5ef3986f91e9a7a60dc98eb85eb4dd0 Mon Sep 17 00:00:00 2001 From: cool-mist Date: Sun, 18 May 2025 00:09:11 +0530 Subject: [PATCH] Add difficulty levels --- src/game.rs | 123 ++++++++++++++++++++++++++++++++++++++------- src/game/button.rs | 4 +- src/main.rs | 8 +-- 3 files changed, 108 insertions(+), 27 deletions(-) diff --git a/src/game.rs b/src/game.rs index da8474a..6583509 100644 --- a/src/game.rs +++ b/src/game.rs @@ -31,12 +31,12 @@ pub struct Game { // Constants througout the game texture_res: Texture2D, num_squares: usize, - heading_font_size: f32, heading_text: String, // Update below on handle input state: GameState, debug: bool, + game_mode: GameMode, // Update below on window resize // Used for drawing the state @@ -45,7 +45,9 @@ pub struct Game { window_width: f32, squares: Vec, heading_rect: Rect, - btns: HashMap, + heading_font_size: f32, + gp_btns: HashMap, + mode_btns: HashMap, } struct GameSquare { @@ -64,6 +66,13 @@ pub enum ButtonAction { Next, } +#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] +pub enum GameMode { + Easy, + Medium, + Hard, +} + #[derive(Copy, Clone)] enum GameState { SelectSource(Option<(usize, usize)>), @@ -72,8 +81,10 @@ enum GameState { } impl Game { - pub fn new(board: Board, texture_res: Texture2D) -> Self { + pub fn new(texture_res: Texture2D) -> Self { let num_squares: usize = 4; + let game_mode = GameMode::Medium; + let board = Game::generate_puzzle(game_mode); Self { original_board: board.clone(), @@ -85,24 +96,27 @@ impl Game { num_squares, texture_res, state: GameState::SelectSource(None), + game_mode, debug: false, - btns: HashMap::new(), + gp_btns: HashMap::new(), + mode_btns: HashMap::new(), window_height: 0., window_width: 0., square_width: 0., } } - pub fn draw(&self) { + pub fn draw(&mut self) { + self.update_window_size(); self.draw_heading(); self.draw_board(); self.draw_buttons(); self.draw_debug(); } - pub fn update_window_size(&mut self) { - let new_height = math::clamp(screen_height(), 100.0, 10000.0); - let new_width = math::clamp(screen_width(), 100.0, 10000.0); + fn update_window_size(&mut self) { + let new_height = math::clamp(screen_height(), 200.0, 10000.0); + let new_width = math::clamp(screen_width(), 200.0, 10000.0); if new_height == self.window_height && new_width == self.window_width { return; } @@ -114,7 +128,7 @@ impl Game { pub fn handle_input(&mut self) { let mut btn_clicked = None; - for btn in &mut self.btns { + for btn in &mut self.gp_btns { btn.1.handle_input(); if btn.1.is_clicked() { btn_clicked = Some(btn.0.clone()); @@ -127,6 +141,23 @@ impl Game { ButtonAction::Reset => self.reset(), ButtonAction::Next => self.next_puzzle(), } + } else { + for btn in &mut self.mode_btns { + btn.1.handle_input(); + if btn.1.is_clicked() { + self.game_mode = *btn.0; + self.next_puzzle(); + break; + } + } + } + + for btn in &mut self.mode_btns { + if self.game_mode == *btn.0 { + btn.1.is_active = false; + } else { + btn.1.is_active = true; + } } if is_key_released(KeyCode::D) { @@ -238,7 +269,11 @@ impl Game { } fn draw_buttons(&self) { - for btn in &self.btns { + for btn in &self.gp_btns { + btn.1.draw(); + } + + for btn in &self.mode_btns { btn.1.draw(); } } @@ -313,7 +348,7 @@ impl Game { self.squares = rects; - let btn_h = 0.08 * self.window_height; + let btn_h = 0.08 * min_dimension; let btn_w = board_width * 0.2; let btn_y = board_width + board_y + 0.3 * self.square_width; @@ -321,7 +356,7 @@ impl Game { let reset_btn = Button::new( "Reset", Rect::new(board_x + btn_x_offset, btn_y, btn_w, btn_h), - ButtonColor::Yellow, + ButtonColor::Red, ); let mut next_btn = Button::new( "Next", @@ -336,9 +371,49 @@ impl Game { next_btn.is_active = false; - self.btns = HashMap::new(); - self.btns.insert(ButtonAction::Next, next_btn); - self.btns.insert(ButtonAction::Reset, reset_btn); + self.gp_btns = HashMap::new(); + self.gp_btns.insert(ButtonAction::Next, next_btn); + self.gp_btns.insert(ButtonAction::Reset, reset_btn); + + let easy_btn = Button::new( + "Easy", + Rect::new((board_x - btn_w) / 2., (board_y + btn_h) / 2., btn_w, btn_h), + ButtonColor::Grey, + ); + + let medium_btn = Button::new( + "Medium", + Rect::new( + (board_x - btn_w) / 2., + (board_y + board_width) / 2., + btn_w, + btn_h, + ), + ButtonColor::Grey, + ); + + let hard_button = Button::new( + "Hard", + Rect::new( + (board_x - btn_w) / 2., + (board_y + board_width), + btn_w, + btn_h, + ), + ButtonColor::Grey, + ); + + self.mode_btns = HashMap::new(); + self.mode_btns.insert(GameMode::Easy, easy_btn); + self.mode_btns.insert(GameMode::Medium, medium_btn); + self.mode_btns.insert(GameMode::Hard, hard_button); + + for btn in &mut self.mode_btns { + btn.1.is_active = true; + if self.game_mode == *btn.0 { + btn.1.is_active = false; + } + } } fn handle_select_source( @@ -428,7 +503,7 @@ impl Game { self.reset_squares(); if self.board.game_state == BoardState::Won { let next_btn = self - .btns + .gp_btns .get_mut(&ButtonAction::Next) .expect("Cannot find next button"); next_btn.is_active = true; @@ -451,7 +526,7 @@ impl Game { self.reset_squares(); let next_button = self - .btns + .gp_btns .get_mut(&ButtonAction::Next) .expect("Cannot find next button"); next_button.is_active = false; @@ -461,8 +536,7 @@ impl Game { fn next_puzzle(&mut self) { self.reset(); - let generate = generator::generate(6, 100, &MacroquadRandAdapter); - let board = generate.board().expect("No puzzle was generated"); + let board = Game::generate_puzzle(self.game_mode); self.original_board = board.clone(); self.board = board; } @@ -494,6 +568,17 @@ impl Game { BLACK, ); } + + fn generate_puzzle(mode: GameMode) -> Board { + let piece_count = match mode { + GameMode::Easy => 3, + GameMode::Medium => 5, + GameMode::Hard => 7, + }; + + let generate = generator::generate(piece_count, 100, &MacroquadRandAdapter); + generate.board().expect("No puzzle was generated") + } } impl Display for GameState { diff --git a/src/game/button.rs b/src/game/button.rs index a35092c..3f43c99 100644 --- a/src/game/button.rs +++ b/src/game/button.rs @@ -13,7 +13,7 @@ pub struct Button { pub enum ButtonColor { Grey, Green, - Yellow, + Red, } impl ButtonColor { @@ -21,7 +21,7 @@ impl ButtonColor { match self { ButtonColor::Grey => Color::from_rgba(140, 140, 140, 200), ButtonColor::Green => Color::from_rgba(112, 140, 141, 200), - ButtonColor::Yellow => Color::from_rgba(123, 70, 85, 200), + ButtonColor::Red => Color::from_rgba(123, 70, 85, 200), } } diff --git a/src/main.rs b/src/main.rs index 888c87d..c28ea0b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,6 @@ -use game::{Game, MacroquadRandAdapter}; +use game::Game; use macroquad::prelude::*; use miniquad::date; -use sol_chess::generator; mod game; @@ -26,7 +25,6 @@ async fn main() { loop { clear_background(background_color); game.handle_input(); - game.update_window_size(); game.draw(); next_frame().await } @@ -37,9 +35,7 @@ async fn init() -> Game { let texture_res = Texture2D::from_file_with_format(&texture_bytes[..], None); texture_res.set_filter(FilterMode::Nearest); build_textures_atlas(); - let generate = generator::generate(6, 100, &MacroquadRandAdapter); - let board = generate.board().expect("No puzzle was generated"); - let game = Game::new(board, texture_res); + let game = Game::new(texture_res); game }