diff --git a/tb_grid_2048.py b/tb_grid_2048.py
new file mode 100644
index 0000000000000000000000000000000000000000..c2a1b3d208d680e48a67842adeb775e687743426
--- /dev/null
+++ b/tb_grid_2048.py
@@ -0,0 +1,67 @@
+import random as rd
+
+THEMES = {"0": {"name": "Default", 0: "", 2: "2", 4: "4", 8: "8", 16: "16", 32:"32", 64: "64", 128: "128", 256: "256", 512: "512", 1024: "1024", 2048: "2048",4096: "4096", 8192: "8192"}, "1": {"name": "Chemistry", 0: "", 2: "H", 4: "He", 8:"Li", 16: "Be", 32: "B", 64: "C", 128: "N", 256: "O", 512: "F", 1024: "Ne", 2048:"Na", 4096: "Mg", 8192: "Al"}, "2": {"name": "Alphabet", 0: "", 2: "A", 4: "B", 8:"C", 16: "D", 32: "E", 64: "F", 128: "G", 256: "H", 512: "I", 1024: "J", 2048: "K",4096: "L", 8192: "M"}}
+
+def create_grid(n):
+    game_grid = []
+    for i in range(n):
+        game_grid.append([' ']*n)
+    return game_grid
+
+def get_value_new_tile():
+    return rd.choice([2,2,2,2,2,2,2,2,2,4])
+
+def get_all_tiles(grid):
+    tiles = []
+    for line in grid:
+        for tile in line:
+            if tile == ' ': tiles.append(0)
+            else: tiles.append(tile)
+    return tiles
+
+def get_empty_tiles_positions(grid):
+    empty_tiles = []
+    n = len(grid)
+    m = len(grid[0])
+    for i in range(n):
+        for j in range(m):
+            if grid[i][j] == ' ' or grid[i][j] == 0:
+                empty_tiles.append((i,j))
+    return empty_tiles
+
+def get_new_position(grid):
+    empty_tiles = get_empty_tiles_positions(grid)
+    return rd.choice(empty_tiles)
+
+def grid_get_value(grid,x,y):
+    if grid[x][y] == ' ':
+        return 0
+    return grid[x][y]
+
+def grid_add_new_tile(grid):
+    x,y = get_new_position(grid)
+    grid[x][y] = get_value_new_tile()
+    return grid
+
+def init_game(n):
+    grid = create_grid(n)
+    for i in range(2):
+        grid = grid_add_new_tile(grid)
+    return grid
+
+def grid_to_string_with_size_and_theme(grid, theme,n):
+    m = long_value_with_theme(grid,theme)
+    a = ""
+    for i in range(n):
+        a += (" " + "="*(m+2))*n + "\n"
+        for j in range(n):
+            a += "| {}".format(theme[grid[i][j]]) + " "*(1 + m - len(theme[grid[i][j]]))
+        a += "|\n"
+    a += (" " + "="*(m+2))*n
+    return a
+
+def long_value_with_theme(grid,theme):
+    return max(len(theme[v]) for v in get_all_tiles(grid))
+
+grid=[[16, 4, 8, 2], [2, 4, 2, 128], [4, 512, 32, 64], [1024, 2048, 512, 2]]
+print(grid_to_string_with_size_and_theme(grid,THEMES["1"],4))
diff --git a/tb_test_grid_2048.py b/tb_test_grid_2048.py
new file mode 100644
index 0000000000000000000000000000000000000000..9285a9d46152ad41e77b40cad0b3bb29ec1c6973
--- /dev/null
+++ b/tb_test_grid_2048.py
@@ -0,0 +1,63 @@
+from game2048.tb_grid_2048 import *
+from pytest import *
+
+def test_create_grid():
+    assert create_grid(0) == []
+    assert create_grid(1) == [[' ']]
+    assert create_grid(4) == [[' ',' ',' ', ' '],[' ',' ',' ', ' '],[' ',' ',' ', ' '],[' ',' ',' ', ' ']]
+
+def test_get_value_new_tile():
+    assert get_value_new_tile() == 2 or 4
+
+def test_get_all_tiles():
+    assert get_all_tiles( [[' ',4,8,2], [' ',' ',' ',' '], [' ',512,32,64],[1024,2048,512, ' ']]) == [0,4,8,2,0,0,0,0,0,512,32,64, 1024,2048,512,0]
+    assert get_all_tiles([[16,4,8,2], [2,4,2,128], [4,512,32,64],[1024,2048,512,2]]) == [16, 4, 8, 2, 2, 4, 2, 128, 4, 512, 32, 64, 1024, 2048, 512,2]
+    assert get_all_tiles(create_grid(3))== [0 for i in range(9)]
+
+def test_get_empty_tiles_positions():
+    assert get_empty_tiles_positions([[0, 16, 32, 0], [64, 0, 32, 2], [2, 2, 8, 4],[512, 8, 16, 0]])==[(0,0),(0,3),(1,1),(3,3)]
+    assert get_empty_tiles_positions([[' ', 16, 32, 0], [64, 0, 32, 2], [2, 2, 8,4], [512, 8, 16, 0]])==[(0,0),(0,3),(1,1),(3,3)]
+    assert get_empty_tiles_positions(create_grid(2))==[(0,0),(0,1),(1,0),(1,1)]
+    assert get_empty_tiles_positions([[16,4,8,2], [2,4,2,128], [4,512,32,64],[1024,2048,512,2]])==[]
+
+def test_get_new_position():
+    grid = [[0, 16, 32, 0], [64, 0, 32, 2], [2, 2, 8, 4], [512, 8, 16, 0]]
+    x,y = get_new_position(grid)
+    assert(grid_get_value(grid,x,y)) == 0
+    grid = [[' ',4,8,2], [' ',' ',' ',' '], [' ',512,32,64], [1024,2048,512, ' ']]
+    x,y = get_new_position(grid)
+    assert(grid_get_value(grid,x,y)) == 0
+
+def test_grid_add_new_tile():
+    game_grid = create_grid(4)
+    game_grid = grid_add_new_tile(game_grid)
+    tiles = get_all_tiles(game_grid)
+    assert 2 or 4 in tiles
+
+def test_init_game():
+    grid = init_game(4)
+    tiles = get_all_tiles(grid)
+    assert 2 or 4 in tiles
+    assert len(get_empty_tiles_positions(grid)) == 14
+
+def test_grid_to_string():
+    a =""" === === === ===
+    |   |   |   |   |
+     === === === ===
+    |   |   |   |   |
+     === === === ===
+    |   |   |   |   |
+     === === === ===
+    | 2 |   |   | 2 |
+     === === === ==="""
+    assert grid_to_string_with_size_and_theme([[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [2, ' ', ' ', 2]], THEMES["0"],4) == a
+
+def test_long_value_with_theme():
+    grid =[[2048, 16, 32, 0], [0, 4, 0, 2], [0, 0, 0, 32], [512, 1024, 0, 2]]
+    assert long_value_with_theme(grid,THEMES["0"]) == 4
+    assert long_value_with_theme(grid,THEMES["1"]) == 2
+    assert long_value_with_theme(grid,THEMES["2"]) == 1
+    grid = [[16, 4, 8, 2], [2, 4, 2, 128], [4, 512, 32, 4096], [1024, 2048, 512,2]]
+    assert long_value_with_theme(grid,THEMES["0"]) == 4
+    assert long_value_with_theme(grid,THEMES["1"]) == 2
+    assert long_value_with_theme(grid,THEMES["2"]) == 1