class Text2048::Board

2048 game board

Attributes

score[R]

@return [Number] returns the current score

Public Class Methods

new(tiles = Array.new(4, Array.new(4)), score = 0) click to toggle source
# File lib/text2048/board.rb, line 14
def initialize(tiles = Array.new(4, Array.new(4)), score = 0)
  @all_tiles = tiles.hashinize
  @score = score
end

Public Instance Methods

down() click to toggle source

@macro move

# File lib/text2048/board.rb, line 45
def down
  transpose { right }
end
generate() click to toggle source

Generates a new tile @return [Board] a new board

# File lib/text2048/board.rb, line 77
def generate
  tiles = @all_tiles.dup
  tiles[sample_empty_tile] = Tile.new(rand < 0.9 ? 2 : 4, :generated)
  new_board(tiles, @score)
end
generate?(other) click to toggle source

Need to generate a new tile? @param other [Board] the previous {Board} object @return [Boolean] generate a new tile?

# File lib/text2048/board.rb, line 71
def generate?(other)
  to_a != other.to_a
end
generated_tiles() click to toggle source

@return [Array] the list of +[row, col]+ of the newly generated tiles

# File lib/text2048/board.rb, line 64
def generated_tiles
  find_tiles :generated
end
left() click to toggle source

@macro move

# File lib/text2048/board.rb, line 35
def left
  flip_horizontal { right }
end
lose?() click to toggle source
# File lib/text2048/board.rb, line 91
def lose?
  right.left.up.down.tiles.size == 4 * 4
end
merged_tiles() click to toggle source

@return [Array] the list of +[row, col]+ of the merged tiles

# File lib/text2048/board.rb, line 59
def merged_tiles
  find_tiles :merged
end
right() click to toggle source

@macro move

# File lib/text2048/board.rb, line 26
def right
  board, score = to_a.reduce([[], @score]) do |(rows, sc), each|
    row, row_sc = each.right
    [rows << row, sc + row_sc]
  end
  new_board(board, score)
end
tiles() click to toggle source

@return [Array<Tile>] the list of tiles

# File lib/text2048/board.rb, line 54
def tiles
  @all_tiles.select { |_key, each| each.to_i > 0 }
end
to_a() click to toggle source

@return [Array] a 2D array of tiles.

# File lib/text2048/board.rb, line 100
def to_a
  [0, 1, 2, 3].map { |each| row(each) }
end
up() click to toggle source

@macro move

# File lib/text2048/board.rb, line 40
def up
  transpose { left }
end
win?() click to toggle source

@!group Win/Lose

# File lib/text2048/board.rb, line 87
def win?
  @all_tiles.any? { |_key, value| value.to_i >= 2048 }
end

Private Instance Methods

empty_tiles() click to toggle source
# File lib/text2048/board.rb, line 126
def empty_tiles
  @all_tiles.select { |_key, each| each.to_i == 0 }
end
find_tiles(status) click to toggle source
# File lib/text2048/board.rb, line 139
def find_tiles(status)
  @all_tiles.select { |_key, each| each.status == status }.keys
end
flip_horizontal(&block) click to toggle source

@!endgroup

# File lib/text2048/board.rb, line 108
def flip_horizontal(&block)
  board = flipped_board.instance_eval(&block)
  new_board(board.to_a.map(&:reverse), board.score)
end
flipped_board() click to toggle source
# File lib/text2048/board.rb, line 113
def flipped_board
  new_board(to_a.map(&:reverse), @score)
end
new_board(tiles, score) click to toggle source
# File lib/text2048/board.rb, line 135
def new_board(tiles, score)
  self.class.new(tiles, score)
end
row(index) click to toggle source
# File lib/text2048/board.rb, line 143
def row(index)
  [index].product([0, 1, 2, 3]).map { |each| @all_tiles[each] }
end
sample_empty_tile() click to toggle source
# File lib/text2048/board.rb, line 130
def sample_empty_tile
  fail if empty_tiles.empty?
  empty_tiles.keys.shuffle.first
end
transpose(&block) click to toggle source
# File lib/text2048/board.rb, line 117
def transpose(&block)
  board = transposed_board.instance_eval(&block)
  new_board(board.to_a.transpose, board.score)
end
transposed_board() click to toggle source
# File lib/text2048/board.rb, line 122
def transposed_board
  new_board(to_a.transpose, @score)
end