]> git.lizzy.rs Git - rs2048.git/blob - src/main.rs
e04f92c38348d32ef34b63a4c1165ae7663cd825
[rs2048.git] / src / main.rs
1 pub mod display;
2 pub mod game;
3
4 use crossterm::{cursor, event, execute, queue, terminal};
5 use game::{Board, Dir::*, Pos};
6 use std::io::Write;
7
8 fn main() {
9     let mut rng = rand::thread_rng();
10
11     let mut stdout = std::io::stdout();
12     queue!(stdout, terminal::EnterAlternateScreen, cursor::Hide).unwrap();
13
14     terminal::enable_raw_mode().unwrap();
15
16     let board = Board::new(Pos::new(4, 4));
17     board.spawn(&mut rng);
18     board.spawn(&mut rng);
19
20     loop {
21         queue!(
22             stdout,
23             terminal::Clear(terminal::ClearType::All),
24             cursor::MoveTo(0, 0)
25         )
26         .unwrap();
27         display::display_board(&mut stdout, &board).unwrap();
28         stdout.flush().unwrap();
29
30         if let Ok(evt) = event::read() {
31             match evt {
32                 event::Event::Key(event::KeyEvent { code, .. }) => match code {
33                     event::KeyCode::Char(ch) => {
34                         if board.step(match ch.to_ascii_lowercase() {
35                             'w' => Up,
36                             'a' => Left,
37                             's' => Down,
38                             'd' => Right,
39                             'q' => break,
40                             _ => continue,
41                         }) {
42                             board.spawn(&mut rng);
43                         }
44                     }
45                     _ => {}
46                 },
47                 _ => {}
48             }
49         } else {
50             break;
51         }
52     }
53
54     terminal::disable_raw_mode().unwrap();
55     execute!(stdout, cursor::Show, terminal::LeaveAlternateScreen).unwrap();
56 }