From: Elias Fleckenstein Date: Mon, 12 Sep 2022 19:24:24 +0000 (+0200) Subject: Add score display X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=81784859d61d2d6fc29f6e908612438a94d9ed1d;p=rs2048.git Add score display --- diff --git a/rust-toolchain.toml b/rust-toolchain.toml deleted file mode 100644 index ff3a1a1..0000000 --- a/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "nightly-2022-07-24" diff --git a/src/display.rs b/src/display.rs index fba426a..16e6fb9 100644 --- a/src/display.rs +++ b/src/display.rs @@ -53,26 +53,15 @@ fn write_line(stdout: &mut std::io::Stdout, vec: &[u32], mode: Mode) -> crosster _ => {} }; - if let Mode::Data_ = mode { - if n == 0 { - queue!(stdout, Print(" ".repeat(FIELD_WIDTH - 2)))?; - } else { - queue!( - stdout, - Print(format!("{:^w$}", 1 << n, w = FIELD_WIDTH - 2)) - )?; - } - } else { - queue!( - stdout, - Print(match mode { - Mode::Roof_ | Mode::Base_ => "━".repeat(FIELD_WIDTH), - Mode::Floor => "─".repeat(FIELD_WIDTH), - Mode::Empty => " ".repeat(FIELD_WIDTH - 2), - Mode::Data_ => panic!("unreachable"), - }) - )?; - } + queue!( + stdout, + Print(match mode { + Mode::Roof_ | Mode::Base_ => "━".repeat(FIELD_WIDTH), + Mode::Floor => "─".repeat(FIELD_WIDTH), + Mode::Data_ if n != 0 => format!("{:^w$}", 1 << n, w = FIELD_WIDTH - 2), + Mode::Empty | Mode::Data_ => " ".repeat(FIELD_WIDTH - 2), + }) + )?; match mode { Mode::Data_ | Mode::Empty => { diff --git a/src/game.rs b/src/game.rs index 19940cd..bec487a 100644 --- a/src/game.rs +++ b/src/game.rs @@ -15,7 +15,7 @@ impl Swap for Pos { pub struct Field(RefCell); enum MergeResult { - Merged, + Merged(u32), Replaced, Blocked, Empty, @@ -49,7 +49,7 @@ impl Field { *s += 1; *o = 0; - return MergeResult::Merged; + return MergeResult::Merged(1 << *s); } MergeResult::Blocked @@ -78,7 +78,7 @@ impl Board { } } - pub fn step(&self, dir: Dir) -> bool { + pub fn step(&self, dir: Dir) -> Option { let dir = match dir { Dir::Up => -Pos::Y, Dir::Down => Pos::Y, @@ -94,7 +94,7 @@ impl Board { let start = (dir + Pos::ONE) / 2 * (self.size - Pos::ONE); - let mut moved = false; + let mut score = None; for row in 0..len_row { let start_row = start + row * step_row; @@ -106,21 +106,19 @@ impl Board { let field2 = self.get(start_row + col2 * step_col); match field1.merge(field2) { - MergeResult::Merged => { - moved = true; + MergeResult::Merged(sc) => { + score = Some(score.unwrap_or(0) + sc); break; } - MergeResult::Replaced => { - moved = true; - } + MergeResult::Replaced => score = Some(score.unwrap_or(0)), MergeResult::Blocked => break, - MergeResult::Empty => {} + MergeResult::Empty => continue, } } } } - moved + score } pub fn get(&self, pos: Pos) -> &Field { diff --git a/src/main.rs b/src/main.rs index e04f92c..d698ed4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ pub mod display; pub mod game; -use crossterm::{cursor, event, execute, queue, terminal}; +use crossterm::{cursor, event, execute, queue, style, terminal}; use game::{Board, Dir::*, Pos}; use std::io::Write; @@ -17,11 +17,18 @@ fn main() { board.spawn(&mut rng); board.spawn(&mut rng); + let mut score = 0; + loop { queue!( stdout, terminal::Clear(terminal::ClearType::All), - cursor::MoveTo(0, 0) + cursor::MoveTo(0, 0), + style::SetAttribute(style::Attribute::Bold), + style::Print("Score: ".to_string()), + style::SetAttribute(style::Attribute::Reset), + style::Print(score.to_string()), + cursor::MoveToNextLine(1), ) .unwrap(); display::display_board(&mut stdout, &board).unwrap(); @@ -31,7 +38,7 @@ fn main() { match evt { event::Event::Key(event::KeyEvent { code, .. }) => match code { event::KeyCode::Char(ch) => { - if board.step(match ch.to_ascii_lowercase() { + if let Some(sc) = board.step(match ch.to_ascii_lowercase() { 'w' => Up, 'a' => Left, 's' => Down, @@ -39,6 +46,7 @@ fn main() { 'q' => break, _ => continue, }) { + score += sc; board.spawn(&mut rng); } }