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