Can merge tiles while moving left/right

This commit is contained in:
Coeuvre 2014-05-21 15:53:40 +08:00
parent 1e9e8ac303
commit 52bec0e312
5 changed files with 101 additions and 22 deletions

View file

@ -34,9 +34,9 @@ SOURCE_FILES = $(shell test -e src/ && find src -type f)
COMPILER = rustc COMPILER = rustc
# For release: # For release:
COMPILER_FLAGS = -O # COMPILER_FLAGS = -O
# For debugging: # For debugging:
# COMPILER_FLAGS = -g COMPILER_FLAGS = -g
RUSTDOC = rustdoc RUSTDOC = rustdoc

View file

@ -3,7 +3,6 @@ use graphics::*;
use piston::*; use piston::*;
use board::Board; use board::Board;
use settings;
pub struct App { pub struct App {
board: Board, board: Board,
@ -50,3 +49,4 @@ impl Game for App {
_asset_store: &mut AssetStore _asset_store: &mut AssetStore
) {} ) {}
} }

View file

@ -1,5 +1,6 @@
use std::iter::range_step; use std::iter::range_step;
use collections::hashmap::HashSet;
use rand::random; use rand::random;
use graphics::*; use graphics::*;
use piston::*; use piston::*;
@ -25,7 +26,7 @@ impl Board {
return; return;
} }
'generating: loop { loop {
let x = (random::<uint>() % settings::TILE_WIDTH as uint) as int; let x = (random::<uint>() % settings::TILE_WIDTH as uint) as int;
let y = (random::<uint>() % settings::TILE_HEIGHT as uint) as int; let y = (random::<uint>() % settings::TILE_HEIGHT as uint) as int;
if self.get_tile(x, y).is_none() { if self.get_tile(x, y).is_none() {
@ -39,6 +40,41 @@ impl Board {
for tile in self.tiles.mut_iter() { for tile in self.tiles.mut_iter() {
tile.update(dt); tile.update(dt);
} }
if self.is_locking() {
return;
}
let mut tiles_need_removed = HashSet::<uint>::new();
let mut tiles_need_added = Vec::<Tile>::new();
for i in range(0, self.tiles.len()) {
let tile1 = self.tiles.get(i);
if tile1.status != TileStatic {
continue;
}
for j in range(i + 1, self.tiles.len()) {
let tile2 = self.tiles.get(j);
if tile2.status != TileStatic
|| tile1.tile_x != tile2.tile_x
|| tile1.tile_y != tile2.tile_y {
continue;
}
tiles_need_removed.insert(i);
tiles_need_removed.insert(j);
tiles_need_added.push(Tile::new(tile1.score + tile2.score, tile1.tile_x, tile1.tile_y));
break;
}
}
if tiles_need_removed.len() > 0 {
let mut tiles = Vec::<Tile>::new();
for i in range(0, self.tiles.len()) {
if !tiles_need_removed.contains(&i) {
tiles.push(*self.tiles.get(i));
}
}
self.tiles = tiles.append(tiles_need_added.as_slice());
}
} }
pub fn render(&self, c: &Context, gl: &mut Gl) { pub fn render(&self, c: &Context, gl: &mut Gl) {
@ -68,24 +104,64 @@ impl Board {
return; return;
} }
// move all tiles to right place loop {
for row in range(0, settings::TILE_HEIGHT) { // move all tiles to right place
for col in range_step(x_start, x_end, x_step) { for row in range(0, settings::TILE_HEIGHT) {
match self.get_mut_tile(col, row) { for col in range_step(x_start, x_end, x_step) {
None => { match self.get_mut_tile(col, row) {
match self.get_mut_next_tile(col, row, x_step, 0) { None => {
Some(ref mut tile) => { match self.get_mut_next_tile(col, row, x_step, 0) {
tile.start_moving(col, row); Some(ref mut tile) => {
}, tile.start_moving(col, row);
_ => {}, },
} _ => {},
}, }
_ => {}, },
_ => {},
}
} }
} }
}
// merge // merge
let mut did_merged = false;
for row in range(0, settings::TILE_HEIGHT) {
let mut found = false;
let mut sx = 0;
let mut sy = 0;
let mut dx = 0;
let mut dy = 0;
for col in range_step(x_start, x_end, x_step) {
match self.get_tile(col, row) {
Some(ref d_tile) => {
match self.get_next_tile(col, row, x_step, 0) {
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 {
did_merged = true;
let mut tile = self.get_mut_tile(sx, sy);
let mut tile = tile.get_mut_ref();
tile.start_moving(dx, dy);
}
}
if !did_merged {
break;
}
}
self.generate_tile(); self.generate_tile();
} }
@ -190,8 +266,8 @@ impl Board {
let mut x = settings::BOARD_PADDING + settings::TILE_PADDING; let mut x = settings::BOARD_PADDING + settings::TILE_PADDING;
let mut y = settings::BOARD_PADDING + settings::BOARD_OFFSET_Y + settings::TILE_PADDING; let mut y = settings::BOARD_PADDING + settings::BOARD_OFFSET_Y + settings::TILE_PADDING;
for row in range(0, settings::TILE_HEIGHT) { for _ in range(0, settings::TILE_HEIGHT) {
for col in range(0, settings::TILE_WIDTH) { for _ in range(0, settings::TILE_WIDTH) {
c.view() c.view()
.rect(x, y, settings::TILE_SIZE, settings::TILE_SIZE) .rect(x, y, settings::TILE_SIZE, settings::TILE_SIZE)
.rgba(settings::TILES_COLOR[0][0], .rgba(settings::TILES_COLOR[0][0],

View file

@ -46,3 +46,4 @@ pub static TILE_MOVE_TIME: f64 = 0.08;
pub static LABEL_COLOR: [f32, ..4] = [187.0 / 255.0, 173.0 / 255.0, 160.0 / 255.0, 1.0]; pub static LABEL_COLOR: [f32, ..4] = [187.0 / 255.0, 173.0 / 255.0, 160.0 / 255.0, 1.0];
pub static BUTTON_COLOR: [f32, ..4] = [142.0 / 255.0, 122.0 / 255.0, 102.0 / 255.0, 1.0]; pub static BUTTON_COLOR: [f32, ..4] = [142.0 / 255.0, 122.0 / 255.0, 102.0 / 255.0, 1.0];

View file

@ -3,13 +3,14 @@ use graphics::*;
use piston::*; use piston::*;
use settings; use settings;
#[deriving(Eq)] #[deriving(Clone, Eq)]
pub enum TileState { pub enum TileState {
TileStatic, TileStatic,
/// (t, x, y) /// (t, x, y)
TileMoving(f64, f64, f64), TileMoving(f64, f64, f64),
} }
#[deriving(Clone)]
pub struct Tile { pub struct Tile {
pub score: int, pub score: int,
pub tile_x: int, pub tile_x: int,
@ -81,3 +82,4 @@ impl Tile {
} }
} }
} }