+++ /dev/null
-[toolchain]
-channel = "nightly-2022-07-24"
_ => {}
};
- 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 => {
pub struct Field(RefCell<u32>);
enum MergeResult {
- Merged,
+ Merged(u32),
Replaced,
Blocked,
Empty,
*s += 1;
*o = 0;
- return MergeResult::Merged;
+ return MergeResult::Merged(1 << *s);
}
MergeResult::Blocked
}
}
- pub fn step(&self, dir: Dir) -> bool {
+ pub fn step(&self, dir: Dir) -> Option<u32> {
let dir = match dir {
Dir::Up => -Pos::Y,
Dir::Down => Pos::Y,
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;
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 {
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;
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();
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,
'q' => break,
_ => continue,
}) {
+ score += sc;
board.spawn(&mut rng);
}
}