Added timer so you can have a highscore rustsweeper

This commit is contained in:
deadvey 2025-01-06 02:52:34 +00:00
parent 8ed27b637a
commit 87af9b73a0

View File

@ -2,9 +2,11 @@ use std::io::{stdin,stdout,Write};
use rand::Rng; use rand::Rng;
use colored::*; use colored::*;
use console::Term; use console::Term;
use std::time::Instant;
fn output_board(board: &Vec<Vec<i64>>, state: &Vec<Vec<char>>, x_hovered: i64, y_hovered: i64) { fn output_board(board: &Vec<Vec<i64>>, state: &Vec<Vec<char>>, x_hovered: i64, y_hovered: i64) {
print!("{}[2J", 27 as char); let mut output: String = "".to_string();
for y in 0..board.len() { for y in 0..board.len() {
for x in 0..board[y].len() { for x in 0..board[y].len() {
let background_color: u8; let background_color: u8;
@ -17,52 +19,54 @@ fn output_board(board: &Vec<Vec<i64>>, state: &Vec<Vec<char>>, x_hovered: i64, y
} }
if x == x_hovered as usize && y == y_hovered as usize { if x == x_hovered as usize && y == y_hovered as usize {
print!("{}", "X".truecolor(0,0,0).on_truecolor(background_color,background_color,background_color)); output.push_str(&"X".truecolor(0,0,0).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if state[y][x] == 'u' { else if state[y][x] == 'u' {
if board[y][x] == -1 { if board[y][x] == -1 {
print!("{}","".truecolor(128,64,0).on_truecolor(background_color,background_color,background_color)); output.push_str(&"".truecolor(128,64,0).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if board[y][x] == 0 { else if board[y][x] == 0 {
print!("{}"," ".on_truecolor(background_color,background_color,background_color)); output.push_str(&" ".on_truecolor(background_color,background_color,background_color).to_string());
} }
else if board[y][x] == 1 { else if board[y][x] == 1 {
print!("{}", "1".truecolor(1,0,254).on_truecolor(background_color,background_color,background_color)); output.push_str(&"1".truecolor(1,0,254).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if board[y][x] == 2 { else if board[y][x] == 2 {
print!("{}", "2".truecolor(1,127,1).on_truecolor(background_color,background_color,background_color)); output.push_str(&"2".truecolor(1,127,1).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if board[y][x] == 3 { else if board[y][x] == 3 {
print!("{}", "3".truecolor(254,0,0).on_truecolor(background_color,background_color,background_color)); output.push_str(&"3".truecolor(254,0,0).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if board[y][x] == 4 { else if board[y][x] == 4 {
print!("{}", "4".truecolor(1,0,128).on_truecolor(background_color,background_color,background_color)); output.push_str(&"4".truecolor(1,0,128).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if board[y][x] == 5 { else if board[y][x] == 5 {
print!("{}", "5".truecolor(129,1,2).on_truecolor(background_color,background_color,background_color)); output.push_str(&"5".truecolor(129,1,2).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if board[y][x] == 6 { else if board[y][x] == 6 {
print!("{}", "6".truecolor(0,128,129).on_truecolor(background_color,background_color,background_color)); output.push_str(&"6".truecolor(0,128,129).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if board[y][x] == 7 { else if board[y][x] == 7 {
print!("{}", "7".truecolor(0,0,0).on_truecolor(background_color,background_color,background_color)); output.push_str(&"7".truecolor(0,0,0).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if board[y][x] == 8 { else if board[y][x] == 8 {
print!("{}", "8".truecolor(128,128,128).on_truecolor(background_color,background_color,background_color)); output.push_str(&"8".truecolor(128,128,128).on_truecolor(background_color,background_color,background_color).to_string());
} }
} }
else if state[y][x] == 'm' { else if state[y][x] == 'm' {
print!("{}", "".truecolor(228,16,32).on_truecolor(background_color,background_color,background_color)); output.push_str(&"".truecolor(228,16,32).on_truecolor(background_color,background_color,background_color).to_string());
} }
else if state[y][x] == '?' { else if state[y][x] == '?' {
print!("{}", "?".truecolor(0,0,0).on_truecolor(background_color,background_color,background_color)); output.push_str(&"?".truecolor(0,0,0).on_truecolor(background_color,background_color,background_color).to_string());
} }
else { else {
print!("{}"," ".on_truecolor(background_color,background_color,background_color)); output.push_str(&" ".on_truecolor(background_color,background_color,background_color).to_string());
} }
} }
println!(); output.push_str("\n");
} }
print!("{}[2J", 27 as char);
println!("{}",output);
} }
fn input() -> String{ fn input() -> String{
@ -217,7 +221,7 @@ fn uncover(board: &Vec<Vec<i64>>, state: &mut Vec<Vec<char>>, x_hovered: usize,
} }
} }
fn detect_win(state: &Vec<Vec<char>>, number_of_nails: i64) { fn detect_win(state: &Vec<Vec<char>>, number_of_nails: i64, start: Instant) {
let mut number_of_covered_cells: i64 = 0; let mut number_of_covered_cells: i64 = 0;
for y in 0..state.len() { for y in 0..state.len() {
for x in 0..state[y].len() { for x in 0..state[y].len() {
@ -228,6 +232,8 @@ fn detect_win(state: &Vec<Vec<char>>, number_of_nails: i64) {
} }
if number_of_covered_cells == number_of_nails { if number_of_covered_cells == number_of_nails {
println!("Congratulations, you won!!!"); println!("Congratulations, you won!!!");
let end = std::time::Instant::now();
println!("In {:?}", end-start);
std::process::exit(0); std::process::exit(0);
} }
} }
@ -238,9 +244,11 @@ fn main() {
let mut board: Vec<Vec<i64>> = Vec::new(); let mut board: Vec<Vec<i64>> = Vec::new();
let mut state: Vec<Vec<char>> = Vec::new(); // u = uncovered, c = covered, m = marked let mut state: Vec<Vec<char>> = Vec::new(); // u = uncovered, c = covered, m = marked
let height: i64 = 10; let height: i64 = 8;
let width: i64 = 30; let width: i64 = 8;
let number_of_nails: i64 = 35; let number_of_nails: i64 = 10;
//let percentage_of_cells_are_nails: i64 = 15;
//let number_of_nails: i64 = ((percentage_of_cells_are_nails / 100) as i64) * ((width * height) as i64) as i64;
let mut x_hovered: i64 = 0; let mut x_hovered: i64 = 0;
let mut y_hovered: i64 = 0; let mut y_hovered: i64 = 0;
@ -256,6 +264,8 @@ fn main() {
//board[x as usize][y as usize] = -1; //board[x as usize][y as usize] = -1;
} }
} }
let start = std::time::Instant::now();
place_nails(&mut board, number_of_nails, width, height); place_nails(&mut board, number_of_nails, width, height);
determine_nails_in_range(&mut board); determine_nails_in_range(&mut board);
output_board(&board, &state, x_hovered, y_hovered); output_board(&board, &state, x_hovered, y_hovered);
@ -263,10 +273,10 @@ fn main() {
'gameloop: loop { 'gameloop: loop {
if let Ok(character) = stdout.read_char() { if let Ok(character) = stdout.read_char() {
match character { match character {
'w' => if y_hovered > 0 { y_hovered -= 1 }, 'w' | 'k' => if y_hovered > 0 { y_hovered -= 1 },
'a' => if x_hovered > 0 { x_hovered -= 1}, 'a' | 'h' => if x_hovered > 0 { x_hovered -= 1},
's' => if y_hovered < height-1 { y_hovered += 1 }, 's' | 'j' => if y_hovered < height-1 { y_hovered += 1 },
'd' => if x_hovered < width-1 {x_hovered += 1}, 'd' | 'l' => if x_hovered < width-1 {x_hovered += 1},
'u' => uncover(&board, &mut state, x_hovered as usize, y_hovered as usize, &mut alive), 'u' => uncover(&board, &mut state, x_hovered as usize, y_hovered as usize, &mut alive),
'm' => { 'm' => {
if state[y_hovered as usize][x_hovered as usize] == 'm' { if state[y_hovered as usize][x_hovered as usize] == 'm' {
@ -290,7 +300,7 @@ fn main() {
} }
if alive { if alive {
output_board(&board, &state, x_hovered, y_hovered); output_board(&board, &state, x_hovered, y_hovered);
detect_win(&state, number_of_nails); detect_win(&state, number_of_nails, start);
} }
else if alive == false { else if alive == false {
println!("GAME OVER!\nYou got Tetanus!"); println!("GAME OVER!\nYou got Tetanus!");