- 29.5k
- 16
- 45
- 202
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 iI was using on the official rust lang website.
I have the feeling this could be cleaned up a lot,. I'm 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
}
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
}
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
}
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. I'm 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
}
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
}