improved display, added headline with infos on game

This commit is contained in:
JOLIMAITRE Matthieu 2022-04-04 19:10:22 +03:00
parent 63d8fe2470
commit 506d1570f3
3 changed files with 52 additions and 10 deletions

View file

@ -58,6 +58,7 @@ impl Error for GameError {}
pub struct Game { pub struct Game {
board: Grid, board: Grid,
score: usize, score: usize,
turn_index: usize,
spawn_per_turn: usize, spawn_per_turn: usize,
} }
@ -71,6 +72,7 @@ impl Game {
Self { Self {
board: Grid::new(size), board: Grid::new(size),
score: 0, score: 0,
turn_index: 0,
spawn_per_turn, spawn_per_turn,
} }
} }
@ -83,11 +85,16 @@ impl Game {
self.score self.score
} }
pub fn get_turn_index(&self) -> usize {
self.turn_index
}
pub fn turn(&mut self, movement: Move) -> Result<(), GameError> { pub fn turn(&mut self, movement: Move) -> Result<(), GameError> {
self.perform_move(movement); self.perform_move(movement);
for _ in 0..self.spawn_per_turn { for _ in 0..self.spawn_per_turn {
self.spawn_random()?; self.spawn_random()?;
} }
self.turn_index += 1;
Ok(()) Ok(())
} }

View file

@ -5,7 +5,7 @@ use crate::lib::{
game::{self, Game, GameError}, game::{self, Game, GameError},
}; };
use super::grid_displayer::GridDisplayer; use super::{clear_term, grid_displayer::GridDisplayer};
pub struct Rules { pub struct Rules {
display: bool, display: bool,
@ -83,27 +83,46 @@ impl GameManager {
} }
pub fn turn(&mut self) -> Result<(), GameError> { 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 {
if self.display_to_skip == 0 { 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; self.display_to_skip = self.display_skips;
} else { } else {
self.display_to_skip -= 1; 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)?; self.game.turn(movement)?;
thread::sleep(self.turn_duration);
Ok(()) Ok(())
} }
pub fn refresh_display(&self) { pub fn print_display(&self) {
if self.clear_term { let headline_display = self.get_headline_display();
super::clear_term(); println!("{headline_display}");
}
let grid = self.game.get_board(); let grid = self.game.get_board();
let text = self.grid_displayer.display(grid); let grid_display = self.grid_displayer.display(grid);
println!("{text}"); 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> { pub fn play_all(&mut self) -> Result<(), GameError> {

View file

@ -94,4 +94,20 @@ impl Grid {
self.tiles[dst_y][dst_x] = src; self.tiles[dst_y][dst_x] = src;
self.tiles[src_y][src_x] = Tile::new_empty(); 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)
}
} }