diff --git a/game.cpp b/game.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..84a727c2f68d5472130238f604543bed48cbd5b9
--- /dev/null
+++ b/game.cpp
@@ -0,0 +1,200 @@
+#include "game2048.hpp"
+#include <iostream>  
+
+Game2048::Game2048() { // Start my game
+    score = 0; // Points start at 0
+    for (int r = 0; r < 4; r++) { 
+        for (int c = 0; c < 4; c++) { 
+            board[r][c] = 0; 
+        }
+    }
+    board[0][0] = 2; // Put a 2 in top left
+    board[0][1] = 2; // Put another 2 next to it
+}
+
+void Game2048::show() { // Show my tiles in boxes
+    for (int r = 0; r < 4; r++) { // Look at each row
+        std::cout << "+---+---+---+---+"; // Draw top of boxes
+        std::cout << "\n"; // Go to new line
+        for (int c = 0; c < 4; c++) { 
+            std::cout << "| "; // Start a box
+            if (board[r][c] == 0) { 
+                std::cout << " "; // Just a space
+            } else { 
+                std::cout << board[r][c]; // Show the number
+            }
+            std::cout << " "; 
+        }
+        std::cout << "|"; 
+        std::cout << "\n"; // Go to new line
+    }
+    std::cout << "+---+---+---+---+"; 
+    std::cout << "\n"; // Go to new line
+    std::cout << "Points: " << score << "\n"; // Show my points
+    std::cout << "\n"; // Extra space
+}
+
+void Game2048::addTile() { // Add a new number
+    for (int r = 0; r < 4; r++) { // Check all rows
+        for (int c = 0; c < 4; c++) { // Check all spots
+            if (board[r][c] == 0) { // If it’s empty
+                if (r < 2) { // Top rows get 2
+                    board[r][c] = 2; // Put a 2
+                } else { // Bottom rows get 4
+                    board[r][c] = 4; // Put a 4
+                }
+                return; // Stop after one
+            }
+        }
+    }
+}
+
+bool Game2048::canMove() { // Can I slide tiles?
+    for (int r = 0; r < 4; r++) { // Check every row
+        for (int c = 0; c < 4; c++) { // Check every spot
+            if (board[r][c] == 0) { // Empty spot?
+                return true; // Yes, I can move
+            }
+            if (c < 3) { // Not at end of row
+                if (board[r][c] == board[r][c + 1]) { // Same numbers next to each other
+                    return true; // I can squish them
+                }
+            }
+            if (r < 3) { // Not at bottom
+                if (board[r][c] == board[r + 1][c]) { // Same numbers up and down
+                    return true; // I can squish these
+                }
+            }
+        }
+    }
+    return false; // No sliding possible
+}
+
+void Game2048::moveLeft() { // Slide tiles left
+    for (int r = 0; r < 4; r++) { // Do every row
+        for (int c = 0; c < 3; c++) { // Look at spots 0 to 2
+            if (board[r][c] == 0) { // If spot is empty
+                board[r][c] = board[r][c + 1]; // Move next number here
+                board[r][c + 1] = 0; // Empty the next spot
+            }
+        }
+        for (int c = 0; c < 3; c++) { // Squish same numbers
+            if (board[r][c] != 0 && board[r][c] == board[r][c + 1]) { // If they’re the same
+                board[r][c] = board[r][c] * 2; // Make it bigger
+                score = score + board[r][c]; // Add points
+                board[r][c + 1] = 0; // Empty the next one
+            }
+        }
+        for (int c = 0; c < 3; c++) { // Slide again to fill gaps
+            if (board[r][c] == 0) { // If spot is empty
+                board[r][c] = board[r][c + 1]; // Move next number here
+                board[r][c + 1] = 0; // Empty the next spot
+            }
+        }
+    }
+    if (canMove()) addTile(); // Add a number if I can slide
+}
+
+void Game2048::moveRight() { // Slide tiles right
+    for (int r = 0; r < 4; r++) { // Do every row
+        for (int c = 3; c > 0; c--) { // Look at spots 3 to 1
+            if (board[r][c] == 0) { // If spot is empty
+                board[r][c] = board[r][c - 1]; // Move left number here
+                board[r][c - 1] = 0; // Empty the left spot
+            }
+        }
+        for (int c = 3; c > 0; c--) { // Squish same numbers
+            if (board[r][c] != 0 && board[r][c] == board[r][c - 1]) { // If they’re the same
+                board[r][c] = board[r][c] * 2; // Make it bigger
+                score = score + board[r][c]; // Add points
+                board[r][c - 1] = 0; // Empty the left one
+            }
+        }
+        for (int c = 3; c > 0; c--) { // Slide again to fill gaps
+            if (board[r][c] == 0) { // If spot is empty
+                board[r][c] = board[r][c - 1]; // Move left number here
+                board[r][c - 1] = 0; // Empty the left spot
+            }
+        }
+    }
+    if (canMove()) addTile(); // Add a number if I can slide
+}
+
+void Game2048::moveUp() { // Slide tiles up
+    for (int c = 0; c < 4; c++) { // Do every column
+        for (int r = 0; r < 3; r++) { // Look at rows 0 to 2
+            if (board[r][c] == 0) { // If spot is empty
+                board[r][c] = board[r + 1][c]; // Move down number up
+                board[r + 1][c] = 0; // Empty the down spot
+            }
+        }
+        for (int r = 0; r < 3; r++) { // Squish same numbers
+            if (board[r][c] != 0 && board[r][c] == board[r + 1][c]) { // If they’re the same
+                board[r][c] = board[r][c] * 2; // Make it bigger
+                score = score + board[r][c]; // Add points
+                board[r + 1][c] = 0; // Empty the next one
+            }
+        }
+        for (int r = 0; r < 3; r++) { // Slide again to fill gaps
+            if (board[r][c] == 0) { // If spot is empty
+                board[r][c] = board[r + 1][c]; // Move down number up
+                board[r + 1][c] = 0; // Empty the down spot
+            }
+        }
+    }
+    if (canMove()) addTile(); // Add a number if I can slide
+}
+
+void Game2048::moveDown() { // Slide tiles down
+    for (int c = 0; c < 4; c++) { // Do every column
+        for (int r = 3; r > 0; r--) { // Look at rows 3 to 1
+            if (board[r][c] == 0) { // If spot is empty
+                board[r][c] = board[r - 1][c]; // Move up number down
+                board[r - 1][c] = 0; // Empty the up spot
+            }
+        }
+        for (int r = 3; r > 0; r--) { // Squish same numbers
+            if (board[r][c] != 0 && board[r][c] == board[r - 1][c]) { 
+                board[r][c] = board[r][c] * 2; 
+                score = score + board[r][c]; 
+                board[r - 1][c] = 0; 
+            }
+        }
+        for (int r = 3; r > 0; r--) { 
+            if (board[r][c] == 0) { 
+                board[r][c] = board[r - 1][c]; // Move up number down
+                board[r - 1][c] = 0; 
+            }
+        }
+    }
+    if (canMove()) addTile(); // Add a number if I can slide
+}
+
+void Game2048::play() { // Play my game
+    while (true) { 
+        show(); // Show my tiles
+        char key; // What I press
+        std::cin >> key; // Get my letter
+        if (key == 'Q') { // If I press Q
+            std::cout << "Game Over! Points: " << score << "\n"; // Go to new line
+            break; // Stop playing
+        }
+        if (key == 'A') { // If I press A
+            moveLeft(); // Slide left
+        }
+        if (key == 'D') { // If I press D
+            moveRight(); // Slide right
+        }
+        if (key == 'W') { // If I press W
+            moveUp(); // Slide up
+        }
+        if (key == 'S') { // If I press S
+            moveDown(); // Slide down
+        }
+        if (!canMove()) { // If I can’t slide anymore
+            show(); // Show last tiles
+            std::cout << "Game Over! Points: " << score << "\n"; // Go to new line
+            break; // Stop playing
+        }
+    }
+}
\ No newline at end of file
diff --git a/game2048 b/game2048
new file mode 100755
index 0000000000000000000000000000000000000000..0f8b8fbf112e3ac61adfe3a69400f9f15532e98d
Binary files /dev/null and b/game2048 differ
diff --git a/game2048.hpp b/game2048.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..e4bb3985c6db70411a87a4d4f968ea355428e699
--- /dev/null
+++ b/game2048.hpp
@@ -0,0 +1,21 @@
+#ifndef GAME2048_HPP
+#define GAME2048_HPP
+
+class Game2048 { // My game class
+private:
+    int board[4][4]; // Board for tiles
+    int score;       // My score
+
+public:
+    Game2048();       // Start game
+    void show();      // Show board
+    void addTile();   // Add new tile
+    bool canMove();   // Check if I can move
+    void moveLeft();  // Move left
+    void moveRight(); // Move right
+    void moveUp();    // Move up
+    void moveDown();  // Move down
+    void play();      // Play game
+};
+
+#endif
\ No newline at end of file
diff --git a/game_logic.hpp b/game_logic.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..73aec54828691b68b157b5c1665f012b9b823fe6
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,7 @@
+#include "game2048.hpp"
+
+int main() { // Start here
+    Game2048 game; // Make game
+    game.play(); // Play it
+    return 0; // Done
+}
\ No newline at end of file