YorKnEz

C++ 2048 Console

Jun 2nd, 2021 (edited)
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.96 KB | None | 0 0
  1. /*
  2.     Copyright 2021 Alex Mitreanu
  3. */
  4.  
  5. #include <iostream>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #include <conio.h> // getch()
  9.  
  10. #include <windows.h> // colors display
  11. #include <map> // colors map
  12.  
  13. using namespace std;
  14.  
  15. bool running = true;
  16. // initialize board
  17. int board[4][4];
  18. map<int, int> colors;
  19.  
  20. void showBoard() {
  21.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  22.  
  23.     cout << "|-------------------|\n";
  24.     cout << "|     2048 Game     |\n";
  25.  
  26.     for (int i = 0; i < 4; i++) {
  27.         cout << "|";
  28.         for (int j = 0; j < 4; j++) {
  29.             SetConsoleTextAttribute(hConsole, colors[board[i][j]]);
  30.             if (board[i][j] < 10) cout << "000" << board[i][j];
  31.             else if (board[i][j] >= 10 && board[i][j] < 100) cout << "00" << board[i][j];
  32.             else if (board[i][j] >= 100 && board[i][j] < 1000) cout << "0" << board[i][j];
  33.             else if (board[i][j] > 1000) cout << board[i][j];
  34.             SetConsoleTextAttribute(hConsole, 7);
  35.             cout << "|";
  36.         }
  37.         cout << "\n|                   |\n";
  38.     }
  39.     cout << "|-------------------|\n";
  40. }
  41.  
  42. int boardZeroes() {
  43.     int zeroes = 0;
  44.     for (int i = 0; i < 4; i++) {
  45.         for (int j = 0; j < 4; j++) {
  46.             if (!board[i][j]) zeroes++;
  47.         }
  48.     }
  49.     return zeroes;
  50. }
  51.  
  52. bool find2048() {
  53.     for (int i = 0; i < 4; i++) {
  54.         for (int j = 0; j < 4; j++) {
  55.             if (board[i][j] == 2048) return true;
  56.         }
  57.     }
  58.     return false;
  59. }
  60.  
  61. void generateNumber() {
  62.     srand(time(NULL));
  63.  
  64.     int zeroes = boardZeroes();
  65.     int line = rand() % 4;
  66.     int column = rand() % 4;
  67.     int number = rand() % 2;
  68.  
  69.     while (board[line][column] && zeroes > 0) {
  70.         line = rand() % 4;
  71.         column = rand() % 4;
  72.     }
  73.  
  74.     if (zeroes > 0) board[line][column] = number ? 4 : 2;
  75. }
  76.  
  77. bool hasValidMoves() {
  78.     if (boardZeroes()) return true;
  79.  
  80.     int dl[] = { -1, 0, 1, 0 },
  81.         dc[] = { 0, 1, 0, -1 };
  82.  
  83.     for (int i = 0; i < 4; i++) {
  84.         for (int j = 0; j < 4; j++) {
  85.             for (int k = 0; k < 4; k++) {
  86.                 if ((i + dl[k] >= 0 && i + dl[k] < 4) &&
  87.                     (j + dc[k] >= 0 && j + dc[k] < 4) &&
  88.                     board[i + dl[k]][j + dc[k]] == board[i][j]
  89.                 ) return true;
  90.             }
  91.         }
  92.     }
  93.  
  94.     return false;
  95. }
  96.  
  97. void applyDirection() {
  98.     bool validMove = false;
  99.     char d = getch();
  100.     cout << d << endl;
  101.  
  102.     switch (d) {
  103.     case 'w':
  104.         for (int i = 1; i < 4; i++) {
  105.             for (int j = 0; j < 4; j++) {
  106.                 if (board[i][j]) {
  107.                     int k = 0;
  108.                     while (!board[i-k-1][j] && i-k-1 > 0) {
  109.                         k++;
  110.                     }
  111.                     if (board[i-k-1][j] == board[i][j]) {
  112.                         board[i-k-1][j] += board[i][j];
  113.                         board[i][j] = 0;
  114.                         validMove = true;
  115.                     } else if (board[i-k-1][j] != board[i][j] && board[i-k-1][j]) {
  116.                         board[i-k][j] = board[i][j];
  117.                         if (i-k != i) {
  118.                             board[i][j] = 0;
  119.                             validMove = true;
  120.                         }
  121.                     } else if (board[i-k-1][j] != board[i][j] && !board[i-k-1][j]) {
  122.                         board[i-k-1][j] += board[i][j];
  123.                         board[i][j] = 0;
  124.                         validMove = true;
  125.                     }
  126.                 }
  127.             }
  128.         }
  129.         break;
  130.     case 'a':
  131.         for (int i = 0; i < 4; i++) {
  132.             for (int j = 1; j < 4; j++) {
  133.                 if (board[i][j]) {
  134.                     int k = 0;
  135.                     while (!board[i][j-k-1] && j-k-1 > 0) {
  136.                         k++;
  137.                     }
  138.                     if (board[i][j-k-1] == board[i][j]) {
  139.                         board[i][j-k-1] += board[i][j];
  140.                         board[i][j] = 0;
  141.                         validMove = true;
  142.                     } else if (board[i][j-k-1] != board[i][j] && board[i][j-k-1]) {
  143.                         board[i][j-k] = board[i][j];
  144.                         if (j-k != j) {
  145.                             board[i][j] = 0;
  146.                             validMove = true;
  147.                         }
  148.                     } else if (board[i][j-k-1] != board[i][j] && !board[i][j-k-1]) {
  149.                         board[i][j-k-1] += board[i][j];
  150.                         board[i][j] = 0;
  151.                         validMove = true;
  152.                     }
  153.                 }
  154.             }
  155.         }
  156.         break;
  157.     case 's':
  158.         for (int i = 2; i >= 0; i--) {
  159.             for (int j = 0; j < 4; j++) {
  160.                 if (board[i][j]) {
  161.                     int k = 0;
  162.                     while (!board[i+k+1][j] && i+k+1 < 3) {
  163.                         k++;
  164.                     }
  165.                     if (board[i+k+1][j] == board[i][j]) {
  166.                         board[i+k+1][j] += board[i][j];
  167.                         board[i][j] = 0;
  168.                         validMove = true;
  169.                     } else if (board[i+k+1][j] != board[i][j] && board[i+k+1][j]) {
  170.                         board[i+k][j] = board[i][j];
  171.                         if (i+k != i) {
  172.                             board[i][j] = 0;
  173.                             validMove = true;
  174.                         }
  175.                     } else if (board[i+k+1][j] != board[i][j] && !board[i+k+1][j]) {
  176.                         board[i+k+1][j] += board[i][j];
  177.                         board[i][j] = 0;
  178.                         validMove = true;
  179.                     }
  180.                 }
  181.             }
  182.         }
  183.         break;
  184.     case 'd':
  185.         for (int i = 0; i < 4; i++) {
  186.             for (int j = 2; j >= 0; j--) {
  187.                 if (board[i][j]) {
  188.                     int k = 0;
  189.                     while (!board[i][j+k+1] && j+k+1 < 3) {
  190.                         k++;
  191.                     }
  192.                     if (board[i][j+k+1] == board[i][j]) {
  193.                         board[i][j+k+1] += board[i][j];
  194.                         board[i][j] = 0;
  195.                         validMove = true;
  196.                     } else if (board[i][j+k+1] != board[i][j] && board[i][j+k+1]) {
  197.                         board[i][j+k] = board[i][j];
  198.                         if (j+k != j) {
  199.                             board[i][j] = 0;
  200.                             validMove = true;
  201.                         }
  202.                     } else if (board[i][j+k+1] != board[i][j] && !board[i][j+k+1]) {
  203.                         board[i][j+k+1] += board[i][j];
  204.                         board[i][j] = 0;
  205.                         validMove = true;
  206.                     }
  207.                 }
  208.             }
  209.         }
  210.         break;
  211.     default:
  212.         cout << "Cunt. >:(\n";
  213.         break;
  214.     }
  215.  
  216.     if (running && !validMove && boardZeroes()) applyDirection();
  217. }
  218.  
  219. void initGame () {
  220.     // initialize colors
  221.     int k = 2;
  222.     colors.insert(pair<int, int>(0, 15));
  223.     for (int i = 2; i <= 2048; i*=2) {
  224.         colors.insert(pair<int, int>(i, k++));
  225.     }
  226.  
  227.     // start screen
  228.     cout << "Buna ziua, acesta este un joc 2048 facut in consola. Controalele sunt w, a, s, d. Nu incercati sa introduceti alte litere sau sa introduceti WASD pentru ca programul va crapa. Multumesc de intelegere!\n";
  229.  
  230.     char start;
  231.     cout << "\nApasati X pentru a incepe.\n"; cin >> start;
  232.     while (start != 'X') {
  233.         cout << "\nAm zis X.\n";
  234.         cin >> start;
  235.     }
  236. }
  237.  
  238. int main() {
  239.  
  240.     initGame();
  241.  
  242.     while (running) {
  243.         system("CLS");
  244.  
  245.         generateNumber();
  246.  
  247.         showBoard();
  248.  
  249.         if (find2048()) {
  250.             cout << "Ati castigat. :^O\n";
  251.             running = false;
  252.             break;
  253.         }
  254.  
  255.         if (!hasValidMoves()) {
  256.             cout << "Ati pierdut. Haha :^)\n";
  257.             running = false;
  258.             break;
  259.         }
  260.  
  261.         cout << "Your move: ";
  262.         applyDirection();
  263.     }
  264.  
  265.     return 0;
  266. }
  267.  
Add Comment
Please, Sign In to add comment