diff --git a/tictactoe.py b/tictactoe.py
index 4b849cf4c5a946b4a5f0965fe86c9b21c95a5348..ea276da708cebc0b8d68e8a922b6ba9eed0ee7d7 100644
--- a/tictactoe.py
+++ b/tictactoe.py
@@ -1,6 +1,58 @@
+from enum import Enum
+
+class Player(Enum):
+    one = 1
+    two = 2
+    undefined = 3
+
 class TicTacToe():
     def __init__(self) -> None:
-        pass
+        self.grid = []
+        for i in range(3):
+            self.grid.append([Player.undefined, Player.undefined, Player.undefined])
+
+    def add(self, row:int, col:int, player:Player|int) -> bool:
+        """ Change the value of a undefined field.
+        The player can be passed as Player Object or plain Int.
+        Returns True, if executed correctly.
+        Returns False, if the field is already occupied 
+        or the player number is invalid.
+        """
+        if isinstance(player, int):
+            try: player = Player(player)
+            except ValueError: return False  # invalid player number
+
+        if self.check_field(row, col):
+            self.grid[row][col] = player
+            return True
+        return False
+
+    def check_field(self, row:int, col:int) -> bool:
+        """Checks, if a field is occupied"""
+        if self.grid[row][col] != Player.undefined:
+            return False
+        return True
+    
+    def print_grid(self) -> None:
+        symbols = {
+            Player.one: "X",
+            Player.two: "O",
+            Player.undefined: " "
+        }
+        
+        print("┌───┬───┬───┐")
+        for i, row in enumerate(self.grid):
+            print("│", end="")
+            for field in row:
+                print(f" {symbols[field]} │", end="")
+            if i < len(self.grid) - 1:
+                print("\n├───┼───┼───┤")
+        print("\n└───┴───┴───┘\n")
+
 
-    def calc_best_move(self) -> None:
-        pass
+if __name__ == "__main__":
+    ttt = TicTacToe()
+    ttt.add(1, 1, 1)
+    ttt.print_grid()
+    ttt.add(1, 2, Player.two)
+    ttt.print_grid()