Advertisement
Guest User

2048

a guest
Feb 9th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.26 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. //#include "game/engine.h"
  6. //#include "game/engine.cpp"
  7.  
  8. class World{
  9. public:
  10.         //bool bTols[5]; //Tols
  11.         /*
  12.             bTols[0]:
  13.                 0 - Мир пустой/играбелен
  14.                 1 - Мир переполнен/неиграбелен
  15.             bTols[1]
  16.  
  17.         */
  18.  
  19.  
  20.     char sPlayerName[10];
  21.  
  22.     int nScore; // Очки за игру
  23.     int nWorldCopy[4][4]; // Копия мира, для проверки на изменение
  24.     int nWorld[4][4]; //World
  25.     // Начальные
  26.     void SetWorldToZero();
  27.     void SetPlayerName();
  28.  
  29.     //Основные
  30.     void Display(bool type); //Вывод в консоль
  31.     void SpawnNumber(bool nMove[4]); //Спавнит числа с зависимостью от предыдущего действия
  32.     void PlayerCommander(); //Принимает команды на движение
  33.     bool WorldChecker(); //Проверяет мир на возможность хода: если return - 0 то мир играбелен, иначе не играбелен
  34.     void RecursionFN(); //Рекурсивная функция для повторного вызова функции PlayerCommander()
  35.  
  36.     //Управление
  37.     bool MoveUP();
  38.     bool MoveDown();
  39.     bool MoveLeft();
  40.     bool MoveRight();
  41.  
  42.  
  43. };
  44.  
  45. int main(){
  46.     World gm;
  47.    
  48.     gm.SetPlayerName(); //Ввод ника игрока
  49.     int nGames = 0;
  50.     for(;;nGames++){
  51.         gm.nScore = 0;
  52.         std::cout << "----------------------------\nGame: " << nGames << "\n";
  53.         /*
  54.             Цикл всей игры
  55.         */
  56.         gm.SetWorldToZero(); //Установка всему массиву значение 0
  57.         gm.Display(1); //Вывод ника игрока
  58.         bool st[4] = {0,0,0,0}; //Вызов первоначального спавна
  59.         gm.SpawnNumber(st); //Спавн произвольных чисел
  60.            
  61.             for (;;){
  62.                 /*
  63.                     Цикл "вложенной" игры
  64.                 */
  65.                 gm.Display(0); //Вывод массива в консоль
  66.  
  67.                     if (gm.WorldChecker() != 0){
  68.                         std::cout << "\t\t----Game Over!----\n\tScore: " << gm.nScore;
  69.                         break;
  70.                     }
  71.  
  72.                 gm.PlayerCommander(); //Просит ввести команду
  73.             }
  74.     }
  75. }
  76.  
  77. void World::PlayerCommander(){
  78.     char command;
  79.     std::cout << " (h, w,a,s,d) " << sPlayerName << " :>> ";
  80.    
  81.     bool statusW = 1;
  82.  
  83.     for (;statusW == 1;){
  84.         std::cin >> command;
  85.         switch (command){
  86.             //UP
  87.             case 'w':
  88.                 if (MoveUP() == 0){
  89.                     bool st[4] = {0,0,0,1};
  90.                     SpawnNumber(st);
  91.                     statusW = 0;
  92.                 } else {
  93.                     std::cout << "--- NO! ---";
  94.                 }
  95.             break;
  96.             case 'W':
  97.                 if (MoveUP() == 0){
  98.                     bool st[4] = {0,0,0,1};
  99.                     SpawnNumber(st);
  100.                     statusW = 0;
  101.                 } else {
  102.                     std::cout << "--- NO! ---";
  103.                 }
  104.             break;
  105.  
  106.             //Down
  107.             case 's':
  108.  
  109.             break;
  110.             case 'S':
  111.  
  112.             break;
  113.  
  114.             //Left
  115.             case 'a':
  116.  
  117.             break;
  118.             case 'A':
  119.  
  120.             break;
  121.  
  122.             //Right
  123.             case 'd':
  124.  
  125.             break;
  126.             case 'D':
  127.  
  128.             break;
  129.  
  130.             //Help
  131.             case 'h':
  132.                 std::cout << "\n-----------------------\n\t---2048---\n-----------------------\n\n";
  133.             break;
  134.             default:
  135.                 std::cout << "\n Command incorect!\n";
  136.             break;
  137.         }
  138.         break;
  139.     }
  140. }
  141.  
  142. void World::SpawnNumber(bool nMove[4]){
  143.     /*
  144.         nMove = {0,0,0,0}:
  145.             Спавн рандомных точек
  146.         nMove = {0,0,0,1}:
  147.             UP Спавн точки в x: 2-3 y: 0-3
  148.         nMove = {0,0,1,0}:
  149.             DOWN Спавн точки в x: 0-1 y: 0-3
  150.         nMove = {0,1,0,0}:
  151.             LEFT Спавн точки в x: 0-3 y: 2-3
  152.         nMove = {1,0,0,0}:
  153.             RIGHT Спавн точки в x: 0-3 y: 0-1
  154.     */
  155.             /*
  156.                 Для UP
  157.             */
  158.     if (nMove[0] == 0 && nMove[1] == 0 && nMove[2] == 0 && nMove[3] == 1){
  159.         for (;;){
  160.             bool nTypeBlock = rand()%2;
  161.  
  162.                 int nBlock;
  163.  
  164.             int nRandomPosX = rand()%3;
  165.             int nRandomPosY = rand()%4;
  166.  
  167.             if (nTypeBlock == 1){
  168.                 nBlock = 2;
  169.             } else {
  170.                 nBlock = 4;
  171.             }
  172.  
  173.             if (nRandomPosX == 0){
  174.                 nRandomPosX = 1;
  175.             } else if (nRandomPosX == 1) {
  176.                 nRandomPosX = 2;
  177.             } else {
  178.                 nRandomPosX = 3;
  179.             }
  180.  
  181.             if (nWorld[nRandomPosX][nRandomPosY] == 0){
  182.                 nWorld[nRandomPosX][nRandomPosY] = nBlock;
  183.                 break;
  184.             }
  185.         }
  186.  
  187.     }
  188.  
  189.  
  190.             //Установка блоков в самом начале:
  191.     if (nMove[0] == 0 && nMove[1] == 0 && nMove[2] == 0 && nMove[3] == 0){
  192.         int nCollvo;
  193.         for (;;){
  194.                 //Проверка на не пустой спавн
  195.             int nColichestvo = rand()%4; //Количество блоков в начале
  196.  
  197.             if (nColichestvo != 0){
  198.                 nCollvo = nColichestvo;
  199.                 break;
  200.             }
  201.         }
  202.  
  203.  
  204.         for (int i = 0; i < nCollvo; i++){
  205.             int nRandomPosX = rand()%4;
  206.             int nRandomPosY = rand()%4;
  207.  
  208.             bool nTypeBlock = rand()%2;
  209.             switch (nTypeBlock){
  210.                 case 0:
  211.                     nWorld[nRandomPosX][nRandomPosY] = 2;
  212.                 break;
  213.                 case 1:
  214.                     nWorld[nRandomPosX][nRandomPosY] = 4;
  215.                 break;
  216.             }
  217.  
  218.         }
  219.     }
  220. }
  221.  
  222. /*
  223. void World::RecursionFN(){
  224.    
  225.         Функция рекурсии
  226.    
  227.     PlayerCommander();
  228. }
  229. */
  230.  
  231. bool World::MoveUP(){
  232.     /*
  233.         Двигает блоки вверх
  234.     */
  235.  
  236.         /*
  237.             Копия мира для проверки на изменения
  238.         */
  239.         for (int x = 0; x < 4; x++){
  240.             for (int y = 0; y < 4; y++){
  241.                 nWorldCopy[x][y] = nWorld[x][y];
  242.             }
  243.         }
  244.  
  245.         //Перемещение
  246.     for (int i = 0; i < 2; i++){
  247.         /*
  248.             Заставляет циклам перемещения выполниться 2 раза
  249.         */
  250.         for (int x = 0; x < 3; x++){
  251.             for (int y = 0; y < 4; y++){
  252.                 if (nWorld[x][y] == 0 && nWorld[x+1][y] != 0){
  253.                     nWorld[x][y] = nWorld[x+1][y];
  254.                     nWorld[x+1][y] = 0;
  255.                 }
  256.             }
  257.         }
  258.     }
  259.  
  260.     //Сложение
  261.     for (int x = 0; x < 3; x++){
  262.             for (int y = 0; y < 4; y++){
  263.                 if (nWorld[x][y] == nWorld[x+1][y] && nWorld[x][y] != 0){
  264.                     nWorld[x][y] += nWorld[x+1][y];
  265.                     nScore += nWorld[x][y];
  266.                     nWorld[x+1][y] = 0;
  267.                 }
  268.             }
  269.     }
  270.  
  271.     /*
  272.         Проверка отличий мира
  273.     */
  274.  
  275.         /*
  276.         Проверялась адекватность этой херни
  277.         std::cout << "nWC: " << nWorldCopy[1][1] << "\n";
  278.         std::cout << "nW: " << nWorld[1][1] << "\n";
  279.         */
  280.  
  281.     for (int x = 0; x < 4; x++){
  282.         for (int y = 0; y < 4; y++){
  283.             if (nWorld[x][y] != nWorldCopy[y][x]){
  284.                 return 0;
  285.             }
  286.         }
  287.     }
  288.  
  289.     return 1;
  290. }
  291.  
  292. bool World::WorldChecker(){
  293.     /*
  294.         Проверяет мир на играбельность
  295.     */
  296.     for (int x = 0; x < 4; x++){
  297.         for (int y = 0; y < 4; y++){
  298.             if (nWorld[x][y] == 0){
  299.                 /*
  300.                     Если в мире есть хоть один 0 то вернуть "все хорошо"
  301.                 */
  302.                 return 0;
  303.             }
  304.         }
  305.     }
  306.  
  307.     for (int x = 0; x < 4; x++){
  308.         for (int y = 0; y < 3; y++){
  309.             if (nWorld[x][y] == nWorld[x][y+1]){
  310.                 /*
  311.                     Если в мире есть блоки одинаковые по горизонтали то
  312.                     вернуть "все хорошо"
  313.                 */
  314.                 return 0;
  315.             }
  316.         }
  317.     }
  318.  
  319.     for (int x = 0; x < 3; x++){
  320.         for (int y = 0; y < 4; y++){
  321.             if (nWorld[x][y] == nWorld[x+1][y]){
  322.                 /*
  323.                     Если в мире есть блоки одинаковые по вертикали то
  324.                     вернуть "все хорошо"
  325.                 */
  326.                 return 0;
  327.             }
  328.         }
  329.     }
  330.  
  331.     return 1;
  332. }
  333.  
  334. void World::Display(bool type){
  335.     /*
  336.         Если type = 0: Выводится массив
  337.         Если type = 1: Выводится имя игрока
  338.     */
  339.     switch (type){
  340.         case 0:
  341.             /*
  342.                 Вывод массива в консоль
  343.             */
  344.             std::cout << "----------------------------\nScore: " << nScore << "\n----------------------------\n";
  345.             for (int x = 0; x < 4; x++){
  346.                 for (int y = 0; y < 4; y++){
  347.                     std::cout << nWorld[x][y] << "    ";
  348.                 }
  349.             std::cout << "\n\n";
  350.             }
  351.             std::cout << "----------------------------\n";
  352.         break;
  353.         case 1:
  354.             //Вывод ника игрока
  355.             std::cout << "Hi! ";
  356.             for (int i = 0; i < 10; i++) {
  357.                 std::cout << sPlayerName[i];
  358.             }
  359.             std::cout << "\n----------------------------\n";
  360.         break;
  361.     }
  362. }
  363.  
  364. void World::SetWorldToZero(){
  365.     /*
  366.         Установка всему массиву значение 0
  367.     */
  368.     for (int x = 0; x < 4; x++){
  369.         for (int y = 0; y < 4; y++){
  370.             nWorld[x][y] = 0;
  371.         }
  372.     }
  373. }
  374.  
  375. void World::SetPlayerName(){
  376.     /*
  377.         Установка имени
  378.     */
  379.     for (int i = 0; i < 10; i++){
  380.         sPlayerName[i] = ' ';
  381.     }
  382.  
  383.     std::cout << "You nick name: ";
  384.     std::cin >> sPlayerName;
  385. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement