Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <conio.h>
- using namespace std;
- // Прототипи
- void run();
- void printMap();
- void initMap();
- void move(int dx, int dy);
- void update();
- void changeDirection(char key);
- void clearScreen();
- void generateFood();
- char getMapValue(int value);
- // Размери на картата
- const int mapwidth = 20;
- const int mapheight = 20;
- const int size = mapwidth * mapheight;
- // Стойностите на плочките за картата
- int map[size];
- // Главни детайли на змията
- int headxpos;
- int headypos;
- int direction;
- // Сумата на храната,която змията има(Колко да бъде дълго тялото)
- int food = 3;
- // Определяне дали играта се изпълнява
- bool running;
- int main()
- {
- run();
- return 0;
- }
- // Основната функция на играта
- void run()
- {
- // Инициализация на картата
- initMap();
- running = true;
- while (running) {
- // Ако е натиснат клавиш
- if (kbhit()) {
- // Променете посоката, определена от натиснат клавиш
- changeDirection(getch());
- }
- // Актуализиране на картата
- update();
- // Изчиства екрана
- clearScreen();
- // Отпечатва картата
- printMap();
- // Изчаква 0.5 секунди
- _sleep(300);
- }
- // Извежда текст за край на играта
- cout << "\t\t!!!Game over!" << endl << "\t\tYour score is: " << food;
- // Прекратява незабавното затваряне на конзолата
- cin.ignore();
- }
- // Променя посоката на змията от въвеждане с клавиш
- void changeDirection(char key) {
- /*
- W
- A + D
- S
- 1
- 4 + 2
- 3
- */
- switch (key) {
- case 'w':
- if (direction != 2) direction = 0;
- break;
- case 'd':
- if (direction != 3) direction = 1;
- break;
- case 's':
- if (direction != 4) direction = 2;
- break;
- case 'a':
- if (direction != 5) direction = 3;
- break;
- }
- }
- // Премества змията в ново местоположение
- void move(int dx, int dy) {
- // Определя нова позиция
- int newx = headxpos + dx;
- int newy = headypos + dy;
- // Проверява дали на мястото има храна
- if (map[newx + newy * mapwidth] == -2) {
- // Увеличава телесната маса на змията
- food++;
- // Генерира нова храна на картата
- generateFood();
- }
- // Проверява дали е свободно мястото
- else if (map[newx + newy * mapwidth] != 0) {
- running = false;
- }
- // Премества змията в ново местоположение
- headxpos = newx;
- headypos = newy;
- map[headxpos + headypos * mapwidth] = food + 1;
- }
- // Изчиства екрана
- void clearScreen() {
- // Изчиства екрана
- system("cls");
- }
- // Генерира нова храна на картата
- void generateFood() {
- int x = 0;
- int y = 0;
- do {
- // Генерира случайни x и y стойности на картата
- x = rand() % (mapwidth - 2) + 1;
- y = rand() % (mapheight - 2) + 1;
- // Ако местоположението не е свободно, опитайте отново
- } while (map[x + y * mapwidth] != 0);
- // Добавя нова храна
- map[x + y * mapwidth] = -2;
- }
- // Обновяване на картата
- void update() {
- // Посочете посоката на движение
- switch (direction) {
- case 0: move(-1, 0);
- break;
- case 1: move(0, 1);
- break;
- case 2: move(1, 0);
- break;
- case 3: move(0, -1);
- break;
- }
- // Намалява стойностите на змията на картата с 1
- for (int i = 0; i < size; i++) {
- if (map[i] > 0) map[i]--;
- }
- }
- // Инициализация на картата
- void initMap()
- {
- // Поставя първоначалното местоположение на змията в средата на картата
- headxpos = mapwidth / 2;
- headypos = mapheight / 2;
- map[headxpos + headypos * mapwidth] = 1;
- // Поставя горни и долни стени
- for (int x = 0; x < mapwidth; ++x) {
- map[x] = -1;
- map[x + (mapheight - 1) * mapwidth] = -1;
- }
- // Поставя леви и десни стени
- for (int y = 0; y < mapheight; y++) {
- map[0 + y * mapwidth] = -1;
- map[(mapwidth - 1) + y * mapwidth] = -1;
- }
- // Поставя първата храна
- generateFood();
- }
- // Извеждане на картата в конзола
- void printMap()
- {
- for (int x = 0; x < mapwidth; ++x) {
- for (int y = 0; y < mapheight; ++y) {
- // Извежда стойностите на x,y за настоящо местонахождение
- cout << getMapValue(map[x + y * mapwidth]);
- }
- // Затваря линията за следващата стойност x
- cout << endl;
- }
- }
- // Връща графичен знак за показване от стойността на картата
- char getMapValue(int value)
- {
- // Връща част от тялото на змията
- if (value > 0) return '0';
- switch (value) {
- // Връща стените
- case -1: return '#';
- // Връща храна
- case -2: return '*';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement