2048: Difference between revisions
Content added Content deleted
m (→{{header|Java}}: small change) |
(added basic solution in rust) |
||
Line 2,824: | Line 2,824: | ||
end |
end |
||
</lang> |
</lang> |
||
=={{header|Rust}}== |
|||
===Text mode=== |
|||
A simple implementation in rust. The user has to input an endline since i did not find a way to read a key press |
|||
<lang rust> |
|||
use std::io::{self,BufRead}; |
|||
extern crate rand; |
|||
enum Usermove { |
|||
Up, |
|||
Down, |
|||
Left, |
|||
Right, |
|||
} |
|||
fn print_game(field :& [[u32;4];4] ){ |
|||
println!("{:?}",&field[0] ); |
|||
println!("{:?}",&field[1] ); |
|||
println!("{:?}",&field[2] ); |
|||
println!("{:?}",&field[3] ); |
|||
} |
|||
fn get_usermove()-> Usermove { |
|||
let umove: Usermove ; |
|||
loop{ |
|||
let mut input = String::new(); |
|||
io::stdin().read_line(&mut input).unwrap(); |
|||
match input.chars().nth(0){ |
|||
Some('a') =>{umove = Usermove::Left ;break }, |
|||
Some('w') =>{umove = Usermove::Up ;break }, |
|||
Some('s') =>{umove = Usermove::Down ;break }, |
|||
Some('d') =>{umove = Usermove::Right;break }, |
|||
_ => {println!("input was {}: invalid character should be a,s,w or d ",input.chars().nth(0).unwrap());} , |
|||
} |
|||
} |
|||
umove |
|||
} |
|||
//this function inplements the user moves. |
|||
//for every element it looks if the element is zero |
|||
// if the element is zero it looks against the direction of the movement if any |
|||
//element is not zero then it will move it to the element its place then it will look for |
|||
//a matching element |
|||
// if the element is not zero then it will look for a match if no match is found |
|||
// then it will look for the next element |
|||
fn do_game_step(step : &Usermove, field:&mut [[u32;4];4]){ |
|||
match *step { |
|||
Usermove::Left =>{ |
|||
for array in field{ |
|||
for col in 0..4 { |
|||
for testcol in (col+1)..4 { |
|||
if array[testcol] != 0 { |
|||
if (array[col] == 0 ){ |
|||
array[col] += array[testcol]; |
|||
array[testcol] = 0; |
|||
} |
|||
else if( array[col] == array[testcol] ){ |
|||
array[col] += array[testcol]; |
|||
array[testcol] = 0; |
|||
break; |
|||
}else { |
|||
break |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} , |
|||
Usermove::Right=>{ |
|||
for array in field{ |
|||
for col in (0..4).rev() { |
|||
for testcol in (0..col).rev() { |
|||
if array[testcol] != 0 { |
|||
if (array[col] == 0 ){ |
|||
array[col] += array[testcol]; |
|||
array[testcol] = 0; |
|||
} |
|||
else if( array[col] == array[testcol] ){ |
|||
array[col] += array[testcol]; |
|||
array[testcol] = 0; |
|||
break; |
|||
}else { |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} , |
|||
Usermove::Down =>{ |
|||
for col in 0..4 { |
|||
for row in (0..4).rev() { |
|||
for testrow in (0..row).rev() { |
|||
if field[testrow][col] != 0 { |
|||
if field[row][col] == 0 |
|||
field[row][col] += field[testrow][col]; |
|||
field[testrow][col] = 0; |
|||
else if field[row][col] == field[testrow][col] { |
|||
field[row][col] += field[testrow][col]; |
|||
field[testrow][col] = 0; |
|||
break; |
|||
}else { |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} , |
|||
Usermove::Up =>{ |
|||
for col in 0..4 { |
|||
for row in 0..4{ |
|||
for testrow in (row+1)..4 { |
|||
if field[testrow][col] != 0 { |
|||
if field[row][col] == 0 |
|||
field[row][col] += field[testrow][col]; |
|||
field[testrow][col] = 0; |
|||
else if field[row][col] == field[testrow][col] { |
|||
field[row][col] += field[testrow][col]; |
|||
field[testrow][col] = 0; |
|||
break; |
|||
}else { |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
} |
|||
} |
|||
fn spawn( field: &mut [[u32;4];4]){ |
|||
loop{ |
|||
let x = rand::random::<usize>(); |
|||
if field[x % 4][(x/4)%4] == 0 { |
|||
if x % 10 == 0 { |
|||
field[x % 4][(x/4)%4]= 4; |
|||
}else{ |
|||
field[x % 4][(x/4)%4]= 2; |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
fn main() { |
|||
let mut field : [[u32; 4];4] = [[0;4];4]; |
|||
let mut test : [[u32; 4];4] ; |
|||
'gameloop:loop { |
|||
//check if there is still an open space |
|||
test=field.clone(); |
|||
spawn(&mut field); |
|||
//if all possible moves do not yield a change then there is no valid move left |
|||
//and it will be game over |
|||
for i in [Usermove::Up,Usermove::Down,Usermove::Left,Usermove::Right].into_iter(){ |
|||
do_game_step(i, &mut test); |
|||
if test != field{ |
|||
break;//found a valid move |
|||
} |
|||
match *i{ |
|||
Usermove::Right=> { |
|||
println!("No more valid move, you lose"); |
|||
break 'gameloop; |
|||
}, |
|||
_=>{}, |
|||
} |
|||
} |
|||
print_game(&field); |
|||
println!("move the blocks"); |
|||
test=field.clone(); |
|||
while test==field { |
|||
do_game_step(&get_usermove(), &mut field); |
|||
} |
|||
for row in field.iter(){ |
|||
if row.iter().any(|x| *x == 2048){ |
|||
print_game(&field ); |
|||
println!("You Won!!"); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</lang> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |
||
===Text mode=== |
===Text mode=== |