Initial board representation

Added a basic board object for holding a 4x4 array of tile values.
Added a class for printing a representation of the board to standard
output.
Added .gitignore

Ignore object files and resulting binary.
Board validation and unit tests

Added isValid method to Board. Added basic unit test framework. Changed
tile value array from 2D to 1D (easier to pass around).
Tile merge check

Added method to Board for checking if two tiles can merge. Added
corresponding unit tests.
Row and column move checks

Added methods to Board for checking if a row or a column can move.
Added corresponding unit tests. Changed Board.isValid() - it no longer
needs two for loops now that the tile array is 1D.
Board move unit tests

Added unit tests for canMove method on Board.
Board movement methods

Added methods to Board to set a tile value, merge tiles, and move a
tile, row, column, and the entire board board.
Use preincrement operators

Switched post-increment operators to pre-increment to maintain
consistency with pre-increment operators elsewhere in the code.
Board movement unit tests

Added unit tests for move method on Board.
Copy tiles in Board constructor

Board constructor needs to copy the initial tile array so that the
board can move tiles without affecting outside data (like other
boards). Added destructor to release tile array memory.
Board.isValid() refinement

Use log2 and pow functions to determine if tile’s value equals 3 * (2 ^
n). Added an additional unit test for isValid.
Maximum tile value is 6144

Added upper bound for tile values in Board.tilesCanMerge (two 6144’s
can’t merge because 12288’s don’t exist).
Added Board.getScore method

Added getScore method to Board. Added corresponding unit test.
Fixed maximum tile boundary in tilesCanMerge

Tiles can only merge if they are less than 6144.
Added board.canMove method

Added method to check if the board can move in any direction, not just
a specified direction.
Added Board.tileIsValid method

Added method to check if a given tile value is valid. Modified
Board.isValid to use the new method.
BoardPrinter prints current score

Updated BoardPrinter to print the current score of the board after
printing its visual representation.
Read in moves from user

Updated main() to read in moves from the user, validate the moves
against the board state, update the board, and print out the updated
board and score.
Input error handling

Improved input error handling for the initial board and for user moves.
Release version 1 of threes-ai.