Skip to main content
Code Review

Return to Revisions

1 of 2

Recreated Snake in Rust

This is my first ever program in Rust, I've made it using only the book, the reference, and any documentation about the crates/functions i was using on the official rust lang website.

I have the feeling this could be cleaned up a lot, looking for suggestions.

extern crate rand;
extern crate device_query;
use std::{vec, thread::sleep, time::Duration};
use rand::*;
use device_query::{DeviceQuery, DeviceState, Keycode};
fn main(){
 let device_state = DeviceState::new();
 let mut rows = [['⬛'; 11]; 11];
 let mut score: i32 = 0;
 let mut direction: u8 = 0; // = Up, 1 = Left, 2 = Down, 3= Right
 let mut positions:Vec<(usize, usize)> = vec![(5,5)]; //every square taken by our slithery friend
 let mut close_game: bool = false;
 rows[5][5] = '🟩';
 rows[3][5] = '🍎';
 while !close_game {
 print!("\x1B[2J\x1B[1;1H");
 direction = input_direction(direction, &device_state);
 close_game = game_tick(&mut rows, &mut positions, direction, &mut score);
 draw_game(&rows, &score);
 sleep(Duration::from_millis(300));
 }
 println!("Game over! Final Score: {}", score);
} 
fn draw_game(a: &[[char;11];11], score: &i32){
 println!("");
 println!(" Score:{:02} teo.snake", &score);
 for i in 1..10 {
 print!(" ");
 for j in 1..10 {
 print!("{}", a[i][j]);
 }
 println!("");
 }
}
fn game_tick(a: &mut[[char;11];11], vec: &mut Vec<(usize, usize)>, d: u8, s: &mut i32)-> bool {
 let mut game_over: bool = false;
 let newpos: (usize, usize)= newposition(d, vec[0], &mut game_over);
 if game_over == true {
 return game_over
 }
 for i in 0..vec.len() {
 if newpos == vec[i] {
 game_over = true;
 return game_over
 }
 }
 vec.insert(0, newpos);
 let mut next_fruitx:usize;
 let mut next_fruity:usize;
 let mut checkpass: bool;
 'looptillvalid: loop {
 checkpass = true;
 next_fruitx = rand::thread_rng().gen_range(1..10);
 next_fruity = rand::thread_rng().gen_range(1..10);
 for i in 0..vec.len() {
 if (next_fruitx, next_fruity) == vec[i] {
 checkpass = false;
 break;
 }
 }
 if checkpass == true { 
 break 'looptillvalid;
 }
 }
 let lastpos: (usize, usize) = vec.pop().unwrap();
 a[lastpos.0][lastpos.1] = '⬛';
 match a[newpos.0][newpos.1] {
 '🍎' => { vec.push(lastpos);
 a[newpos.0][newpos.1] = '🟩'; 
 a[lastpos.0][lastpos.1] = '🟩';
 *s += 1; 
 game_over = false;
 a[next_fruitx][next_fruity] = '🍎';
 }
 _ => { a[newpos.0][newpos.1] = '🟩';
 game_over = false}
 }
 game_over
}
fn newposition(d: u8, first: (usize, usize), go: &mut bool) -> (usize, usize){
 let mut ret: (usize, usize) = (0,0);
 match d {
 0 => { ret.0 = first.0 - 1; ret.1 = first.1}
 1 => { ret.0 = first.0; ret.1 = first.1 - 1}
 2 => { ret.0 = first.0 + 1; ret.1 = first.1}
 3 => { ret.0 = first.0; ret.1 = first.1 + 1}
 _ => {println!("Invalid Direction")}
 }
 if ret.0 < 1 || ret.0 > 9 || ret.1 < 1 || ret.1 > 9 {
 *go = true;
 }
 ret
}
fn input_direction(d: u8, d_state: &DeviceState) -> u8{
 let mut dir: u8 = d;
 
 let keys: Vec<Keycode> = d_state.get_keys(); 
 if keys.len() != 0 {
 match keys[0] {
 
 Keycode::Up => {dir = 0}
 Keycode::Left => {dir = 1}
 Keycode::Down => {dir = 2}
 Keycode::Right => {dir = 3}
 _ => ()
 }
 }
 dir
}
lang-rust

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /