AStar::AStar(): m_numSurround(8) { m_surround[0] = ASCOORD( 0,-1); m_surround[1] = ASCOORD( 0, 1); m_surround[2] = ASCOORD(-1, 0); m_surround[3] = ASCOORD( 1, 0); m_surround[4] = ASCOORD(-1,-1); m_surround[5] = ASCOORD( 1,-1); m_surround[6] = ASCOORD(-1, 1); m_surround[7] = ASCOORD( 1, 1); for(int i = 0 ; i<4 ; ++i) m_gAdd[i] = 10; for(int i = 4 ; i<8 ; ++i) m_gAdd[i] = 14; ClearObstacles(); }
//инициализация и старт игры void StartGame(int difficulty, int gamemode) { //очистка стен и их генерация ClearObstacles(); switch (gamemode) { case 0: break; //пустое поле case 1: //коробка for (int i = 0; i < GAME_ROWS + 1; i++) { vObstacles[i][0] = 1; vObstacles[i][GAME_COLS] = 1; } for (int i = 0; i < GAME_COLS + 1; i++) { gObstacles[0][i] = 1; gObstacles[GAME_ROWS][i] = 1; } break; case 2: /* лабиринт - генерация поля до тех пор, пока оно не станет пригодным для игры число генерируемых препятствий уменьшается на 1, если не удается подобрать подходящее поле для игры */ int OCount = 100; int OTick = 10; do { OTick--; if (OTick <= 0) { OTick = 10; OCount--; } ClearObstacles(); for (int i = 0; i < OCount; i++) { vObstacles[rand() % GAME_ROWS][rand() % (GAME_COLS + 1)] = 1; gObstacles[rand() % (GAME_ROWS + 1)][rand() % GAME_COLS] = 1; } //расчищаем путь для змейки for (int i = 1; i <= 8; i++) { vObstacles[1][i] = 0; } } while (!ValidateGameField()); printf("Obstacle count: %d\n", OCount); break; } isGameOver = false; isGamePaused = false; SnakeDirection = 1; NewSnakeDirection = 1; LivingTicks = 0; GamePoints = 0; GameBonusPoints = 0; LastBonusSpawn = 0; CurrentDifficulty = difficulty; CurrentGamemode = gamemode; //настройки игры в соответствии со сложностью switch (difficulty) { case 0: BonusSpawnInterval = 4; BonusEffect = 3; BonusLive = 25; GameSpeed = 400; break; case 1: BonusSpawnInterval = 5; BonusEffect = 2; BonusLive = 20; GameSpeed = 250; break; case 2: BonusSpawnInterval = 7; BonusEffect = 1; BonusLive = 15; GameSpeed = 135; break; default: printf("Unknown difficulty %d\n", difficulty); break; } //выращивание змейки Head = (SnakeCell*)malloc(sizeof(SnakeCell)); Head->x = 3; Head->y = 1; Head->prev = NULL; Head->fat = false; Head->visible = true; Head->next = (SnakeCell*)malloc(sizeof(SnakeCell)); Head->next->x = 2; Head->next->y = 1; Head->next->fat = false; Head->next->visible = true; Head->next->prev = Head; Head->next->next = (SnakeCell*)malloc(sizeof(SnakeCell)); Head->next->next->x = 1; Head->next->next->y = 1; Head->next->next->fat = false; Head->next->next->visible = true; Head->next->next->prev = Head->next; Head->next->next->next = NULL; //генерация первого яблока - оно не должно совпадать // ни с одним сегментом змеи по координатам bool goodApple; do { Apple.x = rand() % GAME_COLS; Apple.y = rand() % GAME_ROWS; goodApple = true; if (Apple.x == Head->x && Apple.y == Head->y) { goodApple = false; } if (Apple.x == Head->next->x && Apple.y == Head->next->y) { goodApple = false; } if (Apple.x == Head->next->next->x && Apple.y == Head->next->next->y) { goodApple = false; } } while (!goodApple); Bonus.x = 0; Bonus.y = 0; Bonus.living = 0; Bonus.isActive = false; //первый тик через GameSpeed мс glutTimerFunc(GameSpeed, onTick, W_GAME); }