Initial commit I think
Initial commit with just menu and sort of pause menu only
This commit is contained in:
@@ -0,0 +1,53 @@
|
|||||||
|
extern crate rand;
|
||||||
|
enum CellType {
|
||||||
|
Snake,
|
||||||
|
Food,
|
||||||
|
Empty,
|
||||||
|
}
|
||||||
|
struct Cell {
|
||||||
|
line: i32,
|
||||||
|
col: i32,
|
||||||
|
ctype: CellType,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Cell {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
line: -1,
|
||||||
|
col: -1,
|
||||||
|
ctype: CellType::Empty,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Direction {
|
||||||
|
Up,
|
||||||
|
Down,
|
||||||
|
Left,
|
||||||
|
Right,
|
||||||
|
}
|
||||||
|
struct Snake {
|
||||||
|
length: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SnakeCell {
|
||||||
|
pub line: i32,
|
||||||
|
pub col: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SnakeCell {
|
||||||
|
fn next(&self, direction: Direction) -> SnakeCell {
|
||||||
|
let (dl, dc) = match direction {
|
||||||
|
Direction::Up => (-1, 0),
|
||||||
|
Direction::Down => (1, 0),
|
||||||
|
Direction::Left => (0, -1),
|
||||||
|
Direction::Right => (0, 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
SnakeCell {
|
||||||
|
line: self.line + dl,
|
||||||
|
col: self.col + dc,
|
||||||
|
// ctype: self.ctype,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
// use ncurses::*;
|
||||||
|
use ncurses::{box_, delwin, keypad, newwin, wborder, wrefresh, WINDOW};
|
||||||
|
pub fn game_window(mlines: i32, mcols: i32, vmargin: i32, hmargin: i32) -> WINDOW {
|
||||||
|
let game_win: WINDOW;
|
||||||
|
let (lines, cols): (i32, i32);
|
||||||
|
let (starty, startx): (i32, i32);
|
||||||
|
lines = mlines - vmargin * 2;
|
||||||
|
cols = mcols - hmargin * 2;
|
||||||
|
// starty = (mlines - lines) / 2;
|
||||||
|
// startx = (mcols - cols) / 2;
|
||||||
|
starty = vmargin;
|
||||||
|
startx = hmargin;
|
||||||
|
game_win = newwin(lines, cols, starty, startx);
|
||||||
|
box_(game_win, 0, 0);
|
||||||
|
keypad(game_win, true);
|
||||||
|
wrefresh(game_win);
|
||||||
|
game_win
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn destroy_window(win: WINDOW) {
|
||||||
|
// wmove(win, 0, 0);
|
||||||
|
// wclrtobot(win);
|
||||||
|
wborder(win, 32, 32, 32, 32, 32, 32, 32, 32); // 32 is the ascii code for whitespace. this replaces all the window borders with whitespace
|
||||||
|
wrefresh(win); // refresh to remove the borders
|
||||||
|
delwin(win); // delete the window
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
mod backend;
|
||||||
|
mod frontend;
|
||||||
|
use crate::menu;
|
||||||
|
// use ncurses::*;
|
||||||
|
use ncurses::{getmaxyx, stdscr, wgetch, wrefresh, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_UP, WINDOW};
|
||||||
|
use std::thread::sleep;
|
||||||
|
pub fn start() {
|
||||||
|
let (mut mlines, mut mcols): (i32, i32) = (0, 0);
|
||||||
|
let game_win: WINDOW;
|
||||||
|
let mut ch: i32;
|
||||||
|
// let mut choice: i8;
|
||||||
|
getmaxyx(stdscr(), &mut mlines, &mut mcols);
|
||||||
|
game_win = frontend::game_window(mlines, mcols, 5, 10);
|
||||||
|
loop {
|
||||||
|
ch = wgetch(game_win);
|
||||||
|
match ch {
|
||||||
|
KEY_UP => (),
|
||||||
|
KEY_DOWN => (),
|
||||||
|
KEY_LEFT => (),
|
||||||
|
KEY_RIGHT => (),
|
||||||
|
112 => {
|
||||||
|
match menu::pause_menu_control() {
|
||||||
|
//112 is keycode for 'p'
|
||||||
|
0 => (), //resume
|
||||||
|
1 => (), //restart
|
||||||
|
2 => break, //exit
|
||||||
|
_ => (), //other charachters just in case
|
||||||
|
}
|
||||||
|
wrefresh(game_win);
|
||||||
|
}
|
||||||
|
27 => break,
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
sleep(std::time::Duration::new(0, 10));
|
||||||
|
}
|
||||||
|
frontend::destroy_window(game_win);
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
extern crate ncurses;
|
||||||
|
mod game;
|
||||||
|
mod menu;
|
||||||
|
// use game::{Cell, Snake};
|
||||||
|
// use ncurses::*;
|
||||||
|
use ncurses::{curs_set, endwin, initscr, keypad, noecho, raw, refresh, stdscr, CURSOR_VISIBILITY};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// let (lines, cols): (i32, i32) = (0, 0);
|
||||||
|
initscr();
|
||||||
|
raw();
|
||||||
|
keypad(stdscr(), true);
|
||||||
|
curs_set(CURSOR_VISIBILITY::CURSOR_INVISIBLE);
|
||||||
|
noecho();
|
||||||
|
loop {
|
||||||
|
match menu::main_menu_control() {
|
||||||
|
0 => game::start(),
|
||||||
|
1 => game::start(),
|
||||||
|
_ => break,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
refresh();
|
||||||
|
endwin();
|
||||||
|
}
|
||||||
+118
@@ -0,0 +1,118 @@
|
|||||||
|
use ncurses::*;
|
||||||
|
fn menu_window(mlines: i32, mcols: i32, lines: i32, cols: i32) -> WINDOW {
|
||||||
|
let menu_win: WINDOW;
|
||||||
|
let (starty, startx): (i32, i32);
|
||||||
|
starty = (mlines - lines) / 2;
|
||||||
|
startx = (mcols - cols) / 2;
|
||||||
|
menu_win = newwin(lines, cols, starty, startx);
|
||||||
|
box_(menu_win, 0, 0); // add default border
|
||||||
|
wrefresh(menu_win); // refreshes the new window to draw it
|
||||||
|
keypad(menu_win, true); // to use arrow keys
|
||||||
|
menu_win
|
||||||
|
}
|
||||||
|
fn destroy_window(win: WINDOW) {
|
||||||
|
wmove(win, 0, 0);
|
||||||
|
wclrtobot(win);
|
||||||
|
// wborder(win, 32, 32, 32, 32, 32, 32, 32, 32); // 32 is the ascii code for whitespace. this replaces all the window borders with whitespace
|
||||||
|
wrefresh(win); // refresh to remove the borders
|
||||||
|
delwin(win); // delete the window
|
||||||
|
}
|
||||||
|
pub fn pause_menu_control() -> i8 {
|
||||||
|
let mut ch: i32 = 0;
|
||||||
|
let choice: i8;
|
||||||
|
let (mut lines, mut cols): (i32, i32) = (0, 0);
|
||||||
|
let menu_win: WINDOW;
|
||||||
|
let menu_items = vec!["Resume", "Restart", "Exit"];
|
||||||
|
let menu_desc = vec!["Resume the game", "Restart the game", "Exit Game"];
|
||||||
|
let mut menu_highlight: usize = 0;
|
||||||
|
|
||||||
|
getmaxyx(stdscr(), &mut lines, &mut cols);
|
||||||
|
menu_win = menu_window(lines, cols, 10, 20);
|
||||||
|
loop {
|
||||||
|
for (menu_item_num, menu_item) in menu_items.iter().enumerate() {
|
||||||
|
if menu_item_num == menu_highlight {
|
||||||
|
wattron(menu_win, A_REVERSE());
|
||||||
|
}
|
||||||
|
mvwaddstr(menu_win, menu_item_num as i32 + 1, 1, &menu_item);
|
||||||
|
wattroff(menu_win, A_REVERSE());
|
||||||
|
wrefresh(menu_win);
|
||||||
|
}
|
||||||
|
mvwaddstr(menu_win, 7, 1, " ");
|
||||||
|
mvwaddnstr(menu_win, 7, 1, &menu_desc[menu_highlight], 18);
|
||||||
|
mvwaddstr(menu_win, 8, 1, &format!("{}", ch));
|
||||||
|
ch = wgetch(menu_win);
|
||||||
|
match ch {
|
||||||
|
KEY_UP | 107 => {
|
||||||
|
if menu_highlight > 0 {
|
||||||
|
menu_highlight -= 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
KEY_DOWN | 106 => {
|
||||||
|
if menu_highlight < 2 {
|
||||||
|
menu_highlight += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
10 => {
|
||||||
|
choice = menu_highlight as i8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
27 => {
|
||||||
|
choice = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
destroy_window(menu_win);
|
||||||
|
choice
|
||||||
|
}
|
||||||
|
pub fn main_menu_control() -> i8 {
|
||||||
|
let mut ch: i32 = 0;
|
||||||
|
let choice: i8;
|
||||||
|
let (mut lines, mut cols): (i32, i32) = (0, 0);
|
||||||
|
let menu_win: WINDOW;
|
||||||
|
let menu_items = vec!["Start", "High Score", "Exit"];
|
||||||
|
let menu_desc = vec!["Start the game", "Check Highscrore", "Exit Game"];
|
||||||
|
let mut menu_highlight: usize = 0;
|
||||||
|
|
||||||
|
getmaxyx(stdscr(), &mut lines, &mut cols);
|
||||||
|
menu_win = menu_window(lines, cols, 10, 20);
|
||||||
|
loop {
|
||||||
|
for (menu_item_num, menu_item) in menu_items.iter().enumerate() {
|
||||||
|
if menu_item_num == menu_highlight {
|
||||||
|
wattron(menu_win, A_REVERSE());
|
||||||
|
}
|
||||||
|
mvwaddstr(menu_win, menu_item_num as i32 + 1, 1, &menu_item);
|
||||||
|
wattroff(menu_win, A_REVERSE());
|
||||||
|
wrefresh(menu_win);
|
||||||
|
}
|
||||||
|
mvwaddstr(menu_win, 7, 1, " ");
|
||||||
|
mvwaddnstr(menu_win, 7, 1, &menu_desc[menu_highlight], 18);
|
||||||
|
mvwaddstr(menu_win, 8, 1, &format!("{}", ch));
|
||||||
|
ch = wgetch(menu_win);
|
||||||
|
match ch {
|
||||||
|
KEY_UP | 107 => {
|
||||||
|
if menu_highlight > 0 {
|
||||||
|
menu_highlight -= 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
KEY_DOWN | 106 => {
|
||||||
|
if menu_highlight < 2 {
|
||||||
|
menu_highlight += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
10 => {
|
||||||
|
choice = menu_highlight as i8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
27 => {
|
||||||
|
choice = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
destroy_window(menu_win);
|
||||||
|
choice
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user