Initial commit

master
kirbylife 2020-07-10 19:47:42 -05:00
commit 7d88220960
3 changed files with 189 additions and 0 deletions

17
.gitignore vendored 100644
View File

@ -0,0 +1,17 @@
# Created by https://www.toptal.com/developers/gitignore/api/rust
# Edit at https://www.toptal.com/developers/gitignore?templates=rust
### Rust ###
# Generated by Cargo
# will have compiled files and executables
/target/
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
Cargo.lock
# These are backup files generated by rustfmt
**/*.rs.bk
# End of https://www.toptal.com/developers/gitignore/api/rust

9
Cargo.toml 100644
View File

@ -0,0 +1,9 @@
[package]
name = "afusnakec"
version = "0.1.0"
authors = ["kirbylife <kirbylife@protonmail.com>"]
edition = "2018"
[dependencies]
ggez = "0.5"
rand = "0.7.3"

163
src/main.rs 100644
View File

@ -0,0 +1,163 @@
use ggez;
use ggez::event;
use ggez::event::KeyCode;
use ggez::graphics;
use ggez::input;
use ggez::nalgebra as na;
use ggez::{Context, GameResult};
use rand::Rng;
pub fn main() -> GameResult {
let cb = ggez::ContextBuilder::new("AFUSnakeC", "ggez");
let (ctx, event_loop) = &mut cb.build()?;
let state = &mut MainState::new()?;
event::run(ctx, event_loop, state)
}
#[derive(PartialEq)]
enum Direction {
UP,
DOWN,
LEFT,
RIGHT,
}
struct Snake {
nodes: Vec<(i32, i32)>,
direction: Direction,
}
impl Snake {
fn new() -> Self {
let mut nodes: Vec<(i32, i32)> = vec![];
let mut rng = rand::thread_rng();
let start: (i32, i32) = (rng.gen_range(0, 80), rng.gen_range(0, 60));
for n in 0..50 {
nodes.push((start.0 - (n), start.1));
}
Snake {
nodes: nodes,
direction: Direction::RIGHT,
}
}
}
struct Fruit(i32, i32);
impl Fruit {
fn new() -> Self {
let mut rng = rand::thread_rng();
Fruit(rng.gen_range(0, 80), rng.gen_range(0, 60))
}
}
struct MainState {
snake: Snake,
fruit: Fruit,
}
impl MainState {
fn new() -> GameResult<MainState> {
let s = MainState {
snake: Snake::new(),
fruit: Fruit::new(),
};
Ok(s)
}
}
impl event::EventHandler for MainState {
fn update(&mut self, ctx: &mut Context) -> GameResult {
// Move the snake
// Remove the last node (the tail)
if self.snake.nodes.contains(&(self.fruit.0, self.fruit.1)) {
self.fruit = Fruit::new();
} else {
self.snake.nodes.pop().unwrap();
}
let head = self.snake.nodes[0];
let vector: (i32, i32) = match self.snake.direction {
Direction::RIGHT => (1, 0),
Direction::LEFT => (-1, 0),
Direction::UP => (0, -1),
Direction::DOWN => (0, 1),
};
let mut tail = ((head.0 + vector.0) % 80, (head.1 + vector.1) % 60);
if tail.0 < 0 {
tail.0 += 79;
}
if tail.1 < 0 {
tail.1 += 59;
}
if self.snake.nodes.contains(&tail) {
self.snake = Snake::new();
self.fruit = Fruit::new();
} else {
self.snake.nodes.insert(0, tail);
}
// Change the direction in function of the key pressed
use input::keyboard;
if keyboard::is_key_pressed(ctx, KeyCode::Right) {
if [Direction::UP, Direction::DOWN].contains(&self.snake.direction) {
self.snake.direction = Direction::RIGHT;
}
} else if keyboard::is_key_pressed(ctx, KeyCode::Left) {
if [Direction::UP, Direction::DOWN].contains(&self.snake.direction) {
self.snake.direction = Direction::LEFT;
}
} else if keyboard::is_key_pressed(ctx, KeyCode::Up) {
if [Direction::LEFT, Direction::RIGHT].contains(&self.snake.direction) {
self.snake.direction = Direction::UP;
}
} else if keyboard::is_key_pressed(ctx, KeyCode::Down) {
if [Direction::LEFT, Direction::RIGHT].contains(&self.snake.direction) {
self.snake.direction = Direction::DOWN;
}
}
Ok(())
}
fn draw(&mut self, ctx: &mut Context) -> GameResult {
graphics::clear(ctx, [0.1, 0.2, 0.3, 1.0].into());
for node in self.snake.nodes.iter() {
let node = graphics::Mesh::new_rectangle(
ctx,
graphics::DrawMode::fill(),
graphics::Rect {
x: node.0 as f32 * 10.0,
y: node.1 as f32 * 10.0,
h: 10.0,
w: 10.0,
},
graphics::WHITE,
)?;
graphics::draw(ctx, &node, (na::Point2::new(0.0, 0.0),))?;
}
let fruit = graphics::Mesh::new_rectangle(
ctx,
graphics::DrawMode::fill(),
graphics::Rect {
x: self.fruit.0 as f32 * 10.0,
y: self.fruit.1 as f32 * 10.0,
h: 10.0,
w: 10.0,
},
graphics::BLACK,
)?;
graphics::draw(ctx, &fruit, (na::Point2::new(0.0, 0.0),))?;
graphics::present(ctx)?;
Ok(())
}
}