From 408d6a63d9c228714317e56deeae8e96d0b6f491 Mon Sep 17 00:00:00 2001 From: Jamal <fredrick2.enoime@live.uwe.ac.uk> Date: Thu, 13 Mar 2025 15:59:50 +0000 Subject: [PATCH] new structure --- .vscode/c_cpp_properties.json | 18 ++++ .vscode/launch.json | 24 ++++++ .vscode/settings.json | 59 +++++++++++++ 2048 | Bin 33944 -> 38528 bytes 2048.cpp | 62 -------------- Extra.cpp | 0 Extra.hpp | 0 Makefile | 28 +++++++ Tile.cpp | 0 Tile.hpp | 0 UI.cpp | 0 UI.hpp | 0 2048.hpp => include/2048.hpp | 18 ++-- include/Extra.hpp | 9 ++ include/Tile.hpp | 14 ++++ include/UI.hpp | 13 +++ main.cpp | 24 ------ src/2048.cpp | 152 ++++++++++++++++++++++++++++++++++ src/2048.o | Bin 0 -> 49952 bytes src/Extra.cpp | 13 +++ src/Extra.o | Bin 0 -> 1984 bytes src/Tile.cpp | 11 +++ src/Tile.o | Bin 0 -> 1672 bytes src/UI.cpp | 28 +++++++ src/UI.o | Bin 0 -> 3016 bytes src/main.cpp | 26 ++++++ src/main.o | Bin 0 -> 2376 bytes 27 files changed, 405 insertions(+), 94 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json delete mode 100644 2048.cpp delete mode 100644 Extra.cpp delete mode 100644 Extra.hpp create mode 100644 Makefile delete mode 100644 Tile.cpp delete mode 100644 Tile.hpp delete mode 100644 UI.cpp delete mode 100644 UI.hpp rename 2048.hpp => include/2048.hpp (60%) create mode 100644 include/Extra.hpp create mode 100644 include/Tile.hpp create mode 100644 include/UI.hpp delete mode 100644 main.cpp create mode 100644 src/2048.cpp create mode 100644 src/2048.o create mode 100644 src/Extra.cpp create mode 100644 src/Extra.o create mode 100644 src/Tile.cpp create mode 100644 src/Tile.o create mode 100644 src/UI.cpp create mode 100644 src/UI.o create mode 100644 src/main.cpp create mode 100644 src/main.o diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..c2098a2 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "linux-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "linux-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d8762db --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": false, + "cwd": "/home/fredrick2.enoime/2048-clone", + "program": "/home/fredrick2.enoime/2048-clone/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3e5eb95 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file diff --git a/2048 b/2048 index 2822740d6a916791aeea15318772db1a1da7d0d7..012dd31c904f6c63d21b5e01db62b883bef602db 100755 GIT binary patch delta 11687 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 C;j4B4 delta 9790 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 Qla;2KF=bRwj+&+h0BC{oxBvhE diff --git a/2048.cpp b/2048.cpp deleted file mode 100644 index 9d03545..0000000 --- a/2048.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "2048.hpp" -#include <iostream> -#include <cstdlib> -#include <ctime> - -Game2048::Game2048() { - std::srand(std::time(0)); - resetBoard(); -} - -void Game2048::resetBoard() { - for (int i = 0; i < SIZE; ++i) - for (int j = 0; j < SIZE; ++j) - board[i][j] = 0; - spawnTile(); - spawnTile(); -} - -void Game2048::spawnTile() { - std::vector<std::pair<int, int>> emptyTiles; - for (int i = 0; i < SIZE; ++i) - for (int j = 0; j < SIZE; ++j) - if (board[i][j] == 0) - emptyTiles.push_back({i, j}); - - if (!emptyTiles.empty()) { - int idx = std::rand() % emptyTiles.size(); - board[emptyTiles[idx].first][emptyTiles[idx].second] = (std::rand() % 10 == 0) ? 4 : 2; - } -} - -void Game2048::drawBoard() { - clear(); - for (int i = 0; i < SIZE; ++i) { - for (int j = 0; j < SIZE; ++j) { - mvprintw(i * 2, j * 5, "%4d", board[i][j]); - } - } - refresh(); -} - -void Game2048::moveLeft() { - moved = false; - for (int i = 0; i < SIZE; ++i) { - int temp[SIZE] = {0}, index = 0; - for (int j = 0; j < SIZE; ++j) { - if (board[i][j] != 0) { - if (index > 0 && temp[index - 1] == board[i][j]) { - temp[index - 1] *= 2; - moved = true; - } else { - temp[index++] = board[i][j]; - } - } - } - for (int j = 0; j < SIZE; ++j) { - if (board[i][j] != temp[j]) moved = true; - board[i][j] = temp[j]; - } - } - if (moved) spawnTile(); -} diff --git a/Extra.cpp b/Extra.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Extra.hpp b/Extra.hpp deleted file mode 100644 index e69de29..0000000 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..30620e6 --- /dev/null +++ b/Makefile @@ -0,0 +1,28 @@ +# Compiler and flags +CXX = g++ +CXXFLAGS = -std=c++11 -Wall -Wextra -Iinclude +LDFLAGS = -lncurses # Add this for linking ncurses + +# Source files +SRC = src/2048.cpp src/UI.cpp src/Extra.cpp src/Tile.cpp src/main.cpp + +# Object files +OBJ = $(SRC:.cpp=.o) + +# Target executable +TARGET = 2048 + +# Default target +all: $(TARGET) + +# Link object files to create the executable +$(TARGET): $(OBJ) + $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJ) $(LDFLAGS) # <-- Add $(LDFLAGS) here + +# Compile source files into object files +%.o: %.cpp + $(CXX) $(CXXFLAGS) -c $< -o $@ # <-- TAB indentation + +# Clean up build artifacts +clean: + rm -f $(OBJ) $(TARGET) # <-- TAB indentation \ No newline at end of file diff --git a/Tile.cpp b/Tile.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Tile.hpp b/Tile.hpp deleted file mode 100644 index e69de29..0000000 diff --git a/UI.cpp b/UI.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/UI.hpp b/UI.hpp deleted file mode 100644 index e69de29..0000000 diff --git a/2048.hpp b/include/2048.hpp similarity index 60% rename from 2048.hpp rename to include/2048.hpp index d4aeab9..47f983c 100644 --- a/2048.hpp +++ b/include/2048.hpp @@ -1,25 +1,27 @@ -#ifndef GAME_2048_HPP -#define GAME_2048_HPP +#ifndef GAME2048_HPP +#define GAME2048_HPP #include <vector> -#include <ncurses.h> +#define SIZE 4 class Game2048 { private: - static const int SIZE = 4; int board[SIZE][SIZE]; bool moved; + void spawnTile(); + void resetBoard(); + public: Game2048(); - void resetBoard(); - void spawnTile(); void drawBoard(); void moveLeft(); void moveRight(); void moveUp(); void moveDown(); - bool isGameOver(); + bool canMove(); + int getScore(); + const int (*getBoard() const)[SIZE]; // Mark this method as const }; -#endif // GAME_2048_HPP +#endif \ No newline at end of file diff --git a/include/Extra.hpp b/include/Extra.hpp new file mode 100644 index 0000000..539aa83 --- /dev/null +++ b/include/Extra.hpp @@ -0,0 +1,9 @@ +#ifndef EXTRA_HPP +#define EXTRA_HPP + +#include <ncurses.h> + +void initializeGame(); +void cleanupGame(); + +#endif \ No newline at end of file diff --git a/include/Tile.hpp b/include/Tile.hpp new file mode 100644 index 0000000..ecf494e --- /dev/null +++ b/include/Tile.hpp @@ -0,0 +1,14 @@ +#ifndef TILE_HPP +#define TILE_HPP + +class Tile { +private: + int value; + +public: + Tile(); + void setValue(int val); + int getValue() const; +}; + +#endif \ No newline at end of file diff --git a/include/UI.hpp b/include/UI.hpp new file mode 100644 index 0000000..b6d6424 --- /dev/null +++ b/include/UI.hpp @@ -0,0 +1,13 @@ +#ifndef UI_HPP +#define UI_HPP + +#include "2048.hpp" + +class UI { +public: + void drawBoard(const Game2048& game); + void handleInput(Game2048& game); + void showGameOver(); +}; + +#endif \ No newline at end of file diff --git a/main.cpp b/main.cpp deleted file mode 100644 index bc0a5c8..0000000 --- a/main.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "2048.hpp" -#include <ncurses.h> - -int main() { - initscr(); - noecho(); - keypad(stdscr, TRUE); - curs_set(0); - - Game2048 game; - game.drawBoard(); - - int ch; - while ((ch = getch()) != 'q') { - switch (ch) { - case KEY_LEFT: game.moveLeft(); break; - // TODO: Add moveRight(), moveUp(), moveDown() - } - game.drawBoard(); - } - - endwin(); - return 0; -} diff --git a/src/2048.cpp b/src/2048.cpp new file mode 100644 index 0000000..331e64d --- /dev/null +++ b/src/2048.cpp @@ -0,0 +1,152 @@ +#include "2048.hpp" +#include <ncurses.h> +#include <cstdlib> +#include <ctime> +#include <vector> + +Game2048::Game2048() { + std::srand(std::time(0)); + resetBoard(); +} + +void Game2048::resetBoard() { + for (int i = 0; i < SIZE; ++i) + for (int j = 0; j < SIZE; ++j) + board[i][j] = 0; + spawnTile(); + spawnTile(); +} + +void Game2048::spawnTile() { + std::vector<std::pair<int, int>> emptyTiles; + for (int i = 0; i < SIZE; ++i) + for (int j = 0; j < SIZE; ++j) + if (board[i][j] == 0) + emptyTiles.push_back({i, j}); + + if (!emptyTiles.empty()) { + int idx = std::rand() % emptyTiles.size(); + board[emptyTiles[idx].first][emptyTiles[idx].second] = (std::rand() % 10 == 0) ? 4 : 2; + } +} + +void Game2048::drawBoard() { + clear(); + for (int i = 0; i < SIZE; ++i) { + for (int j = 0; j < SIZE; ++j) { + mvprintw(i * 2, j * 5, "%4d", board[i][j]); + } + } + refresh(); +} + +void Game2048::moveLeft() { + moved = false; + for (int i = 0; i < SIZE; ++i) { + int temp[SIZE] = {0}, index = 0; + for (int j = 0; j < SIZE; ++j) { + if (board[i][j] != 0) { + if (index > 0 && temp[index - 1] == board[i][j]) { + temp[index - 1] *= 2; + moved = true; + } else { + temp[index++] = board[i][j]; + } + } + } + for (int j = 0; j < SIZE; ++j) { + if (board[i][j] != temp[j]) moved = true; + board[i][j] = temp[j]; + } + } + if (moved) spawnTile(); +} + +void Game2048::moveRight() { + moved = false; + for (int i = 0; i < SIZE; ++i) { + int temp[SIZE] = {0}, index = SIZE - 1; + for (int j = SIZE - 1; j >= 0; --j) { + if (board[i][j] != 0) { + if (index < SIZE - 1 && temp[index + 1] == board[i][j]) { + temp[index + 1] *= 2; + moved = true; + } else { + temp[index--] = board[i][j]; + } + } + } + for (int j = 0; j < SIZE; ++j) { + if (board[i][j] != temp[j]) moved = true; + board[i][j] = temp[j]; + } + } + if (moved) spawnTile(); +} + +void Game2048::moveUp() { + moved = false; + for (int j = 0; j < SIZE; ++j) { + int temp[SIZE] = {0}, index = 0; + for (int i = 0; i < SIZE; ++i) { + if (board[i][j] != 0) { + if (index > 0 && temp[index - 1] == board[i][j]) { + temp[index - 1] *= 2; + moved = true; + } else { + temp[index++] = board[i][j]; + } + } + } + for (int i = 0; i < SIZE; ++i) { + if (board[i][j] != temp[i]) moved = true; + board[i][j] = temp[i]; + } + } + if (moved) spawnTile(); +} + +void Game2048::moveDown() { + moved = false; + for (int j = 0; j < SIZE; ++j) { + int temp[SIZE] = {0}, index = SIZE - 1; + for (int i = SIZE - 1; i >= 0; --i) { + if (board[i][j] != 0) { + if (index < SIZE - 1 && temp[index + 1] == board[i][j]) { + temp[index + 1] *= 2; + moved = true; + } else { + temp[index--] = board[i][j]; + } + } + } + for (int i = 0; i < SIZE; ++i) { + if (board[i][j] != temp[i]) moved = true; + board[i][j] = temp[i]; + } + } + if (moved) spawnTile(); +} + +bool Game2048::canMove() { + for (int i = 0; i < SIZE; ++i) { + for (int j = 0; j < SIZE; ++j) { + if (board[i][j] == 0) return true; + if (j < SIZE - 1 && board[i][j] == board[i][j + 1]) return true; + if (i < SIZE - 1 && board[i][j] == board[i + 1][j]) return true; + } + } + return false; +} + +int Game2048::getScore() { + int score = 0; + for (int i = 0; i < SIZE; ++i) + for (int j = 0; j < SIZE; ++j) + score += board[i][j]; + return score; +} + +const int (*Game2048::getBoard() const)[SIZE] { + return board; +} \ No newline at end of file diff --git a/src/2048.o b/src/2048.o new file mode 100644 index 0000000000000000000000000000000000000000..c199e0a7f2d9e698883681c10d56548e2bc2d52c GIT binary patch literal 49952 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 Kg==PDU;qH~r*9kp literal 0 HcmV?d00001 diff --git a/src/Extra.cpp b/src/Extra.cpp new file mode 100644 index 0000000..66f1cba --- /dev/null +++ b/src/Extra.cpp @@ -0,0 +1,13 @@ +#include "Extra.hpp" +#include <ncurses.h> + +void initializeGame() { + initscr(); + noecho(); + keypad(stdscr, TRUE); + curs_set(0); +} + +void cleanupGame() { + endwin(); +} \ No newline at end of file diff --git a/src/Extra.o b/src/Extra.o new file mode 100644 index 0000000000000000000000000000000000000000..c65d8bce46bd620e67c5c97fa4d9dd37416bd3a8 GIT binary patch literal 1984 zcmb<-^>JfjWMqH=Mg}_u1P><4z|g>gU^{@B4h*~uJPe=t<$i^FbUu9n5(5(+-K-$? zK9DIMoyWmq`#~aL)`Zx@C|V}O9%gWNcD7Q`2u&)@D=Ag5)HBgD&^0Ut^9<{Z4D<|4 z^o%qi;tUKRX9zGbFo5iE_X}lUVqiD`5@QD0z`(#D0;L(Nf*2Sp1Q?}x*f}OJGBC(6 zKrl$!7(}@83A8ae^Ri{}uya7=Y(U}+3=AOi8DR465P7H+1_kmZ3&Y3%7!nK&49r+V z5+n|DEvhbNu<uaCKs;s!HV}n@nHktI#6SYf3?LtYSg4p89BQay+zbp1LP+iehYbS* zgFGx8P?a;7;t;pRA?|`h+#82@5DxKZs5@cq1IG~q149lD^$e~RB}IvP$pr-r@ll2* znR%HdnTa`>RjKZYxv6Cg@$NqUPL4kD{%&r;t|9Ruj!r(V@eCkU#mPksdHJcy8Tkyw zB`F|Yc4}ooVhTfYX;E=}acT+3Jj3Li)Wp2f0*GO$c`4<Yd60nOgizp^1cmLN{}8~3 zB+kRYzyK2$g^DvVFfi~Ui7P?HL1`PL7p7hZNt_=^JuK~l)C(esD?rtQ%m-m8mjRN8 z89@05jA7x*pjTX(TauW>pjTW{1fervtfJJMM7@&KiV_CBl*E!m2EC->Vg|kB{M_8s zyb=bzy!?_>J$JuQ-QtqO<ZLKEJ+D-+peVl}wWy?$K@V&~YDRooQDSZ?%qbMnApe2# zAbJjg`Og{6bdXwPA!!CknF3P}lM8@m(FsriE(Qj0E`jAN38=UlR2-@tD$2mn3}>M- z(Cr7sC&)~4^&3L%H$b%pZa>I;WGR^aFxm>LA6X5Ey&gnh!7zO=DK7>Fa4CeGwm@<l zKm-E=11Nr=OfUuVE0_T#lA!jZ>%Rb%kATuJ3SECJj`({34NzFPfZ`9N7lc7(!Qv0( zA9TAx@){rs1_p)=P#Tn%L3tZpKS&H}6-XN#-+&rg3>SegpvFNs3=9mQyoyb~04O6v M%Qv`UXjmch0gR@)lK=n! literal 0 HcmV?d00001 diff --git a/src/Tile.cpp b/src/Tile.cpp new file mode 100644 index 0000000..47e1f43 --- /dev/null +++ b/src/Tile.cpp @@ -0,0 +1,11 @@ +#include "Tile.hpp" + +Tile::Tile() : value(0) {} + +void Tile::setValue(int val) { + value = val; +} + +int Tile::getValue() const { + return value; +} \ No newline at end of file diff --git a/src/Tile.o b/src/Tile.o new file mode 100644 index 0000000000000000000000000000000000000000..2a327ba1ea273fc432998dbffe86016cddae3aa5 GIT binary patch literal 1672 zcmb<-^>JfjWMqH=Mg}_u1P><4z|g^rU^{@B4h%dD+zg-j<$i^FbUyXyto`B9?fT<5 zSZ+e>;R(nxouywulHH+SIt9?>z!D6xhZ)?Rovjo!LX%4KN=g+h^-S~(bPY?vJi|I8 z13d#1JtIwsI0FL%3j+g#00RR9D+2?AyI&{+69dBmkQmIFB4BqgFfdjHF)&sLFiP{V zb4*}lV31*eV34#Vh;Zc-Xk&8bWeeb8=YY!DfW#RX7^FcoOg;!99|IC+U|;~-0h9NJ z$U~(tC{UQPFns)vA;G}Fz>GD-LE=o<lru0hz<h}+%?u6=R51{bnSl*NVPIwkb__9) z05dprK`aF3VqjnpLUJcK>=+mr#BqqLK*gn?Mu5YTfq}sSDsBc92Zteu9g>-os+U|) zzz`qhX9D6l8@ZMtIEF|Zi{jLhu*96wRM$+90&lQ#i*%S^8OS&V5W&CzN*7=Z<uX9h zE<zmUz67WOP>6#t%zX@c#g(}wiAfB4#U(`$Is?WkNv$Yh&`U`yNo3GVDlTTwOU}>D zP0cG|(96p&N!4@r3)L+yNlea$^3(H5^$Lpe3sQ?pDjD>OQgagZQZwSyiV|~Ep_WrX zfx;J*#?WIL=3g%~vq64D7E)wj0LLzR%IZQ^gv18fg~Vl0XJB9e<sWkO>p<-{KsJ<t zfdOVeNFG@VW<QKJh3ZFE17dFj5m+!xA56-XfdQNw(8Fa1Q~@kKLAhYR!q^}>7HU7b z{u>}k1_p)-C=H`PVFhD@=m=<;28%C{7zp2h8t4JyFfcH1Lfr||F98(?`3I^LDgvPb zKoX#Q2c<#z7-R;zevlY?+<{E!fEwxx;viwDac~hqa5)C&!WjxsL(}0R5C*z_00)|h A2LJ#7 literal 0 HcmV?d00001 diff --git a/src/UI.cpp b/src/UI.cpp new file mode 100644 index 0000000..b27a33c --- /dev/null +++ b/src/UI.cpp @@ -0,0 +1,28 @@ +#include "UI.hpp" +#include "2048.hpp" +#include <ncurses.h> + +void UI::drawBoard(const Game2048& game) { + clear(); + for (int i = 0; i < SIZE; ++i) { + for (int j = 0; j < SIZE; ++j) { + mvprintw(i * 2, j * 5, "%4d", game.getBoard()[i][j]); // Now this works + } + } + refresh(); +} + +void UI::handleInput(Game2048& game) { + int ch = getch(); + switch (ch) { + case KEY_LEFT: game.moveLeft(); break; + case KEY_RIGHT: game.moveRight(); break; + case KEY_UP: game.moveUp(); break; + case KEY_DOWN: game.moveDown(); break; + } +} + +void UI::showGameOver() { + mvprintw(SIZE * 2, 0, "Game Over! Press any key to exit."); + getch(); +} \ No newline at end of file diff --git a/src/UI.o b/src/UI.o new file mode 100644 index 0000000000000000000000000000000000000000..7f1f66b496bcb640693deb1bacbfcd0cab9b099b GIT binary patch literal 3016 zcmb<-^>JfjWMqH=Mg}_u1P><4z~I4wU^{@B4h(z@ybPcD<$i^FbUyWHexu;gS^L7H zv-H6Wko<AiA0Vo^_6Ku)>~YsW5Y8XwdM}S|*9RV*$HA()Lw|TAU-CHkh{c2PP`B$J zj~U%OP2Hh?Ixif2z|?CZ(Czwz@qkCKC`fnb@f{!vtgqSi598|%&8|NfU(W>#OgMRX z0yejJbhCmq!R+gF{nJ?chn10mp~M!-sE=)|{lfwhk%cnqy&G%)Fo8r&8*BeCgBWtJ z&5@n`S`&pQjl$za=1rJz@-ULS1Ux!xe?a}S59F}@pm0U_3(dI`P96p+0%28?6cFW} zn47BLUzS>=s1Q(;T3oD<m{+Ngom#0-lCO|jky)b0z~JueY^9(PnpB!sQmSC7XQF4I zYgh{A8P*vY=oy&k8EHbq85kH?7#J7?7#J8pq2%rt%D}|HZ~!F646=-Yfk6aHGgbvL zFjfdKO7pODOkiYSkYRvekaRbQaOD$dV{+zYV`}1I=YYuBfW#RX7-oQIxO_icJ_aPt zz`$S&qG9qSU}=yDRt!p;EDRt2W0PdYnsON!m>FQcLDj_!_C2Z?h{p^L4G;@~LD9sB zBo1;1OqQ8}9mYhVnHfO3P=vr7W(H0$jZQE#u%QbvC^IlH2qF0k9M%jB44^y+iZ^r( zVbJ(Q7YBtkHua@A)Yst<Z-ct02WkO0ZW$ODmf}#q28Z}&9O9>Oh(Ez0{tJh=5F;eq zRG<+BPGcZ9hkEKI7ZfnWM+KMo7+Mx&rY5JBXBMZ%C+FuCmlTyImoUUf`5A?JTBZ~w zmOJGq7Nxibd0T+8osofw1w*{MkH3?nPrSdITd-?Le2Alyk83<ba!zVu5lACKrA2yb z2}FAtLvC3?QD$CAIYUuuT2X3o21un*sHdS}Mq*w{PO4{KL1~F=5W<q;l9b})B8Kwx z)RJVdVz`t=Zhl#+Pik6;YZ=H8xVR-qJSa0g16{%lBoSJGrW|aHOMZDCL>%N6qvDMG za*#Jcg^Oz$D5yXfT=GK830?*UhClxyz#1e873V_|Plt*#LCciC5as`iq2i#jg&#?M z3z9e}eZtIN3>62NBZQ=WHB=mAjxdt=CnRxDnFTWkmUTetL4JXW^Fh-ENL&ob92q2W zaU^kbs5r<ypt2IA4`ih`R2;-d_E!*89HbuE{ZUYHka}eID}W4RU;vfBU<~Dg^ErqO zG6#fV`7Qw@h@>8t&KdNID|1T{lNj`hONt<L28>mdnv<wkl3G#1pqG+ZlE|Q!R9wuU zSCkLoB<JVmrskC}=;h^?r0Ti*h3XcUBqnD=`RRG3dId%K1*t_Pl?-}dlTtI{(~1&v zQ=u-Qi~{)|6g221AgG)JnVblc1Tml(6c$h>n39I3MVNZ9AOiz~0@T0^sD5q+25^#q zmCO=Qg=$c7^qOKJR3B6soI)4YVPF84_T=g}gxZhpuN6>>wBR;F7%=xkcnl1dQ2hol z0VsV5svqP&s1TTf3WLJ}B;W+q4`L(Ze=vo}f>_iBF))B@L3H=S5;G`%k&Qrie-_kC zbo~lYfeK{J(6B}p0;NJwo<fiR4rtZv0aXl&e@-O*u=odg6KWMyC4`y*6^ww=JPZsB zATwa@hv^5Ii5~YL6Fz_(#lXOz39<kr0L5rr20;c;I|V9<L|uTozXVAP#6;H*05Q$P AxBvhE literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..2ad697a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,26 @@ +#include "2048.hpp" +#include "UI.hpp" +#include "Extra.hpp" +#include <ncurses.h> + +int main() { + initializeGame(); + + Game2048 game; + UI ui; + + ui.drawBoard(game); + + while (true) { + ui.handleInput(game); + ui.drawBoard(game); + + if (!game.canMove()) { + ui.showGameOver(); + break; + } + } + + cleanupGame(); + return 0; +} \ No newline at end of file diff --git a/src/main.o b/src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..81e031e499cf37f1c37af6a7495a82b1b505cd12 GIT binary patch literal 2376 zcmb<-^>JfjWMqH=Mg}_u1P><4z;J>U!FB*M9T@l+co{zP%l!)V=zQwY{3apAqnkxl zgMop;qto?=;ei(*Wgfk*8$3FXL)oDlJbGQ%dvsnSRS027^9RP310}~H=0MDy05*LG z*t%}tA1NNjJYZ*(u!1E{9%f*0cXqZ?&<IT`%_}KYu+%frGtf0G1@jE+j12S)O!SO2 zA>trY7#J8>7#J7?7#J8p-gfs3Wnf}pH~<o3hRTaTX~wD`2F3~jMrj^)jtPtm3^EK5 z43b_7B3$_d+L)Yq*_h_=uycR}uwzh|voL)8k4=^tYm6{3Ff+hhgQ|-e?0Qr&5RVz` z8xRYDxfmE27?H$5?tsZMGqA&$C^Rzzc8@SKaH6P#ahMs{U`#lz%D})Ngyb)9STQg# zXhFjrt`N!qr8!W1K)G-#1c&-m9O6wl#24Za2c;@(_MXR~{s9hghTO!=JiX+C0*3gg z;1VB0%Yw|*<ka%a;?(%${Ji3lqSE9Nuo{MVcOQQzN1u3qH@9HdkoXWsCm+{%hWIE$ zlgzx#lFY=M%&JuP#N5;}hWIEy3lPi5z{JAY&=o9T6zXZ2Qj}Qkl%H6X;u_=)R{&CN z6zXYcn30&5l9TG0S5R8w8iXPZ=a?ra=K1EArNWIgG%C)>F9+G>UzS<~7B)0Y&Ph$o zD=h$tmNCS~7ndX^XU8XJWXGo^X6C>m2$UZ{Y*60eWnf_V^B)30#RN>84@uk_BnZua z{7B+{NaCRQfSHqsB#x{;7fD<Y$(#lxaUmq}HY9OjB=Px3;-EYavsVEs&cwg~DjT3Y z1_lPb;>z5T#3Tm2;*uf=odIJNrRF5+m84dbFzBTumLxLhB^4Jl=oRHdILZ0Bxv6<2 z40?I_C8>JuexbVH5QXy7^Gfv!it-Cmi%KdP^uQ*iX2hozCFX)sI>LH#Ss?#_@;-V_ z1?4-CnXvo`VuLV9Er^C;X=t3m)WgIRKoQTtz;FX9zzr^M7~my{1XNrNDvn;FJ%!4n zQ|R{VFhI;CSHB_Deo%ZO+Xb^9-9B`_B~-rwvStPbhG$Sd$bC>In1bnt(N0kPU`ZrG z2&Mo@48%ki4q{*cm)7X+mw+k+#V<%745OFeSy21Y^;<yoTfj6zX>|RdR0xV{^!T>` zRiF$E46t|x#XqQ)fa!;cgRDWf8)Q`hNP>ZZ;RlrFVPIeYnSrh!WF~stgY;)W1wVo~ cNEm7yTm)1`K$XJ9K#TyW`%6F^B#f>f0GQA!?f?J) literal 0 HcmV?d00001 -- GitLab