added control display
1 files changed, 35 insertions(+), 25 deletions(-)

M src/main.rs
M src/main.rs +35 -25
@@ 93,7 93,7 @@ fn main() {
             unreachable!()
         })
     } else {
-        maxy as usize
+        maxy as usize - 1
     };
     let cols = if matches.opt_present(ARG_COLS) {
         matches.opt_str(ARG_COLS).unwrap().parse::<usize>().unwrap_or_else(|_| {

          
@@ 159,48 159,57 @@ fn main() {
         Border::Single
     };
 
-    let game_window = newwin(rows as i32, cols as i32, maxy / 2 - rows as i32 / 2, maxx / 2 - cols as i32 / 2);
     let mut cells = vec![vec![false; cols]; rows];
     for row in &mut cells[..] {
         for col in &mut row[..] {
             *col = rand::random::<bool>();
         }
     }
-    let mut game = Game { cells: cells, dead: dead, alive: alive, border: border, window: game_window };
+    let mut game = Game { cells: cells, dead: dead, alive: alive, border: border, window: newwin(rows as i32, cols as i32, maxy / 2 - rows as i32 / 2, maxx / 2 - cols as i32 / 2) };
 
-    let mut quit = false;
     let mut paused = false;
-    let mut last_time = time::precise_time_s();
-    let mut render = |delta| {
-        game.render(delta);
+    'game_loop: loop {
+        let before_render = time::precise_time_s();
+
+        game.render();
+        let mut game_window_beg = (0i32, 0i32);
+        getbegyx(game.window, &mut game_window_beg.0, &mut game_window_beg.1);
+        game_window_beg.0 += rows as i32;
+        mv(game_window_beg.0, game_window_beg.1);
+        clrtoeol();
+        addstr(&format!(
+            "exit (q)    {paused} (p){next}",
+            paused = if paused { "resume" } else { "pause" },
+            next = if paused { "  next (n)" } else { "" })
+        );
         refresh();
         wrefresh(game.window);
-    };
-    while !quit {
-        let time = time::precise_time_s();
-        let delta = time - last_time;
 
-        if !paused {
-            render(delta);
+        loop {
+            match getch() as u8 as char {
+                'q' => break 'game_loop,
+                'p' => {
+                    paused = !paused;
+                    nodelay(stdscr, !paused);
+                    continue 'game_loop;
+                },
+                'n' => break,
+                _ => if paused { continue } else { break }
+            }
         }
 
-        last_time = time::precise_time_s();
-        let render_duration = last_time - time;
+        game.update();
+
+        let after_render = time::precise_time_s();
+        let render_duration = after_render - before_render;
 
         let sleep = frame_duration - f64::min(render_duration, frame_duration);
         if sleep > 0. {
             std::thread::sleep_ms((sleep * 1000.) as u32);
         }
-
-        match getch() as u8 as char {
-            'q' => quit = true,
-            'p' => paused = !paused,
-            'n' if paused => render(delta),
-            _ => {}
-        }
     }
 
-    delwin(game_window);
+    delwin(game.window);
     end_ncurses();
 }
 

          
@@ 214,8 223,7 @@ struct Game {
 
 impl Game {
 
-    #[allow(unused_variables)]
-    fn render(&mut self, delta: f64) {
+    fn update(&mut self) {
         let count_neighbors = |cells: &Vec<Vec<bool>>, row, col| {
             let mut neighbors = 0;
             for row_off in -1..2 {

          
@@ 261,7 269,9 @@ impl Game {
                 }
             }
         }
+    }
 
+    fn render(&self) {
         for row in 0..self.cells.len() {
             for col in 0..self.cells[row].len() {
                 let cell_char = if self.cells[row][col] { self.alive } else { self.dead } as u64;