Advertisement
Grossos

Snake Game

May 1st, 2017 (edited)
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. using namespace std;
  4.  
  5. // Прототипи
  6. void run();
  7. void printMap();
  8. void initMap();
  9. void move(int dx, int dy);
  10. void update();
  11. void changeDirection(char key);
  12. void clearScreen();  
  13. void generateFood();
  14. char getMapValue(int value);  
  15.  
  16. // Размери на картата
  17. const int mapwidth = 20;
  18. const int mapheight = 20;
  19.  
  20. const int size = mapwidth * mapheight;
  21.  
  22. // Стойностите на плочките за картата
  23. int map[size];
  24.  
  25. // Главни детайли на змията
  26. int headxpos;
  27. int headypos;
  28. int direction;
  29.  
  30. // Сумата на храната,която змията има(Колко да бъде дълго тялото)
  31. int food = 3;
  32.  
  33. // Определяне дали играта се изпълнява
  34. bool running;
  35.  
  36. int main()
  37. {
  38.     run();
  39.     return 0;
  40. }
  41.  
  42. // Основната функция на играта
  43. void run()
  44. {
  45.     // Инициализация на картата
  46.     initMap();
  47.     running = true;
  48.     while (running) {
  49.         // Ако е натиснат клавиш
  50.         if (kbhit()) {
  51.             // Променете посоката, определена от натиснат клавиш
  52.             changeDirection(getch());
  53.         }
  54.         // Актуализиране на картата
  55.         update();
  56.  
  57.         // Изчиства екрана
  58.         clearScreen();
  59.  
  60.         // Отпечатва картата
  61.         printMap();
  62.  
  63.         // Изчаква 0.5 секунди
  64.         _sleep(300);
  65.     }
  66.     // Извежда текст за край на играта
  67.      cout << "\t\t!!!Game over!" <<  endl << "\t\tYour score is: " << food;
  68.  
  69.     //  Прекратява незабавното затваряне на конзолата
  70.      cin.ignore();
  71. }
  72.  
  73. // Променя посоката на змията от въвеждане с клавиш
  74. void changeDirection(char key) {
  75.     /*
  76.       W
  77.     A + D
  78.       S
  79.  
  80.       1
  81.     4 + 2
  82.       3
  83.     */
  84.     switch (key) {
  85.     case 'w':
  86.         if (direction != 2) direction = 0;
  87.         break;
  88.     case 'd':
  89.         if (direction != 3) direction = 1;
  90.         break;
  91.     case 's':
  92.         if (direction != 4) direction = 2;
  93.         break;
  94.     case 'a':
  95.         if (direction != 5) direction = 3;
  96.         break;
  97.     }
  98. }
  99.  
  100. // Премества змията в ново местоположение
  101. void move(int dx, int dy) {
  102.     // Определя нова позиция
  103.     int newx = headxpos + dx;
  104.     int newy = headypos + dy;
  105.  
  106.     // Проверява дали на мястото има храна
  107.     if (map[newx + newy * mapwidth] == -2) {
  108.         // Увеличава телесната маса на змията
  109.         food++;
  110.  
  111.         // Генерира нова храна на картата
  112.         generateFood();
  113.     }
  114.  
  115.     // Проверява дали е свободно мястото
  116.     else if (map[newx + newy * mapwidth] != 0) {
  117.         running = false;
  118.     }
  119.  
  120.     // Премества змията в ново местоположение
  121.     headxpos = newx;
  122.     headypos = newy;
  123.     map[headxpos + headypos * mapwidth] = food + 1;
  124.  
  125. }
  126.  
  127. // Изчиства екрана
  128. void clearScreen() {
  129.     // Изчиства екрана
  130.     system("cls");
  131. }
  132.  
  133. // Генерира нова храна на картата
  134. void generateFood() {
  135.     int x = 0;
  136.     int y = 0;
  137.     do {
  138.         // Генерира случайни x и y стойности на картата
  139.         x = rand() % (mapwidth - 2) + 1;
  140.         y = rand() % (mapheight - 2) + 1;
  141.  
  142.         // Ако местоположението не е свободно, опитайте отново
  143.     } while (map[x + y * mapwidth] != 0);
  144.  
  145.     // Добавя нова храна
  146.     map[x + y * mapwidth] = -2;
  147. }
  148.  
  149. // Обновяване на картата
  150. void update() {
  151.     // Посочете посоката на движение
  152.     switch (direction) {
  153.     case 0: move(-1, 0);
  154.         break;
  155.     case 1: move(0, 1);
  156.         break;
  157.     case 2: move(1, 0);
  158.         break;
  159.     case 3: move(0, -1);
  160.         break;
  161.     }
  162.  
  163.     // Намалява стойностите на змията на картата с 1
  164.     for (int i = 0; i < size; i++) {
  165.         if (map[i] > 0) map[i]--;
  166.     }
  167. }
  168.  
  169. // Инициализация на картата
  170. void initMap()
  171. {
  172.     // Поставя първоначалното местоположение на змията в средата на картата
  173.     headxpos = mapwidth / 2;
  174.     headypos = mapheight / 2;
  175.     map[headxpos + headypos * mapwidth] = 1;
  176.  
  177.     // Поставя горни и долни стени
  178.     for (int x = 0; x < mapwidth; ++x) {
  179.         map[x] = -1;
  180.         map[x + (mapheight - 1) * mapwidth] = -1;
  181.     }
  182.  
  183.     // Поставя леви и десни стени
  184.     for (int y = 0; y < mapheight; y++) {
  185.         map[0 + y * mapwidth] = -1;
  186.         map[(mapwidth - 1) + y * mapwidth] = -1;
  187.     }
  188.  
  189.     // Поставя първата храна
  190.     generateFood();
  191. }
  192.  
  193. // Извеждане на картата в конзола
  194. void printMap()
  195. {
  196.     for (int x = 0; x < mapwidth; ++x) {
  197.         for (int y = 0; y < mapheight; ++y) {
  198.             // Извежда стойностите на x,y за настоящо местонахождение
  199.              cout << getMapValue(map[x + y * mapwidth]);
  200.         }
  201.         //  Затваря линията за следващата стойност x
  202.          cout <<  endl;
  203.     }
  204. }
  205.  
  206. // Връща графичен знак за показване от стойността на картата
  207. char getMapValue(int value)
  208. {
  209.     // Връща част от тялото на змията
  210.     if (value > 0) return '0';
  211.  
  212.     switch (value) {
  213.         // Връща стените
  214.     case -1: return '#';
  215.         // Връща храна
  216.     case -2: return '*';
  217.     }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement