diff --git a/game2048/.pytest_cache/v/cache/lastfailed b/game2048/.pytest_cache/v/cache/lastfailed
new file mode 100644
index 0000000000000000000000000000000000000000..fb70bde4277eaa17628608635b927c8cb60e9341
--- /dev/null
+++ b/game2048/.pytest_cache/v/cache/lastfailed
@@ -0,0 +1,3 @@
+{
+  "test_grid_2048.py::test_grid_to_string": true
+}
\ No newline at end of file
diff --git a/game2048/.pytest_cache/v/cache/nodeids b/game2048/.pytest_cache/v/cache/nodeids
new file mode 100644
index 0000000000000000000000000000000000000000..6bde46819f23c298ce23edcb95769827fb6178bf
--- /dev/null
+++ b/game2048/.pytest_cache/v/cache/nodeids
@@ -0,0 +1,3 @@
+[
+  "test_grid_2048.py::test_long_value_with_theme"
+]
\ No newline at end of file
diff --git a/__init__.py b/game2048/__init__.py
similarity index 100%
rename from __init__.py
rename to game2048/__init__.py
diff --git a/tb_grid_2048.py b/game2048/tb_grid_2048.py
similarity index 100%
rename from tb_grid_2048.py
rename to game2048/tb_grid_2048.py
diff --git a/tb_test_grid_2048.py b/game2048/tb_test_grid_2048.py
similarity index 100%
rename from tb_test_grid_2048.py
rename to game2048/tb_test_grid_2048.py
diff --git a/gg_grid_2048.py b/gg_grid_2048.py
deleted file mode 100644
index 18cbafc78c7374a0b8ac3be46177fadc00b4652b..0000000000000000000000000000000000000000
--- a/gg_grid_2048.py
+++ /dev/null
@@ -1,123 +0,0 @@
-import random as rd
-
-#FONCTIONNALITE 1
-
-def create_grid(taille):
-    #la taille doit etre supérieure à 1
-    grille = []
-    ligne =[]
-    for case in range(taille):
-        ligne.append(' ') #on crée une ligne contenant le bon nombre de cases
-    for nb_ligne in range (taille):
-        grille.append(ligne.copy()) #permet de découpler les lignes
-    return grille
-
-def add_new_tile(grid):
-    #la position indiqué doit etre cohérente avec les dimensions de la grille considérée
-    value=choose_value_new_tile()
-    (x,y)=get_new_position(grid)
-    grid[x][y]=value
-    #attention, la fonction modifie la liste passée en argument !
-    return(grid)
-
-
-def choose_value_new_tile():
-    #choisi la valeur de la nouvelle case avec la probabilté indiquée dans l'énoncé
-    value=rd.choice([2,2,2,2,2,2,2,2,2,4])
-    return(value)
-
-def get_all_tiles (grid):
-    nb_ligne=len(grid)
-    nb_colonne=len(grid[0]) #on suppose que la grille a au moins une ligne
-    tiles=[]
-    for ligne in range (nb_ligne):
-        for colonne in range (nb_colonne):
-            tile = grid[ligne][colonne]
-            if tile == ' ':
-                tiles.append(0)
-            else :
-                tiles.append(tile)
-    return(tiles)
-
-def get_empty_tile_position(grid):
-    position_empty=[]
-    for ligne in range (len(grid)):
-        for colonne in range (len(grid[0])):
-            if grid[ligne][colonne]==0 or grid[ligne][colonne]==' ' :
-                position_empty.append((ligne,colonne))
-    return(position_empty)
-
-def get_new_position (grid):
-    #choisi une postion au hasard parmis les position libre
-    position_empty=get_empty_tile_position(grid)
-    (x,y)=rd.choice(position_empty)
-    return((x,y))
-
-def grid_get_value(grid,x,y):
-    if grid[x][y] == ' ':
-        return (0)
-    else :
-        return(grid[x][y])
-
-def init_game(taille):
-    new_grid=create_grid(taille)
-    (x1,y1)=get_new_position(new_grid) #choisi la première tuile qui va être un 2 ou un 4
-    new_grid[x1][y1]=choose_value_new_tile()
-    (x2,y2)=get_new_position(new_grid) #choisi la deuxièeme tuile
-    new_grid[x2][y2]=choose_value_new_tile()
-    return(new_grid)
-
-
-#FONCTIONNALITE 2
-
-def grid_to_string(grid):
-    #je chosis de ne pas prendre l'argument "n" car cette information est déjà contenue dans la grid et elle me semble redondante
-    #on suppose que la grille est carrée
-
-    affichage=" "+"=== "*len(grid)+"\n"
-    #crée la délimation du dessus
-
-    for ligne in range (len(grid)):
-
-        for colonne in range (len(grid[0])):
-            #on suppose que la grille a au moins une ligne et qu'elles ont toutes la même taille
-            affichage=affichage+"| "+str(grid[ligne][colonne])+" "
-            #crée l'affichage de l'interieure des tuiles et de leur séparation
-
-        affichage=affichage+"|\n" #fini la ligne
-        affichage=affichage+" "+"=== "*len(grid)+"\n"#
-
-    return (affichage)
-
-
-
-def long_value (grid):
-    all_tiles=get_all_tiles(grid)
-    str_all_tiles=[] #création d'une liste de chaine de caractére prenant la valeur des tuiles
-    long_str_tiles=[] #liste contenant les longueurs des tuiles
-    for tile in range (len (all_tiles)):
-        str_all_tiles.append(str(all_tiles[tile]))
-    for string_tile in range (len(str_all_tiles)):
-        long_str_tiles.append(len(str_all_tiles[string_tile]))
-    return (max(long_str_tiles))
-
-def grid_to_string_with_size(grid):
-    longest=long_value(grid)
-
-    nb_espace=longest+2 #donne le nombre d'espace necessaire dansla grille
-    espaces = "="*nb_espace
-    espaces=espaces+" "
-
-    affichage=" "+espaces*len(grid)+"\n"
-    #crée la délimation du dessus
-
-    for ligne in range (len(grid)):
-
-        for colonne in range (len(grid[0])):
-            #on suppose que la grille a au moins une ligne et qu'elles ont toutes la même taille
-            nb_espace_manquant=longest-len(str(grid[ligne][colonne]))-1
-            affichage=affichage+"| "+str(grid[ligne][colonne])+" "*nb_espace_manquant
-
-        affichage=affichage+"|\n" #fini la ligne
-        affichage=" "+espaces*len(grid)+"\n"
-    return(affichage)
diff --git a/gg_test_grid_2048.py b/gg_test_grid_2048.py
deleted file mode 100644
index de5f54a51f077abe71c0b6364adfaa0f3a969144..0000000000000000000000000000000000000000
--- a/gg_test_grid_2048.py
+++ /dev/null
@@ -1,70 +0,0 @@
-from game2048.gg_grid_2048 import *
-from pytest import *
-
-def test_create_grid():
-    assert create_grid(4)==[[' ',' ',' ',' '],[' ',' ',' ',' '],[' ',' ',' ',' '],[' ',' ',' ',' ']]
-    assert create_grid(5)==[[' ',' ',' ',' ',' '],[' ',' ',' ',' ',' '],[' ',' ',' ',' ',' '],[' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ']]
-    assert create_grid(1)==[[' ']]
-    assert create_grid(2)==[[' ',' '],[' ',' ']]
-
-"""def test_add_new_tile_at_position():
-    game_grid=create_grid(4)
-    assert add_new_tile(game_grid, 1, 1, 2) == [[' ', ' ', ' ', ' '], [' ', 2 , ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ']]
-    game_grid=create_grid(4)
-    assert add_new_tile(game_grid, 2, 1, 4) == [[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', 4, ' ', ' '], [' ', ' ', ' ', ' ']]
-    game_grid=create_grid(4)
-    assert add_new_tile(game_grid, 3, 0, 2) == [[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [2, ' ', ' ', ' ']]
-    game_grid=create_grid(4)
-    value=choose_value_new_tile()
-    game_grid=add_new_tile(game_grid, 1, 1, value)
-    tiles=get_all_tiles(game_grid)
-    assert 2 or 4 in tiles """
-
-
-def test_choose_value_new_tile():
-    assert choose_value_new_tile()== 2 or 4
-
-def test_get_all_tiles():
-    assert get_all_tiles([[' ',4,4,6],[' ',' ',' ',8],[32,32,' ',64],[1024,' ',' ',512]])==[0,4,4,6,0,0,0,8,32,32,0,64,1024,0,0,512]
-    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]
-
-def test_get_empty_tile_position():
-    assert get_empty_tile_position([[0,0,16,32],[64,8,0,6],[64,0,4,8],[512,4,4,6]])==[(0,0),(0,1),(1,2),(2,1)]
-    assert get_empty_tile_position([[16,4,8,2], [2,4,2,128], [4,512,32,64],[1024,2048,512,2]])==[]
-    assert get_empty_tile_position([[' ', 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_tile_position(create_grid(2))==[(0,0),(0,1),(1,0),(1,1)]
-
-
-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_add_new_tile():
-    game_grid=create_grid(4)
-    game_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_tile_position(grid)) == 14
-
-def test_grid_to_string():
-    a ="""
- === === === ===
-|   |   |   |   |
- === === === ===
-|   |   |   |   |
- === === === ===
-|   |   |   |   |
- === === === ===
-| 2 |   |   | 2 |
- === === === ===
-"""
-    grid_to_string([[' ', ' ', ' ', ' '], [' ', ' ', ' ', ' '], [' ', ' ', ' ', ''], [2, ' ', ' ', 2]])==a
diff --git a/textual2048/__init__.py b/textual2048/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391