Advertisement
Guest User

Untitled

a guest
May 21st, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <windows.h>
  4. #include <ctime>
  5.  
  6. using std::cout;
  7. using std::endl;
  8.  
  9. enum Direction { LEFT, RIGHT, UP, DOWN };
  10. Direction dir = LEFT;
  11. char c;                                 //Символ ввода с клавиатуры
  12. const int width = 30;                   //Ширина игрового поля
  13. const int height = 20;                  //Высота игрового поля
  14. char Field[height][width];
  15. int speed = 300;                        //Переменная, отвечающая за скорость игры
  16. bool gameOver;                          //Переменная на проверку окончания игры
  17. int xFruit;                             //Координаты фрукта по X
  18. int yFruit;                             //Координаты фрукта по Y
  19. bool isFruit = false;                   //Переменная проверки наличия фрукта на игровом поле
  20. int xSnake = 10;                        //Первичные координаты размещения головы змейки
  21. int ySnake = 10;
  22. int sizeSnake = 0;
  23. int Score = 0;
  24. int prevX, prev2X, prevY, prev2Y;
  25. int xTail[100], yTail[100];             //Координаты хвоста
  26.  
  27. /////Функция определения координат фрукта на игровом поле
  28. void DrawFruit()
  29. {
  30.     srand(time(0));
  31.     if (isFruit == false)
  32.     {
  33.         xFruit = rand() % width -1;
  34.         yFruit = rand() % height - 1;
  35.         if (xFruit <= 0 || yFruit <= 0)
  36.         {
  37.             DrawFruit();
  38.         }
  39.         for (int k = 0; k < sizeSnake; k++)
  40.         {
  41.             if (xTail[k] == xFruit || yTail[k] == yFruit || xFruit == xSnake|| yFruit == ySnake)
  42.             {
  43.                 DrawFruit();
  44.             }
  45.         }
  46.     }
  47. }
  48.  
  49. /////Проверка на самопожирание
  50. void SelfDestruction()
  51. {
  52.     for (int i = 0; i < sizeSnake; i++)
  53.     {
  54.         if (xSnake == xTail[i] && ySnake == yTail[i])
  55.             gameOver = true;
  56.     }
  57. }
  58.  
  59. /////Функция обработки направления
  60. void ChangeDirection()
  61. {
  62.     c = _getch();
  63.     {
  64.         switch (c)
  65.         {
  66.         case 'w': if (dir != DOWN) { dir = UP;  } break;
  67.         case 's': if (dir != UP) { dir = DOWN;  } break;
  68.         case 'a': if (dir != RIGHT) { dir = LEFT;  } break;
  69.         case 'd': if (dir != LEFT) { dir = RIGHT;  } break;
  70.         case '+': if (speed > 50 && speed < 1000) { speed = speed - 24;}
  71.                   else if (speed < 50)
  72.                   {
  73.                       speed = 51;
  74.                   }
  75.                   else if (speed > 999)
  76.                   {
  77.                       speed = 1000;
  78.                   }break;
  79.         case '-': if (speed > 50 && speed < 1000) { speed = speed + 24; }
  80.                   else if (speed < 50)
  81.                   {
  82.                       speed = 51;
  83.                   }
  84.                   else if (speed > 1000)
  85.                   {
  86.                       speed = 999;
  87.                   }break;
  88.         case 'x': gameOver = true;
  89.         case 'p': isFruit = false;  DrawFruit(); // Повторная отрисовка фрукта (иногда был выход за границы игрового поля)
  90.         default: break;
  91.         }
  92.     }
  93. }
  94.  
  95. /////Функция кормления змейки
  96. void FeedTheSnake()
  97. {
  98.     if (xSnake == xFruit && ySnake == yFruit)
  99.     {
  100.         sizeSnake++;
  101.         Field[yFruit][xFruit] = ' ';
  102.         isFruit = false;
  103.         Score += 10;
  104.     }
  105. }
  106.  
  107. /////Функция отрисовки головы змейки в зависимости от направления
  108. void DrawSnake()
  109. {////////////////////////////////////////////////////////
  110.     prevX = xTail[0];
  111.     prevY = yTail[0];
  112.     xTail[0] = xSnake;
  113.     yTail[0] = ySnake;
  114.     for (int i = 1; i < sizeSnake; i++)                 //этот кусок функции писал не я, мозжечка не хватило
  115.     {
  116.         prev2X = xTail[i];
  117.         prev2Y = yTail[i];
  118.         xTail[i] = prevX;
  119.         yTail[i] = prevY;
  120.         prevX = prev2X;
  121.         prevY = prev2Y;
  122.     }
  123.  
  124. /////////////////////////////////////////////////////////
  125.     switch (dir)
  126.     {
  127.     case LEFT:Field[ySnake][xSnake] = '<'; xSnake--; if (xSnake <= 0) { xSnake = width; } break;
  128.     case RIGHT:Field[ySnake][xSnake] = '>'; xSnake++; if (xSnake >= width) { xSnake = 0; } break;
  129.     case UP:Field[ySnake][xSnake] = '^'; ySnake--; if (ySnake <= 0) { ySnake = height ; } break;
  130.     case DOWN:Field[ySnake][xSnake] = 'v'; ySnake++; if (ySnake >=height) { ySnake = 0; } break;
  131.     }
  132. }
  133.  
  134. /////Функция отрисовки игрового поля
  135. void DrawField()
  136. {
  137.     /////Блок заполнения игрового поля
  138.     system("cls");
  139.     DrawSnake();
  140.     for (int i = 0; i < height; i++)
  141.     {
  142.         for (int j = 0; j < width; j++)
  143.         {
  144.             if (j == xSnake && i == ySnake && dir == LEFT)
  145.                 cout << '<';
  146.             else if (j == xSnake && i == ySnake && dir == RIGHT)
  147.                 cout << '>';
  148.             else if (j == xSnake && i == ySnake && dir == DOWN)
  149.                 cout << 'v';
  150.             else if (j == xSnake && i == ySnake && dir == UP)
  151.                 cout << '^';
  152.             else if (i == yFruit && j == xFruit)
  153.                 cout << '*';
  154.             else
  155.             {
  156.                 bool print = false;
  157.                 for (int k = 0; k < sizeSnake; k++)
  158.                 {
  159.                     if (xTail[k] == j && yTail[k] == i)
  160.                     {
  161.                         print = true;
  162.                         cout << '0';
  163.                     }
  164.                 }
  165.                 if (!print)
  166.                 cout << ' ';
  167.             }
  168.         }
  169.         cout << endl;
  170.     }
  171.     isFruit = true;                 //флаг, чтобы фрукт не скакал по полю
  172.     /////Вывод значений переменных для отладки
  173.     cout <<  "xFruit = " << xFruit << "  yFruit =  " << yFruit;    
  174.     cout << endl << "direction " << dir << endl << "Time Interval (ms) " << speed << endl;
  175.     cout << "xSnake = " << xSnake  << "  "<< "ySnake = " << ySnake << endl;
  176.     cout << Score << endl;
  177. }
  178.  
  179. int main()
  180. {
  181.     while (!gameOver)
  182.     {
  183.         FeedTheSnake();
  184.         SelfDestruction();
  185.         DrawFruit();
  186.         DrawField();
  187.         Sleep(speed);
  188.         if (_kbhit() == true)
  189.         {
  190.             ChangeDirection();
  191.         }
  192.     }
  193.     _getch();
  194.     return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement