Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extern crate libc;
- extern crate rand;
- use std::{io, fs};
- use rand::Rng;
- use std::io::{Write, Read};
- struct Result
- (
- String, // name
- u32, // games
- u32, // victory
- f64, // percent
- u32, // izzy
- u32, // hard
- u32 // doom_guy
- );
- fn save(save: &Vec<Result>)
- {
- fs::remove_file("results.bin").expect("could not remove file");
- let mut file = std::fs::File::create("results.bin").expect("23. opening file while saving");
- file.write_all(((save.len()).to_string()).as_bytes()).expect("28. game saving err");
- file.write_all("/".as_bytes()).expect("27. file space err");
- for q in 0..save.len()
- {
- file.write_all(save[q].0.as_bytes()).expect("26. name saving err");
- file.write_all("/".as_bytes()).expect("27. file space err");
- file.write_all(((save[q].1).to_string()).as_bytes()).expect("28. game saving err");
- file.write_all("/".as_bytes()).expect("29. file space err");
- file.write_all(((save[q].2).to_string()).as_bytes()).expect("31. victories saving err");
- file.write_all("/".as_bytes()).expect("32. file space err");
- file.write_all(((save[q].3).to_string()).as_bytes()).expect("33. percent saving err");
- file.write_all("/".as_bytes()).expect("34. file space err");
- file.write_all(((save[q].4).to_string()).as_bytes()).expect("35. izzy saving err");
- file.write_all("/".as_bytes()).expect("36. file space err");
- file.write_all(((save[q].5).to_string()).as_bytes()).expect("37. hard saving err");
- file.write_all("/".as_bytes()).expect("38. file space err");
- file.write_all(((save[q].6).to_string()).as_bytes()).expect("39. doom_guy saving err");
- file.write_all("/".as_bytes()).expect("40. file space err");
- }
- }
- fn print_desk(desk_gr: &Vec<Vec<char>>, x: u32, y: u32)
- {
- print!(" ");
- for i in 1..y + 1
- {
- print!(" {}", i % 10);
- }
- print!("\n");
- for i in 0..x as usize
- {
- print!(" ");
- for _q in 1..y + 1
- {
- print!(" _");
- }
- print!("\n");
- print!("%{}", (i + 1) % 10);
- for q in 0..y as usize
- {
- print!("|{}", desk_gr[i][q]);
- }
- print!("|\n");
- }
- print!(" ");
- for _q in 1..y + 1
- {
- print!(" _");
- }
- print!("\n");
- }
- fn open_cl(num: u32) -> char
- {
- return match num
- {
- 0 => '0',
- 1 => '1',
- 2 => '2',
- 3 => '3',
- 4 => '4',
- 5 => '5',
- 6 => '6',
- 7 => '7',
- _ => '8',
- }
- }
- fn to_hu(_xm: &String) -> i32
- {
- let mut xm = 0;
- let mut correct = true;
- if &_xm[1..2] == "1" || &_xm[1..2] == "2" || &_xm[1..2] == "3"
- || &_xm[1..2] == "4" || &_xm[1..2] == "5" || &_xm[1..2] == "6"
- || &_xm[1..2] == "7" || &_xm[1..2] == "8" || &_xm[1..2] == "9"
- {
- match &_xm[0..1]
- {
- "1" => xm = 10,
- "2" => xm = 20,
- "3" => xm = 30,
- _ => {
- println!("Ввод не корректен");
- correct = false
- }
- }
- if correct
- {
- match &_xm[1..2]
- {
- "0" => xm += 0,
- "1" => xm += 1,
- "2" => xm += 2,
- "3" => xm += 3,
- "4" => xm += 4,
- "5" => xm += 5,
- "6" => xm += 6,
- "7" => xm += 7,
- "8" => xm += 8,
- "9" => xm += 9,
- _ => {
- println!("Ввод не корректен");
- correct = false
- },
- }
- }
- if correct && &_xm[2..3] != "0"
- {
- println!("Ввод не корректен");
- correct = false
- }
- }
- else if &_xm[1..2] == "0"
- {
- match &_xm[0..1]
- {
- "0" => xm += 0,
- "1" => xm += 1,
- "2" => xm += 2,
- "3" => xm += 3,
- "4" => xm += 4,
- "5" => xm += 5,
- "6" => xm += 6,
- "7" => xm += 7,
- "8" => xm += 8,
- "9" => xm += 9,
- _ => {
- println!("Ввод не корректен");
- correct = false
- },
- }
- }
- else
- {
- println!("Ввод не корректен");
- correct = false
- }
- return match correct
- {
- true => xm,
- _ => -1,
- }
- }
- unsafe fn game (game_type: u32) -> bool
- {
- let mut mines: u32 = 0; // amount of mines
- let mut x: u32 = 4; // custom
- let mut y: u32 = 4; // custom
- let mut count: u32 = 0; // amount of mines
- let mut desk_gr: Vec<Vec<char>> = vec![vec![]]; // output
- let mut bomb_num: Vec<Vec<u32>> = vec![vec![]]; // numbers near mines
- let mut position: Vec<u32> = vec![]; // numbers of mines
- if game_type != 1
- {
- let mut resize_gr: Vec<char> = vec![];
- let mut resize_b: Vec<u32> = vec![];
- resize_gr.resize(game_type as usize, ' ');
- resize_b.resize(game_type as usize, 0);
- desk_gr.resize(game_type as usize, resize_gr);
- bomb_num.resize(game_type as usize, resize_b);
- match game_type
- {
- 8 => print_desk(&desk_gr, 8, 8),
- 16 => print_desk(&desk_gr, 16, 16),
- _ => print_desk(&desk_gr, 32, 32),
- }
- position.resize((game_type * 2) as usize, 0);
- while count != game_type * 2
- {
- let mut test = false;
- let place = rand::thread_rng().gen_range(0, game_type); // mine position
- for i in 0..count as usize
- {
- if place == position[i]
- {
- test = true;
- break;
- }
- }
- if !test
- {
- count += 1;
- position[(count - 1) as usize] = place;
- }
- } // we've created mines
- let mut xc: u32 = 0;
- let mut yc: u32 = 0;
- for q in 0..count as usize
- {
- xc = position[q] / game_type; // string with mine
- yc = position[q] - (game_type * xc); // column with mine
- // we've defined location of mine
- if xc > 0
- {
- bomb_num[(xc - 1) as usize][yc as usize] += 1;
- }
- if xc < game_type - 1
- {
- bomb_num[(xc + 1) as usize][yc as usize] += 1;
- }
- if yc > 0
- {
- bomb_num[xc as usize][(yc - 1) as usize] += 1;
- }
- if yc < game_type - 1
- {
- bomb_num[xc as usize][(yc + 1) as usize] += 1;
- }
- if xc > 0 && yc > 0
- {
- bomb_num[(xc - 1) as usize][(yc - 1) as usize] += 1;
- }
- if xc < game_type - 1 && yc > 0
- {
- bomb_num[(xc + 1) as usize][(yc - 1) as usize] += 1;
- }
- if xc > 0 && yc < game_type - 1
- {
- bomb_num[(xc - 1) as usize][(yc + 1) as usize] += 1;
- }
- if xc < game_type - 1 && yc < game_type - 1
- {
- bomb_num[(xc + 1) as usize][(yc + 1) as usize] += 1;
- }
- } // numbers of mines are established
- }
- else
- {
- let mut _x = String::new();
- let mut _y = String::new();
- println!("Задайте размер доски.");
- while x < 3 || x > 50
- {
- print!("Кол-во строк (не больше 50, минимум 3): ");
- io::stdin().read_line(&mut _x).expect("185. wrong input");
- x = _x.trim().parse().expect("186. not number");
- if x < 3 || x > 50
- {
- println!("Ввод не корректен");
- }
- }
- while y < 3 || y > 50
- {
- print!("Кол-во столбцов (не больше 50, минимум 3): ");
- io::stdin().read_line(&mut _x).expect("195. wrong input");
- y = _y.trim().parse().expect("196. not number");
- if y < 3 || y > 50
- {
- println!("Ввод не корректен");
- }
- }
- let mut column: Vec<char> = vec![];
- let mut bomb: Vec<u32> = vec![];
- column.resize(y as usize,' ');
- bomb.resize(y as usize,0);
- desk_gr.resize(x as usize, column); // set size
- bomb_num.resize(x as usize, bomb); // set size
- print_desk(&desk_gr, x, y);
- while (mines as f64) > ((y * x) as f64 / 100.0 * 95f64) || ((y * x) as f64 / 100.0 * 5f64) > (mines as f64)
- {
- mines = 0;
- let mut _mines = String::new();
- print!("Задайте кол-во мин (минимум 5%% от площади доски и максимум 95%%): ");
- io::stdin().read_line(&mut _mines).expect("214. wrong input");
- mines = _mines.trim().parse().expect("215. not number");
- if (mines as f64) > ((y * x) as f64 / 100.0 * 95f64) || ((y * x) as f64 / 100.0 * 5f64) > (mines as f64)
- {
- println!("Ввод не корректен");
- }
- }
- count = 0;
- position.resize(mines as usize, 0);
- while count != mines
- {
- let mut test = false; // new mine checking
- let place = rand::thread_rng().gen_range(0, x * y); // mine position
- for i in 0..count as usize
- {
- if place == position[i]
- {
- test = true;
- break;
- }
- }
- if !test
- {
- count += 1;
- position[(count - 1) as usize] = place;
- }
- } // set mines
- let mut xc: u32 = 0;
- let mut yc: u32 = 0;
- for q in 0..count
- {
- xc = position[q as usize] / y; // string with mine
- yc = position[q as usize] - y * xc; // column with mine
- // we've defined location of mine
- if xc > 0
- {
- bomb_num[(xc - 1) as usize][yc as usize] += 1;
- }
- if xc < x - 1
- {
- bomb_num[(xc + 1) as usize][yc as usize] += 1;
- }
- if yc > 0
- {
- bomb_num[xc as usize][(yc - 1) as usize] += 1;
- }
- if yc < y - 1
- {
- bomb_num[xc as usize][(yc + 1) as usize] += 1;
- }
- if xc > 0 && yc > 0
- {
- bomb_num[(xc - 1) as usize][(yc - 1) as usize] += 1;
- }
- if xc < x - 1 && yc > 0
- {
- bomb_num[(xc + 1) as usize][(yc - 1) as usize] += 1;
- }
- if xc > 0 && yc < y - 1
- {
- bomb_num[(xc - 1) as usize][(yc + 1) as usize] += 1;
- }
- if xc < x - 1 && yc < y - 1
- {
- bomb_num[(xc + 1) as usize][(yc + 1) as usize] += 1;
- }
- } // numbers of mines are established
- }
- let mut xh: u32 = 0; // string of move location
- let mut yh: u32 = 0; // column of move location
- let mut mv: u32 = 0; // move choice
- let mut lose: bool = false; // game status
- let mut space: u32 = 0; // locations without mines
- match game_type
- {
- 1 => space = game_type * game_type - game_type * 2,
- _ => space = x * y - mines,
- }
- let mut _mv = String::new(); // input move choice
- let mut _xm = String::new(); // string of new flag
- let mut _ym = String::new(); // column of new flag
- let mut _xd = String::new(); // string of destroyable flag
- let mut _yd = String::new(); // column of destroyable flag
- let mut _xh = String::new(); // string of move location
- let mut _yh = String::new(); // column of move location
- let mut _yes_f = String::from("YES"); // confirmation of flag placing
- let mut _yes_d = String::from("YES"); // confirmation of flag destroying
- let mut _yes_m = String::new(); // confirmation of making move
- let start: libc::time64_t = libc::time(0 as *mut libc::time64_t); // game start
- while !lose && space != 0
- {
- while mv < 1 || mv > 3
- {
- println!("1. Поставить метку\n2. Убрать метку\n3. Сделать ход");
- print!("Выберите цифру: ");
- io::stdin().read_line(&mut _mv).expect("309. read string");
- if &_mv[0..1] != "1" && &_mv[0..1] != "2" && &_mv[0..1] != "3" || &_mv[1..2] != "0"
- {
- println!("Ввод не корректен");
- }
- }
- match &_mv[0..1]
- {
- "1" => mv = 1,
- "2" => mv = 2,
- _ => mv = 3,
- }
- match mv
- {
- 1 =>
- while &_yes_f[..] == "YES"
- {
- print!("Если у вас есть предположение о месте мин, то можете поставить + на это место.\
- Если хотите это сделать, то введите YES, иначе что-то другое: ");
- io::stdin().read_line(&mut _yes_f).expect("405. read string");
- if &_yes_f[..] == "YES"
- {
- let mut xm: u32 = 0; // flag string
- let mut ym: u32 = 0; // flag column
- let mut xt: i32 = -1; // input test
- let mut yt: i32 = -1; // input test
- println!("Введите координаты мины.");
- while xt == -1
- {
- xm = 0;
- print!("Введите номер строки: ");
- io::stdin().read_line(&mut _xm).expect("415 read string");
- xt = to_hu(&_xm);
- }
- xm = xt as u32;
- while yt == -1
- {
- ym = 0;
- print!("Введите номер столбца: ");
- io::stdin().read_line(&mut _ym).expect("423 read string");
- yt = to_hu(&_ym);
- }
- ym = yt as u32;
- if game_type != 1 && (xm > game_type || xm < 1) && (ym > game_type || ym < 1)
- {
- println!("Вы вышли за рамки доски");
- }
- else if (xm > x || xm < 1) && (ym > y || ym < 1)
- {
- println!("Вы вышли за рамки доски");
- }
- if desk_gr[(xm - 1) as usize][(ym - 1) as usize] != ' '
- {
- println!("Сомневаюсь, что вы хотите поставить сюда метку...");
- }
- desk_gr[(xm - 1) as usize][(ym - 1) as usize] = '+';
- match game_type
- {
- 8 => print_desk(&desk_gr, 8, 8),
- 16 => print_desk(&desk_gr, 16, 16),
- 32 => print_desk(&desk_gr, 32, 32),
- _ => print_desk(&desk_gr, x, y),
- }
- }
- }
- 2 =>
- while &_yes_d[..] == "YES"
- {
- print!("Вы можете убрать метку на мину.\
- Если хотите это сделать, то введите YES, иначе что-то другое: ");
- io::stdin().read_line(&mut _yes_d).expect("405. read string");
- if &_yes_d[..] == "YES"
- {
- let mut xm: u32 = 0; // flag string
- let mut ym: u32 = 0; // flag column
- let mut xt: i32 = -1; // input test
- let mut yt: i32 = -1; // input test
- println!("Введите координаты мины.");
- while xt == -1
- {
- xm = 0;
- print!("Введите номер строки: ");
- io::stdin().read_line(&mut _xm).expect("415 read string");
- xt = to_hu(&_xm);
- }
- xm = xt as u32;
- while yt == -1
- {
- ym = 0;
- print!("Введите номер столбца: ");
- io::stdin().read_line(&mut _ym).expect("423 read string");
- yt = to_hu(&_ym);
- }
- ym = yt as u32;
- if game_type != 1 && (xm > game_type || xm < 1) && (ym > game_type || ym < 1)
- {
- println!("Вы вышли за рамки доски");
- }
- else if (xm > x || xm < 1) && (ym > y || ym < 1)
- {
- println!("Вы вышли за рамки доски");
- }
- if desk_gr[(xm - 1) as usize][(ym - 1) as usize] != '+'
- {
- println!("Здесь нет метки...");
- }
- desk_gr[(xm - 1) as usize][(ym - 1) as usize] = ' ';
- match game_type
- {
- 8 => print_desk(&desk_gr, 8, 8),
- 16 => print_desk(&desk_gr, 16, 16),
- 32 => print_desk(&desk_gr, 32, 32),
- _ => print_desk(&desk_gr, x, y),
- }
- }
- }
- _ =>
- {
- print!("Вы уверены, что хотите совершить ход? \
- Если да, то введите YES, иначе что-то другое: ");
- io::stdin().read_line(&mut _yes_m).expect("504. read string");
- if &_yes_m == "YES"
- {
- let mut xt: i32 = -1; // input test
- let mut yt: i32 = -1; // input test
- let mut beyond: bool = true; // out of borders
- while beyond
- {
- println!("Введите координаты мины");
- while xt == -1
- {
- print!("Введите номер строки: ");
- io::stdin().read_line(&mut _xh).expect("517. read string");
- xt = to_hu(&_xh);
- }
- xh = xt as u32;
- while yt == -1
- {
- print!("Введите номер столбца: ");
- io::stdin().read_line(&mut _yh).expect("523. read string");
- yt = to_hu(&_yh);
- }
- yh = yt as u32;
- beyond = false;
- if game_type != 1 && (xh > game_type || xh < 1) && (yh > game_type || yh < 1)
- {
- println!("Вы вышли за рамки доски");
- beyond = true;
- }
- else if (xh > x || xh < 1) && (yh > y || yh < 1)
- {
- println!("Вы вышли за рамки доски");
- beyond = true;
- }
- }
- for c in 0..count as usize // checking for
- {
- if game_type != 1
- {
- if (xh - 1) * game_type + yh - 1 == position[c] // lose
- {
- for o in 0.. count as usize // fill with mines
- {
- desk_gr[(position[o] / game_type) as usize]
- [(position[o] - (position[o] / game_type) * game_type) as usize] = 'x';
- }
- match game_type
- {
- 8 => print_desk(&desk_gr, 8, 8),
- 16 => print_desk(&desk_gr, 16, 16),
- _ => print_desk(&desk_gr, 32, 32),
- }
- println!("Вы взорвались :(");
- lose = true;
- }
- }
- else if (xh - 1) * y + yh - 1 == position[c] // lose
- {
- for o in 0..count as usize // fill with mines
- {
- desk_gr[(position[o] / y) as usize]
- [(position[o] - (position[o] / y) * y) as usize] = 'x';
- }
- print_desk(&desk_gr, x, y);
- println!("Вы взорвались :(");
- lose = true;
- }
- }
- if !lose && desk_gr[(xh - 1) as usize][(yh - 1) as usize] != ' '
- {
- println!("Эта клетка уже открыта");
- }
- else if !lose && desk_gr[(xh - 1) as usize][(yh - 1) as usize] == ' ' // not lose
- {
- let mut i: u32 = 0; // to move in array
- let mut amount: u32 = 0; // amount of cells we've opened when open 1 cell
- if bomb_num[(xh - 1) as usize][(yh - 1) as usize] == 0 // cells opening
- {
- let mut eternal: Vec<(u32, u32)> = vec![]; // strings and columns with 0
- eternal.push((xh - 1, yh - 1));
- for i in 0..eternal.len()
- {
- desk_gr[(eternal[i].0) as usize][eternal[i].1 as usize] = '0';
- amount += 1;
- if eternal[i].0 > 0
- {
- if bomb_num[(eternal[i].0 - 1) as usize][(eternal[i].1) as usize] == 0
- {
- let mut potato = false; // check for 0
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 - 1 && eternal[c].1 == eternal[i].1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 - 1, eternal[i].1));
- }
- }
- else if desk_gr[(eternal[i].0 - 1) as usize][(eternal[i].1) as usize] == ' '
- {
- desk_gr[((eternal[i].0) - 1) as usize][(eternal[i].1) as usize] =
- open_cl(bomb_num[((eternal[i].0) - 1) as usize][(eternal[i].1) as usize]);
- amount += 1;
- }
- }
- if game_type != 1
- {
- if eternal[i].0 < game_type - 1
- {
- if bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1) as usize] == 0
- {
- let mut potato = false; // check for 0
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 + 1 && eternal[c].1 == eternal[i].1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 + 1, eternal[i].1));
- }
- }
- else if desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1) as usize] == ' '
- {
- desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1) as usize] =
- open_cl(bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1) as usize]);
- amount += 1;
- }
- }
- }
- else
- {
- if eternal[i].0 < x - 1
- {
- if bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1) as usize] == 0
- {
- let mut potato = false;
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 + 1 && eternal[c].1 == eternal[i].1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 + 1, eternal[i].1));
- }
- }
- else if desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1) as usize] == ' '
- {
- desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1) as usize] =
- open_cl(bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1) as usize]);
- amount += 1;
- }
- }
- }
- if eternal[i].1 > 0
- {
- if bomb_num[(eternal[i].0) as usize][(eternal[i].1 - 1) as usize] == 0
- {
- let mut potato = false;
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 && eternal[c].1 == eternal[i].1 - 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 , eternal[i].1 - 1));
- }
- }
- else if desk_gr[(eternal[i].0) as usize][(eternal[i].1 - 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0) as usize][(eternal[i].1 - 1) as usize] =
- open_cl(bomb_num[(eternal[i].0) as usize][(eternal[i].1 - 1) as usize]);
- amount += 1;
- }
- }
- if game_type != 1
- {
- if eternal[i].0 < game_type - 1
- {
- if bomb_num[(eternal[i].0) as usize][(eternal[i].1 + 1) as usize] == 0
- {
- let mut potato = false; // check for 0
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 && eternal[c].1 == eternal[i].1 + 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 , eternal[i].1 + 1));
- }
- }
- else if desk_gr[(eternal[i].0) as usize][(eternal[i].1 + 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0) as usize][(eternal[i].1 + 1) as usize] =
- open_cl(bomb_num[(eternal[i].0) as usize][(eternal[i].1 + 1) as usize]);
- amount += 1;
- }
- }
- }
- else
- {
- if eternal[i].1 < y - 1
- {
- if bomb_num[(eternal[i].0) as usize][(eternal[i].1 + 1) as usize] == 0
- {
- let mut potato = false;
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 && eternal[c].1 == eternal[i].1 + 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 , eternal[i].1 + 1));
- }
- }
- else if desk_gr[(eternal[i].0) as usize][(eternal[i].1 + 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0) as usize][(eternal[i].1 + 1) as usize] =
- open_cl(bomb_num[(eternal[i].0) as usize][(eternal[i].1 + 1) as usize]);
- amount += 1;
- }
- }
- }
- if eternal[i].0 > 0 && eternal[i].1 > 0
- {
- if bomb_num[(eternal[i].0 - 1) as usize][(eternal[i].1 - 1) as usize] == 0
- {
- let mut potato = false;
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 - 1 && eternal[c].1 == eternal[i].1 - 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 - 1, eternal[i].1 - 1));
- }
- }
- else if desk_gr[(eternal[i].0 - 1) as usize][(eternal[i].1 - 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0 - 1) as usize][(eternal[i].1 - 1) as usize] =
- open_cl(bomb_num[(eternal[i].0 - 1) as usize][(eternal[i].1 - 1) as usize]);
- amount += 1;
- }
- }
- if game_type != 1
- {
- if eternal[i].0 < game_type - 1 && eternal[i].1 > 0
- {
- if bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1 - 1) as usize] == 0
- {
- let mut potato = false; // check for 0
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 + 1 && eternal[c].1 == eternal[i].1 - 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 + 1, eternal[i].1 - 1));
- }
- }
- else if desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1 - 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1 - 1) as usize] =
- open_cl(bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1 - 1) as usize]);
- amount += 1;
- }
- }
- }
- else
- {
- if eternal[i].0 < x - 1 && eternal[i].1 > 0
- {
- if bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1 - 1) as usize] == 0
- {
- let mut potato = false;
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 + 1 && eternal[c].1 == eternal[i].1 - 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 + 1, eternal[i].1 - 1));
- }
- }
- else if desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1 - 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1 - 1) as usize] =
- open_cl(bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1 - 1) as usize]);
- amount += 1;
- }
- }
- }
- if game_type != 1
- {
- if eternal[i].0 > 0 && eternal[i].1 < game_type - 1
- {
- if bomb_num[(eternal[i].0 - 1) as usize][(eternal[i].1 + 1) as usize] == 0
- {
- let mut potato = false; // check for 0
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 - 1 && eternal[c].1 == eternal[i].1 + 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 - 1, eternal[i].1 + 1));
- }
- }
- else if desk_gr[(eternal[i].0 - 1) as usize][(eternal[i].1 + 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0 - 1) as usize][(eternal[i].1 + 1) as usize] =
- open_cl(bomb_num[(eternal[i].0 - 1) as usize][(eternal[i].1 + 1) as usize]);
- amount += 1;
- }
- }
- }
- else
- {
- if eternal[i].0 > 0 && eternal[i].1 < y - 1
- {
- if bomb_num[(eternal[i].0 - 1) as usize][(eternal[i].1 + 1) as usize] == 0
- {
- let mut potato = false;
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 - 1 && eternal[c].1 == eternal[i].1 + 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 - 1, eternal[i].1 + 1));
- }
- }
- else if desk_gr[(eternal[i].0 - 1) as usize][(eternal[i].1 + 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0 - 1) as usize][(eternal[i].1 + 1) as usize] =
- open_cl(bomb_num[(eternal[i].0 - 1) as usize][(eternal[i].1 + 1) as usize]);
- amount += 1;
- }
- }
- }
- if game_type != 1
- {
- if eternal[i].0 < game_type - 1 && eternal[i].1 < game_type - 1
- {
- if bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1 + 1) as usize] == 0
- {
- let mut potato = false; // check for 0
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 + 1 && eternal[c].1 == eternal[i].1 + 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 + 1, eternal[i].1 + 1));
- }
- }
- else if desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1 + 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1 + 1) as usize] =
- open_cl(bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1 + 1) as usize]);
- amount += 1;
- }
- }
- }
- else
- {
- if eternal[i].0 < x - 1 && eternal[i].1 < y - 1
- {
- if bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1 + 1) as usize] == 0
- {
- let mut potato = false;
- for c in 0..eternal.len()
- {
- if eternal[c].0 == eternal[i].0 + 1 && eternal[c].1 == eternal[i].1 + 1
- {
- potato = true;
- break;
- }
- }
- if !potato
- {
- eternal.push((eternal[i].0 + 1, eternal[i].1 + 1));
- }
- }
- else if desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1 + 1) as usize] == ' '
- {
- desk_gr[(eternal[i].0 + 1) as usize][(eternal[i].1 + 1) as usize] =
- open_cl(bomb_num[(eternal[i].0 + 1) as usize][(eternal[i].1 + 1) as usize]);
- amount += 1;
- }
- }
- }
- }
- }
- else
- {
- desk_gr[(xh - 1) as usize][(yh - 1) as usize] =
- open_cl(bomb_num[(xh - 1) as usize][(yh - 1) as usize]);
- }
- match game_type
- {
- 8 => print_desk(&desk_gr, 8, 8),
- 16 => print_desk(&desk_gr, 16, 16),
- 32 => print_desk(&desk_gr, 32, 32),
- _ => print_desk(&desk_gr, x, y),
- }
- space -= amount;
- }
- }
- },
- }
- }
- if !lose
- {
- println!("ВЫ ВЫЖИЛИ!");
- }
- let finish: libc::time64_t = libc::time(0 as *mut libc::time64_t);
- println!("Ваше время: {} секунд", finish - start);
- return lose;
- }
- unsafe fn main() {
- let mut list: Vec<Result> = vec![];
- let fin = std::fs::File::open("results.bin");
- match fin
- {
- Err(std::fs::File::open("results.bin")) => {
- // If file does not exist, than we'll create it
- let mut file = std::fs::File::create("results.bin").expect("create failed");
- },
- Ok(std::fs::File::open("results.bin")) => {
- /*
- We know the amount of players, so we know how many times we'll
- read data from string. To understand that we've read something
- we are reading symbol by symbol and check it. If symbol is
- equal to '/' then it's a field of structure.
- */
- let mut file = std::fs::File::open("results.bin").unwrap();
- let mut contents = String::new();
- file.read_to_string(&mut contents).unwrap();
- let mut end_s: usize = 0;
- while &contents[end_s - 1..end_s] != "/"
- {
- end_s += 1;
- }
- let mut size: usize = contents[0..end_s].parse().expect("convert string");
- list.resize_with(size,("", 0, 0, 0.0, 0, 0));
- let mut start: usize = 0;
- let mut finish: usize = 1;
- for i in 0..list.len()
- {
- let mut guy = Result("".to_string(), 0, 0, 0.0, 0, 0, 0);
- while &contents[finish - 1..finish] != "/"
- {
- finish += 1;
- }
- guy.0 = contents[start..finish - 1].to_string();
- start = finish;
- finish += 1;
- while &contents[finish - 1..finish] != "/"
- {
- finish += 1;
- }
- guy.1 = contents[start..finish - 1].parse().expect("convert error");
- start = finish;
- finish += 1;
- while &contents[finish - 1..finish] != "/"
- {
- finish += 1;
- }
- guy.2 = contents[start..finish - 1].parse().expect("convert error");
- start = finish;
- finish += 1;
- while &contents[finish - 1..finish] != "/"
- {
- finish += 1;
- }
- guy.3 = contents[start..finish - 1].parse().expect("convert error");
- start = finish;
- finish += 1;
- while &contents[finish - 1..finish] != "/"
- {
- finish += 1;
- }
- guy.4 = contents[start..finish - 1].parse().expect("convert error");
- start = finish;
- finish += 1;
- while &contents[finish - 1..finish] != "/"
- {
- finish += 1;
- }
- guy.5 = contents[start..finish - 1].parse().expect("convert error");
- start = finish;
- finish += 1;
- while &contents[finish - 1..finish] != "/"
- {
- finish += 1;
- }
- guy.6 = contents[start..finish - 1].parse().expect("convert error");
- start = finish;
- finish += 1;
- list.push(guy);
- }
- },
- }
- let mut choice: u32 = 0;
- let mut gm_ch: u32 = 0;
- let mut res_ch: u32 = 0;
- let mut _choice: String = String::new();
- let mut _game_ch: String = String::new();
- let mut _res_ch: String = String::new();
- let mut _away: String = String::new();
- let mut _fix_ex: String = String::new();
- let mut g8sch: bool = false;
- let mut g16sch: bool = false;
- let mut g32sch: bool = false;
- let mut gcssch: bool = false;
- while choice != 3
- {
- g8sch = false;
- g16sch = false;
- g32sch = false;
- while choice < 1 || choice > 3
- {
- loop
- {
- println!("ххххх_САПЁР_ххххх");
- println!("1.Играть\n2.Рекорды\n3.Выход");
- println!("Введите ЦИФРУ ОТ 1 ДО 3, чтобы выполнить действие: ");
- io::stdin().read_line(&mut _choice).expect("read string");
- let test = _choice.trim().parse();
- match test
- {
- Err(test) => {
- println!("Некорректный ввод");
- },
- _ => {
- break;
- },
- }
- }
- choice = _choice.trim().parse().expect("convert error");
- }
- let mut player = Result("".to_string(), 0, 0, 0.0, 0, 0, 0);
- match choice
- {
- 1 => {
- print!("Введите ваш ник");
- let mut name = String::new();
- io::stdin().read_line(&mut name).expect("read string");
- player.0 = name;
- while gm_ch < 1 || gm_ch > 4
- {
- loop
- {
- print!("Выберите уровень сложности: \
- 1.Просто(доска 8x8, 16 мин); \
- 2.Не так просто(доска 16x16, 32 мины);\
- 3.ХАРДКОР(доска 32x32, 64 мины); \
- 4.Своя игра (ВВЕСТИ ЦИФРУ): ");
- io::stdin().read_line(&mut _game_ch).expect("read string");
- let test = _game_ch.trim().parse();
- match test
- {
- Err(test) => {
- println!("Некорректный ввод");
- },
- _ => {
- break;
- },
- }
- }
- gm_ch = _game_ch.trim().parse().expect("convert error");
- match gm_ch
- {
- 1 => {
- for e in 0..list.len()
- {
- if list[e].0 == player.0 // name
- {
- g8sch = true;
- if game(8)
- {
- list[e].2 += 1; // victory
- list[e].4 += 1; // izzy
- }
- list[e].1 += 1; // games
- list[e].3 = (list[e].2 as f64 / (list[e].1 as f64 / 100.0)); // percent
- break;
- }
- }
- if !g8sch
- {
- player.2 = 0;
- player.4 = 0;
- player.5 = 0;
- player.6 = 0;
- if game(8)
- {
- player.2 = 1; // victory
- player.4 = 1; // izzy
- }
- player.1 = 1; // games
- player.3 = (list[e].2 as f64 / (list[e].1 as f64 / 100.0)); // percent
- list.push(player);
- }
- },
- 2 => {
- for e in 0..list.len()
- {
- if list[e].0 == player.0 // name
- {
- g16sch = true;
- if game(16)
- {
- list[e].2 += 1; // victory
- list[e].5 += 1; // hard
- }
- list[e].1 += 1; // games
- list[e].3 = (list[e].2 as f64 / (list[e].1 as f64 / 100.0)); // percent
- break;
- }
- }
- if !g16sch
- {
- player.2 = 0;
- player.4 = 0;
- player.5 = 0;
- player.6 = 0;
- if game(16)
- {
- player.2 = 1; // victory
- player.5 = 1; // hard
- }
- player.1 = 1; // games
- player.3 = (list[e].2 as f64 / (list[e].1 as f64 / 100.0)); // percent
- list.push(player);
- }
- }
- 3 => {
- for e in 0..list.len()
- {
- if list[e].0 == player.0 // name
- {
- g32sch = true;
- if game(32)
- {
- list[e].2 += 1; // victory
- list[e].6 += 1; // hard
- }
- list[e].1 += 1; // games
- list[e].3 = (list[e].2 as f64 / (list[e].1 as f64 / 100.0)); // percent
- break;
- }
- }
- if !g32sch
- {
- player.2 = 0;
- player.4 = 0;
- player.5 = 0;
- player.6 = 0;
- if game(32)
- {
- player.2 = 1; // victory
- player.6 = 1; // doom
- }
- player.1 = 1; // games
- player.3 = (list[e].2 as f64 / (list[e].1 as f64 / 100.0)); // percent
- list.push(player);
- }
- }
- _ => {
- for e in 0..list.len()
- {
- if list[e].0 == player.0 // name
- {
- gcssch = true;
- if game(1)
- {
- list[e].2 += 1; // victory
- }
- list[e].1 += 1; // games
- list[e].3 = (list[e].2 as f64 / (list[e].1 as f64 / 100.0)); // percent
- break;
- }
- }
- if !gcssch
- {
- player.2 = 0;
- player.4 = 0;
- player.5 = 0;
- player.6 = 0;
- if game(1)
- {
- player.2 = 1; // victory
- }
- player.1 = 1; // games
- player.3 = (list[e].2 as f64 / (list[e].1 as f64 / 100.0)); // percent
- list.push(player);
- }
- }
- }
- save(&list);
- }
- },
- 2 => {
- while res_ch != 6
- {
- println!("Результаты");
- while res_ch > 6
- {
- println!("1.Сыграно игр\n\
- 2.Побед на сложности 'легко'\n\
- 3.Побед на сложности 'не так легко'\n\
- 4.Побед на сложности 'ХАРДКОР'\n\
- 5.Процент побед.\n\
- 6.Выход");
- print!("Выберите ЦИФРУ действия: ");
- io::stdin().read_line(&mut _res_ch).expect("read string");
- res_ch = _res_ch.trim().parse().expect("convert");
- if res_ch > 6
- {
- println!("Ввод не корректен");
- }
- }
- match res_ch
- {
- 1 => {
- if list.is_empty()
- {
- println!("Ещё никто не играл");
- }
- else
- {
- list.sort();
- list.reverse();
- for i in 0..list.len()
- {
- println!("{} : {}", list[i].0, list[i].2);
- }
- }
- },
- 2 => {
- if list.is_empty()
- {
- println!("Ещё никто не играл");
- }
- else
- {
- list.sort();
- list.reverse();
- for i in 0..list.len()
- {
- println!("{} : {}", list[i].0, list[i].4);
- }
- }
- },
- 3 => {
- if list.is_empty()
- {
- println!("Ещё никто не играл");
- }
- else
- {
- list.sort();
- list.reverse();
- for i in 0..list.len()
- {
- println!("{} : {}", list[i].0, list[i].5);
- }
- }
- },
- 4 => {
- if list.is_empty()
- {
- println!("Ещё никто не играл");
- }
- else
- {
- list.sort();
- list.reverse();
- for i in 0..list.len()
- {
- println!("{} : {}", list[i].0, list[i].6);
- }
- }
- },
- 5 => {
- if list.is_empty()
- {
- println!("Ещё никто не играл");
- }
- else
- {
- list.sort();
- list.reverse();
- for i in 0..list.len()
- {
- println!("{} : {}", list[i].0, list[i].3);
- }
- }
- },
- _ => {
- println!("Вы точно хотите выйти? \
- Введите YES, если да или что-то другое, если нет.");
- io::stdin().read_line(&mut _fix_ex).expect("read string");
- if _fix_ex != "YES".to_string()
- {
- res_ch = 0;
- }
- }
- }
- }
- }
- _ => {
- println!("Вы точно хотите выйти? \
- Введите YES, если да или что-то другое, если нет.");
- io::stdin().read_line(&mut _away).expect("read string");
- if _away != "YES".to_string()
- {
- choice = 0;
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement