From 506d1570f33bdcbba5608d0cd768e9aa33b7aa1d Mon Sep 17 00:00:00 2001 From: JOLIMAITRE Matthieu Date: Mon, 4 Apr 2022 19:10:22 +0300 Subject: [PATCH] improved display, added headline with infos on game --- src/lib/game.rs | 7 +++++++ src/lib/game_manager.rs | 39 +++++++++++++++++++++++++++++---------- src/lib/grid.rs | 16 ++++++++++++++++ 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/lib/game.rs b/src/lib/game.rs index 6949cab..0b406fb 100644 --- a/src/lib/game.rs +++ b/src/lib/game.rs @@ -58,6 +58,7 @@ impl Error for GameError {} pub struct Game { board: Grid, score: usize, + turn_index: usize, spawn_per_turn: usize, } @@ -71,6 +72,7 @@ impl Game { Self { board: Grid::new(size), score: 0, + turn_index: 0, spawn_per_turn, } } @@ -83,11 +85,16 @@ impl Game { self.score } + pub fn get_turn_index(&self) -> usize { + self.turn_index + } + pub fn turn(&mut self, movement: Move) -> Result<(), GameError> { self.perform_move(movement); for _ in 0..self.spawn_per_turn { self.spawn_random()?; } + self.turn_index += 1; Ok(()) } diff --git a/src/lib/game_manager.rs b/src/lib/game_manager.rs index 03da2ad..4dd75bd 100644 --- a/src/lib/game_manager.rs +++ b/src/lib/game_manager.rs @@ -5,7 +5,7 @@ use crate::lib::{ game::{self, Game, GameError}, }; -use super::grid_displayer::GridDisplayer; +use super::{clear_term, grid_displayer::GridDisplayer}; pub struct Rules { display: bool, @@ -83,27 +83,46 @@ impl GameManager { } pub fn turn(&mut self) -> Result<(), GameError> { + self.display_conditionnally(); + self.game_turn()?; + thread::sleep(self.turn_duration); + Ok(()) + } + + fn display_conditionnally(&mut self) { if self.display { if self.display_to_skip == 0 { - self.refresh_display(); + if self.clear_term { + clear_term(); + } + self.print_display(); self.display_to_skip = self.display_skips; } else { self.display_to_skip -= 1; } } - let movement = self.controller.next_move(self.game.get_board())?; + } + + fn game_turn(&mut self) -> Result<(), GameError> { + let board = self.game.get_board(); + let movement = self.controller.next_move(board)?; self.game.turn(movement)?; - thread::sleep(self.turn_duration); Ok(()) } - pub fn refresh_display(&self) { - if self.clear_term { - super::clear_term(); - } + pub fn print_display(&self) { + let headline_display = self.get_headline_display(); + println!("{headline_display}"); let grid = self.game.get_board(); - let text = self.grid_displayer.display(grid); - println!("{text}"); + let grid_display = self.grid_displayer.display(grid); + println!("{grid_display}"); + } + + fn get_headline_display(&self) -> String { + let score = self.game.get_score(); + let turn = self.game.get_turn_index(); + let biggest_tile = self.game.get_board().biggest_value(); + format!("score: {score:>12} | biggest tile: {biggest_tile:>12} | turn: {turn:>12}") } pub fn play_all(&mut self) -> Result<(), GameError> { diff --git a/src/lib/grid.rs b/src/lib/grid.rs index 646f934..53263bc 100644 --- a/src/lib/grid.rs +++ b/src/lib/grid.rs @@ -94,4 +94,20 @@ impl Grid { self.tiles[dst_y][dst_x] = src; self.tiles[src_y][src_x] = Tile::new_empty(); } + + /// + /// get the biggest value of the board + /// + pub fn biggest_value(&self) -> usize { + self.tiles() + .iter() + .map(|row| { + row.iter() + .filter_map(|tile| tile.value()) + .reduce(|a, b| a.max(b)) + }) + .filter_map(|value| value) + .reduce(|a, b| a.max(b)) + .unwrap_or(0) + } }