Can move/merge tiles up/down
This commit is contained in:
parent
ebdf6a5270
commit
c46b19e8c3
2 changed files with 92 additions and 2 deletions
|
|
@ -41,6 +41,12 @@ impl Game for App {
|
||||||
if key == keyboard::Right {
|
if key == keyboard::Right {
|
||||||
self.board.merge_from_left_to_right();
|
self.board.merge_from_left_to_right();
|
||||||
}
|
}
|
||||||
|
if key == keyboard::Up {
|
||||||
|
self.board.merge_from_bottom_to_top();
|
||||||
|
}
|
||||||
|
if key == keyboard::Down {
|
||||||
|
self.board.merge_from_top_to_bottom();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn key_release(
|
fn key_release(
|
||||||
|
|
|
||||||
88
src/board.rs
88
src/board.rs
|
|
@ -91,6 +91,85 @@ impl Board {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn merge_from_bottom_to_top(&mut self) {
|
||||||
|
self.merge_col(0, settings::TILE_HEIGHT, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn merge_from_top_to_bottom(&mut self) {
|
||||||
|
self.merge_col(settings::TILE_HEIGHT - 1, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn merge_col(&mut self, y_start: int, y_end: int, y_step: int) {
|
||||||
|
if self.is_locking() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut need_generate = false;
|
||||||
|
loop {
|
||||||
|
// move all tiles to right place
|
||||||
|
for col in range(0, settings::TILE_WIDTH) {
|
||||||
|
for row in range_step(y_start, y_end, y_step) {
|
||||||
|
match self.get_mut_tile(col, row) {
|
||||||
|
None => {
|
||||||
|
match self.get_mut_next_tile(col, row, 0, y_step) {
|
||||||
|
Some(ref mut tile) => {
|
||||||
|
println!("move ({}, {}) to ({}, {})",
|
||||||
|
tile.tile_x, tile.tile_y, col, row);
|
||||||
|
tile.start_moving(col, row);
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut did_merged = false;
|
||||||
|
for col in range(0, settings::TILE_WIDTH) {
|
||||||
|
let mut found = false;
|
||||||
|
let mut sx = 0;
|
||||||
|
let mut sy = 0;
|
||||||
|
let mut dx = 0;
|
||||||
|
let mut dy = 0;
|
||||||
|
for row in range_step(y_start, y_end, y_step) {
|
||||||
|
match self.get_tile(col, row) {
|
||||||
|
Some(ref d_tile) => {
|
||||||
|
match self.get_next_tile(col, row, 0, y_step) {
|
||||||
|
Some(ref s_tile) if d_tile.score == s_tile.score => {
|
||||||
|
found = true;
|
||||||
|
dx = d_tile.tile_x;
|
||||||
|
dy = d_tile.tile_y;
|
||||||
|
sx = s_tile.tile_x;
|
||||||
|
sy = s_tile.tile_y;
|
||||||
|
break;
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
need_generate = true;
|
||||||
|
did_merged = true;
|
||||||
|
let mut tile = self.get_mut_tile(sx, sy);
|
||||||
|
let tile = tile.get_mut_ref();
|
||||||
|
tile.start_moving(dx, dy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !did_merged {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if need_generate {
|
||||||
|
self.generate_tile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn merge_from_left_to_right(&mut self) {
|
pub fn merge_from_left_to_right(&mut self) {
|
||||||
self.merge_row(settings::TILE_WIDTH - 1, -1, -1);
|
self.merge_row(settings::TILE_WIDTH - 1, -1, -1);
|
||||||
}
|
}
|
||||||
|
|
@ -104,6 +183,7 @@ impl Board {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut need_generate = false;
|
||||||
loop {
|
loop {
|
||||||
// move all tiles to right place
|
// move all tiles to right place
|
||||||
for row in range(0, settings::TILE_HEIGHT) {
|
for row in range(0, settings::TILE_HEIGHT) {
|
||||||
|
|
@ -113,6 +193,7 @@ impl Board {
|
||||||
match self.get_mut_next_tile(col, row, x_step, 0) {
|
match self.get_mut_next_tile(col, row, x_step, 0) {
|
||||||
Some(ref mut tile) => {
|
Some(ref mut tile) => {
|
||||||
println!("move ({}, {}) to ({}, {})", tile.tile_x, tile.tile_y, col, row);
|
println!("move ({}, {}) to ({}, {})", tile.tile_x, tile.tile_y, col, row);
|
||||||
|
need_generate = true;
|
||||||
tile.start_moving(col, row);
|
tile.start_moving(col, row);
|
||||||
},
|
},
|
||||||
_ => {},
|
_ => {},
|
||||||
|
|
@ -152,9 +233,10 @@ impl Board {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if found {
|
if found {
|
||||||
|
need_generate = true;
|
||||||
did_merged = true;
|
did_merged = true;
|
||||||
let mut tile = self.get_mut_tile(sx, sy);
|
let mut tile = self.get_mut_tile(sx, sy);
|
||||||
let mut tile = tile.get_mut_ref();
|
let tile = tile.get_mut_ref();
|
||||||
tile.start_moving(dx, dy);
|
tile.start_moving(dx, dy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -164,7 +246,9 @@ impl Board {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.generate_tile();
|
if need_generate {
|
||||||
|
self.generate_tile();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn can_merge_row(&self, row: int) -> bool {
|
fn can_merge_row(&self, row: int) -> bool {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue