Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <conio.h>
- #include <windows.h>
- #include <ctime>
- using std::cout;
- using std::endl;
- enum Direction { LEFT, RIGHT, UP, DOWN };
- Direction dir = LEFT;
- char c; //Символ ввода с клавиатуры
- const int width = 30; //Ширина игрового поля
- const int height = 20; //Высота игрового поля
- char Field[height][width];
- int speed = 300; //Переменная, отвечающая за скорость игры
- bool gameOver; //Переменная на проверку окончания игры
- int xFruit; //Координаты фрукта по X
- int yFruit; //Координаты фрукта по Y
- bool isFruit = false; //Переменная проверки наличия фрукта на игровом поле
- int xSnake = 10; //Первичные координаты размещения головы змейки
- int ySnake = 10;
- int sizeSnake = 0;
- int Score = 0;
- int prevX, prev2X, prevY, prev2Y;
- int xTail[100], yTail[100]; //Координаты хвоста
- /////Функция определения координат фрукта на игровом поле
- void DrawFruit()
- {
- srand(time(0));
- if (isFruit == false)
- {
- xFruit = rand() % width -1;
- yFruit = rand() % height - 1;
- if (xFruit <= 0 || yFruit <= 0)
- {
- DrawFruit();
- }
- for (int k = 0; k < sizeSnake; k++)
- {
- if (xTail[k] == xFruit || yTail[k] == yFruit || xFruit == xSnake|| yFruit == ySnake)
- {
- DrawFruit();
- }
- }
- }
- }
- /////Проверка на самопожирание
- void SelfDestruction()
- {
- for (int i = 0; i < sizeSnake; i++)
- {
- if (xSnake == xTail[i] && ySnake == yTail[i])
- gameOver = true;
- }
- }
- /////Функция обработки направления
- void ChangeDirection()
- {
- c = _getch();
- {
- switch (c)
- {
- case 'w': if (dir != DOWN) { dir = UP; } break;
- case 's': if (dir != UP) { dir = DOWN; } break;
- case 'a': if (dir != RIGHT) { dir = LEFT; } break;
- case 'd': if (dir != LEFT) { dir = RIGHT; } break;
- case '+': if (speed > 50 && speed < 1000) { speed = speed - 24;}
- else if (speed < 50)
- {
- speed = 51;
- }
- else if (speed > 999)
- {
- speed = 1000;
- }break;
- case '-': if (speed > 50 && speed < 1000) { speed = speed + 24; }
- else if (speed < 50)
- {
- speed = 51;
- }
- else if (speed > 1000)
- {
- speed = 999;
- }break;
- case 'x': gameOver = true;
- case 'p': isFruit = false; DrawFruit(); // Повторная отрисовка фрукта (иногда был выход за границы игрового поля)
- default: break;
- }
- }
- }
- /////Функция кормления змейки
- void FeedTheSnake()
- {
- if (xSnake == xFruit && ySnake == yFruit)
- {
- sizeSnake++;
- Field[yFruit][xFruit] = ' ';
- isFruit = false;
- Score += 10;
- }
- }
- /////Функция отрисовки головы змейки в зависимости от направления
- void DrawSnake()
- {////////////////////////////////////////////////////////
- prevX = xTail[0];
- prevY = yTail[0];
- xTail[0] = xSnake;
- yTail[0] = ySnake;
- for (int i = 1; i < sizeSnake; i++) //этот кусок функции писал не я, мозжечка не хватило
- {
- prev2X = xTail[i];
- prev2Y = yTail[i];
- xTail[i] = prevX;
- yTail[i] = prevY;
- prevX = prev2X;
- prevY = prev2Y;
- }
- /////////////////////////////////////////////////////////
- switch (dir)
- {
- case LEFT:Field[ySnake][xSnake] = '<'; xSnake--; if (xSnake <= 0) { xSnake = width; } break;
- case RIGHT:Field[ySnake][xSnake] = '>'; xSnake++; if (xSnake >= width) { xSnake = 0; } break;
- case UP:Field[ySnake][xSnake] = '^'; ySnake--; if (ySnake <= 0) { ySnake = height ; } break;
- case DOWN:Field[ySnake][xSnake] = 'v'; ySnake++; if (ySnake >=height) { ySnake = 0; } break;
- }
- }
- /////Функция отрисовки игрового поля
- void DrawField()
- {
- /////Блок заполнения игрового поля
- system("cls");
- DrawSnake();
- for (int i = 0; i < height; i++)
- {
- for (int j = 0; j < width; j++)
- {
- if (j == xSnake && i == ySnake && dir == LEFT)
- cout << '<';
- else if (j == xSnake && i == ySnake && dir == RIGHT)
- cout << '>';
- else if (j == xSnake && i == ySnake && dir == DOWN)
- cout << 'v';
- else if (j == xSnake && i == ySnake && dir == UP)
- cout << '^';
- else if (i == yFruit && j == xFruit)
- cout << '*';
- else
- {
- bool print = false;
- for (int k = 0; k < sizeSnake; k++)
- {
- if (xTail[k] == j && yTail[k] == i)
- {
- print = true;
- cout << '0';
- }
- }
- if (!print)
- cout << ' ';
- }
- }
- cout << endl;
- }
- isFruit = true; //флаг, чтобы фрукт не скакал по полю
- /////Вывод значений переменных для отладки
- cout << "xFruit = " << xFruit << " yFruit = " << yFruit;
- cout << endl << "direction " << dir << endl << "Time Interval (ms) " << speed << endl;
- cout << "xSnake = " << xSnake << " "<< "ySnake = " << ySnake << endl;
- cout << Score << endl;
- }
- int main()
- {
- while (!gameOver)
- {
- FeedTheSnake();
- SelfDestruction();
- DrawFruit();
- DrawField();
- Sleep(speed);
- if (_kbhit() == true)
- {
- ChangeDirection();
- }
- }
- _getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement