diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..db3975d
Binary files /dev/null and b/.DS_Store differ
diff --git a/src/board.rs b/src/board.rs
index 78cfaea..78528f2 100644
--- a/src/board.rs
+++ b/src/board.rs
@@ -70,7 +70,7 @@ impl Board {
lines_cleared += 1;
} else {
new_grid[new_y] = self.grid[y].clone();
- new_y -= 1;
+ new_y = new_y.wrapping_sub(1);
}
}
diff --git a/src/game.rs b/src/game.rs
index a6d76de..4af7efc 100644
--- a/src/game.rs
+++ b/src/game.rs
@@ -32,6 +32,7 @@ pub struct Game {
drop_interval: u64,
last_drop: u64,
status: GameStatus,
+ _input_handler: input::InputHandler,
input_rx: mpsc::Receiver,
}
@@ -40,7 +41,7 @@ impl Game {
pub fn new() -> io::Result {
let current_piece = Piece::new(PieceType::random());
let next_piece = Piece::new(PieceType::random());
- let (_, input_rx) = input::InputHandler::new();
+ let (_input_handler, input_rx) = input::InputHandler::new();
Ok(Game {
board: Board::new(),
@@ -52,6 +53,7 @@ impl Game {
drop_interval: DROP_INTERVAL,
last_drop: 0,
status: GameStatus::Running,
+ _input_handler,
input_rx,
})
}
@@ -87,9 +89,9 @@ impl Game {
self.render(&mut stdout)?;
// Небольшая пауза для контроля FPS
- let elapsed = last_tick.duration_since(now).as_millis() as u64;
- if elapsed < 1000 / FPS {
- std::thread::sleep(Duration::from_millis(1000 / FPS - elapsed));
+ let frame_time = Instant::now().duration_since(last_tick).as_millis() as u64;
+ if frame_time < 1000 / FPS {
+ std::thread::sleep(Duration::from_millis(1000 / FPS - frame_time));
}
}
@@ -235,12 +237,12 @@ impl Game {
/// Рендер игры
fn render(&self, stdout: &mut Stdout) -> io::Result<()> {
- stdout.write_all(b"\x1B[2J")?; // Очистка экрана
+ stdout.write_all(b"\x1B[H")?; // Курсор в начало экрана
// Заголовок
- writeln!(
+ write!(
stdout,
- "Tetris - Score: {} - Lines: {} - Level: {}",
+ "Tetris - Score: {} - Lines: {} - Level: {}\x1B[K\r\n",
self.score, self.lines_cleared, self.level
)?;
@@ -264,7 +266,7 @@ impl Game {
}
}
}
- stdout.write_all(b"|\n")?;
+ stdout.write_all(b"|\x1B[K\r\n")?;
}
// Нижняя граница
@@ -272,14 +274,14 @@ impl Game {
for _ in 0..board::BOARD_WIDTH {
stdout.write_all(b"-")?;
}
- stdout.write_all(b"+\n")?;
+ stdout.write_all(b"+\x1B[K\r\n")?;
// Следующая фигура
- writeln!(stdout, "Next:")?;
+ write!(stdout, "Next:\x1B[K\r\n")?;
self.render_preview(stdout, &self.next_piece)?;
// Управление
- writeln!(stdout, "Controls: Arrow Keys - Move | Space - Drop | Q - Quit")?;
+ write!(stdout, "Controls: Arrow Keys - Move | Space - Drop | Q - Quit\x1B[K\r\n")?;
stdout.flush()?;
Ok(())
@@ -305,7 +307,7 @@ impl Game {
stdout.write_all(b" ")?;
}
}
- stdout.write_all(b"\n")?;
+ stdout.write_all(b"\x1B[K\r\n")?;
}
Ok(())
}