rust_snake 0.1.1

Snake game made in Rust
Documentation
extern crate graphics;
extern crate opengl_graphics;
extern crate piston;
extern crate piston_window;

extern crate rand;

use std::{collections::LinkedList, iter::FromIterator};

use opengl_graphics::{GlGraphics, OpenGL};
use piston::{
    event_loop::{EventLoop, EventSettings, Events},
    input::{ButtonEvent, ButtonState, RenderEvent, UpdateEvent},
    window::WindowSettings,
};
use piston_window::PistonWindow;
use rand::{thread_rng, Rng};
use rust_snake::game::{
    food::Food,
    snake::{Direction, Snake, SnakePiece},
    Game,
};

fn main() {
    let opengl = OpenGL::V4_5;

    const COLS: u32 = 30;
    const ROWS: u32 = 20;
    const SQUARE_WIDTH: u32 = 20;

    let width = COLS * SQUARE_WIDTH;
    let height = ROWS * SQUARE_WIDTH;

    let mut window: PistonWindow = WindowSettings::new("Rust Snake", [width, height])
        .exit_on_esc(true)
        .resizable(false)
        .build()
        .unwrap();

    let mut r = thread_rng();

    let mut game = Game {
        gl: GlGraphics::new(opengl),
        rows: ROWS,
        cols: COLS,
        square_width: SQUARE_WIDTH,
        just_eaten: false,
        food: Food {
            x: r.gen_range(0..COLS),
            y: r.gen_range(0..ROWS),
        },
        score: 0,
        snake: Snake {
            gl: GlGraphics::new(opengl),
            snake_parts: LinkedList::from_iter((vec![SnakePiece(COLS / 4, ROWS / 2)]).into_iter()),
            width: SQUARE_WIDTH,
            d: Direction::RIGHT,
        },
    };

    let mut events = Events::new(EventSettings::new()).ups(10);
    while let Some(e) = events.next(&mut window) {
        if let Some(r) = e.render_args() {
            game.render(&r);
        }

        if let Some(u) = e.update_args() {
            if !game.update(&u) {
                break;
            }
        }

        if let Some(k) = e.button_args() {
            if k.state == ButtonState::Press {
                game.pressed(&k.button);
            }
        }
    }
    println!("Congratulations, your score was: {}", game.score);
}