From c5231416036cdf5f75e805f9616416975c7f4e32 Mon Sep 17 00:00:00 2001 From: kirbylife Date: Tue, 18 Jun 2019 13:41:33 -0500 Subject: [PATCH] added game generator and key to flag the boxes --- src/main.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 3b5b8ae..07d29f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,17 +5,64 @@ license: GPLv2 extern crate ncurses; +extern crate rand; use ncurses::*; +use rand::Rng; +use std::collections::LinkedList; const ROWS: usize = 15; const COLUMNS: usize = 10; const MINES: i32 = ((ROWS * COLUMNS) as i32 * 20 / 100); +fn get_arround(pivot: [usize; 2]) -> LinkedList<[usize; 2]> { + // Returns a list with the coordinates around the pivot ignoring the ones that come off the board + let mut list: LinkedList<[usize; 2]> = LinkedList::new(); + for r in (pivot[0] as i32 - 1)..(pivot[0] as i32 + 2) { + for c in (pivot[1] as i32- 1)..(pivot[1] as i32 + 2) { + if r >= 0 && r < ROWS as i32 && c >= 0 && c < COLUMNS as i32 { + list.push_front([r as usize,c as usize]); + } + } + } + list +} + +fn gen_game(mut counter: i32) -> [[i8; COLUMNS]; ROWS] { + // returns a matrix with a board already with the mines placed at random + // -1: box with mine + // 0-8: box without mine + let mut rng = rand::thread_rng(); + let mut game = [[0 as i8; COLUMNS]; ROWS]; + while counter != 0 { + let rnd_row = rng.gen_range(0, ROWS); + let rnd_column = rng.gen_range(0, COLUMNS); + if game[rnd_row][rnd_column] == 0 { + game[rnd_row][rnd_column] = -1; + counter -= 1; + } + } + for (i, row) in game.clone().iter().enumerate() { + for (j, item) in row.iter().enumerate() { + if item != &-1 { + let mut counter: i8 = 0; + for x in get_arround([i, j]).iter() { + if game[x[0] as usize][x[1] as usize] == -1 { + counter += 1; + } + } + game[i][j] = counter; + } + } + } + game +} + fn main() { let mut running = true; let mut board = [['-'; COLUMNS]; ROWS]; + let game = gen_game(MINES); let mut pivot = [0 as usize; 2]; initscr(); raw(); @@ -43,6 +90,7 @@ fn main() { }; addstr("\n"); } + addstr(format!("{} - {}\n", pivot[0], pivot[1]).as_ref()); let ch = getch(); if ch == KEY_UP { // Go up @@ -68,7 +116,16 @@ fn main() { pivot[1] += 1; } } - else if ch == 'q' as i32 || ch == 'Q' as i32 { + else if ch == 'f' as i32 || ch == 'F' as i32 { + // Flag a box with possibly a mine + if board[pivot[0]][pivot[1]] == '#' { + board[pivot[0]][pivot[1]] = '-'; + } + else if board[pivot[0]][pivot[1]] == '-' { + board[pivot[0]][pivot[1]] = '#'; + } + } + else if ch == 'q' as i32 || ch == 'Q' as i32 { // if you press q, the game ends break; }