123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #include <iostream>
- #include <windows.h>
- #include <conio.h>
- #include "Const.h"
- //Устанавливаются начальные значения параметров игры.
- void init_game(Field& field, Snake& snake, Game& game, Food& food)//Устанавливаются начальные значения параметров игры.
- {
- food.score = 0;//количество сьеденной еды
- food.food_flag = false;//Признак, что еда установлена
- game.timeout = 100; //Таймаут задержки между шагами игры; > 100 (ms), 1000 - будет задерживать выполнение программы на 1 секунду
- game.game_on = 1;//Признак продолжения игры
- snake.direction = turn_right;
- srand(time(0));//установка начала последовательности, генерируемой функцией rand()
- system("cls");//полная очистка консоли
- create_field(field);//Cоздание двумерного динамического массива поля на основе пользовательских данных
- start_snake(field, snake);//устанавливается начальное положение головы змейки при старте игры в зависимости от размера поля (по центру)
- init_snake(snake);//Устанавливается пользовательский размер змейки, массив змейки заполняется стартовыми значениями
-
- init_field(field);//Инициализация поля (символы заполнения поля и границ)
- set_snake(field, snake);//Змейка устанавливается в игровом поле
- print_field(field, food.score);//печать поля
- std::cout << "Press any key" << std::endl;//5) Вывод приглашения к игре.
- }
- //устанавливается начальное положение головы змейки при старте игры в зависимости от размера поля (по центру)
- void start_snake(Field& field, Snake& snake)
- {
- //int step_x = rand() % L + 1; // разработать случайное начальное положение змейки
- //step = 13;
- //snake_x[0] = 13;
- snake.snake_x[0] = field.columns / 2;
- snake.snake_y[0] = field.rows / 2;
- }
- //Змейка устанавливается в игровом поле
- void set_snake(Field& field, Snake& snake)
- {
- field.field[snake.snake_y[0]][snake.snake_x[0]] = head_symbol;//установка головы
- // установка хвоста, если есть
-
- for (int i = 1; i < snake.snake_size; i++)
- {
- field.field[snake.snake_y[i]][snake.snake_x[i]] = tail_symbol;
- }
- }
- //Очищается позиция змейки на поле
- void clear_snake(Field& field, Snake& snake)
- {
- //чистим "хвост"
- field.field[snake.snake_y[snake.snake_size-1]][snake.snake_x[snake.snake_size-1]] = field_symbol;
- }
- // Генерируется хначение еды и устанавливается в игровом поле.
- void set_food(Field& field, Food& food)
- {
- if (!food.food_flag)//если нет еды и змейка не достигла максимального размера
- {
- do
- {
- generate_food(field, food);
- } while (field.field[food.food_y][food.food_x] != field_symbol);
- field.field[food.food_y][food.food_x] = food_symbol;
- food.food_flag = true;
- }
- }
- //Выполняется проверка того, что змейка съела еду (координаты головы совпадают с кооординатами еды)
- void check_eating(Snake& snake, Food& food)
- {
- if (snake.snake_y[0]== food.food_y && snake.snake_x[0] == food.food_x)//Координата еды совпадают с координатами головы
- {
- food.food_flag = false;//еды нет
- ++food.score;
- snake.snake_size++; //увеличение размера змейки
- }
- }
- //Выполняется проверка того, что змейка встретилась с границей поля
- void check_snake(Field& field, Snake& snake)
- {
- if (snake.snake_x[0] == 0)
- {
- snake.snake_x[0] = field.columns - 2;
- }
-
- if (snake.snake_x[0] == field.columns - 1)
- {
- snake.snake_x[0] = 1;
- }
- if (snake.snake_y[0] == 0)
- {
- snake.snake_y[0] = field.rows - 2;
- }
- if (snake.snake_y[0] == field.rows - 1)
- {
- snake.snake_y[0] = 1;
- }
- }
- //Проверка завершения игры.
- int check_game(Field& field, Snake& snake, Food& food)
- {
- int tmp_game_on = 1;
- if (!food.food_flag && snake.snake_size == L)//если нет еды и змейка максимального размера
- {
- tmp_game_on = 0;
- //придумать разные варианты выводимых сообщений в зависимости от ситуации
- }
-
- if (field.field[snake.snake_y[0]][snake.snake_x[0]] == tail_symbol) //проверка того, что змейка встретилась с хвостом
- {
- tmp_game_on = 0;
- }
-
- return tmp_game_on;
- }
- //Обработка пользовательского ввода, задание направления движения змейки
- void handle_cmd(Snake& snake, Game& game)
- {
- char key;// для ввода кода символа с клавиатуры
- char keep_direct;// для сохранения символа направления движения.
- DIRECTION tmp_direction;
- key = _getch();
-
- if (key == 0 || key == -32)
- {
- keep_direct = _getch();
-
- switch (keep_direct)
- {
- case up: {tmp_direction = turn_up; } break;
- case down: {tmp_direction = turn_down; } break;
- case left: {tmp_direction = turn_left; } break;
- case right: {tmp_direction = turn_right; } break;
-
- default: {tmp_direction = err; }
- }
- }
- else
- {
- switch (key = toupper(key))
- {
- case s_right: {tmp_direction = turn_right; } break;
- case s_left: {tmp_direction = turn_left; } break;
- case s_up: {tmp_direction = turn_up; } break;
- case s_down: {tmp_direction = turn_down; } break;
- case s_out: {game.game_on = 0; } return;//убрать (объединить)
- case esc: {game.game_on = 0; } return;
- break;
- default: {tmp_direction = err; }
- }
- }
- if (tmp_direction != err)
- {
- switch (snake.direction)
- {
- case turn_up://доработать, плохо читается, можно усовершенствовать
- {
- if (tmp_direction == turn_down) { snake.direction = turn_up; }
- else {snake.direction = tmp_direction; }
- } break;
- case turn_down:
- {
- if (tmp_direction == turn_up) { snake.direction = turn_down; }
- else { snake.direction = tmp_direction; }
- } break;
- case turn_left:
- {
- if (tmp_direction == turn_right) { snake.direction = turn_left; }
- else { snake.direction = tmp_direction; }
- } break;
- case turn_right:
- {
- if (tmp_direction == turn_left) { snake.direction = turn_right; }
- else { snake.direction = tmp_direction; }
- } break;
- default: { snake.direction = tmp_direction; } break;
- }
- }
- }
- // Вывод информации при окончание игры и очистка памяти
- void game_over(Field& field, Snake& snake, Food& food)
- {
- setCursorPosition(0, 0);
-
- if(snake.snake_size<L) field.field[snake.snake_y[0]][snake.snake_x[0]] = head_symbol;
- print_field(field, food.score);
- if (snake.snake_size == L) std::cout << "Max size! You win!" << std::endl;
- else std::cout << "You lose!" << std::endl;
-
- std::cout << "The end!" << std::endl;
- //чистим память
- for (int i = 0; i < field.rows; i++)
- {
- delete[] field.field[i];
- }
- delete[] field.field;
- }
|