AI::AI(Snake *snakes[], int player_num, Pellet *pellet, Collision_Table *collision_table, int difficulty, bool tron) { for (int i = 0; i < 4; i++) { m_snakes[i] = snakes[i]; } assert(pellet); m_pellet = pellet; m_collision_table = collision_table; m_player_num = player_num; if (difficulty == 0) { //EASY MAX_LOOK_AHEAD = EASY_MAX_LOOK_AHEAD; MAX_OFFENSIVE_MOVES = EASY_MAX_OFFENSIVE_MOVES; MAX_NOTICE_PELLET = EASY_MAX_NOTICE_PELLET; CHECK_FAIL = EASY_CHECK_FAIL; } else if (difficulty == 1) { //MEDIUM MAX_LOOK_AHEAD = MEDIUM_MAX_LOOK_AHEAD; MAX_OFFENSIVE_MOVES = MEDIUM_MAX_OFFENSIVE_MOVES; MAX_NOTICE_PELLET = MEDIUM_MAX_NOTICE_PELLET; if (tron) CHECK_FAIL = MEDIUM_CHECK_FAIL_TRON; else CHECK_FAIL = MEDIUM_CHECK_FAIL_SNAKE; } else { //HARD MAX_LOOK_AHEAD = HARD_MAX_LOOK_AHEAD; MAX_OFFENSIVE_MOVES = HARD_MAX_OFFENSIVE_MOVES; MAX_NOTICE_PELLET = HARD_MAX_NOTICE_PELLET; } m_ai_difficulty = difficulty; m_notice_pellet = MAX_NOTICE_PELLET; m_tron = tron; assert(snakes[m_player_num]); m_max_x = snakes[m_player_num]->get_max_x(); m_max_y = snakes[m_player_num]->get_max_y(); m_width = snakes[m_player_num]->get_width(); if (m_tron) m_offensive_count = rand() % MAX_OFFENSIVE_MOVES + (MAX_OFFENSIVE_MOVES/4) + 1; else m_offensive_count = 0; update_coordinates(); update_direction(); }
/* * Check for the nmea string(s) that will hold the * information we need. */ void parse_code(char *buffer, uint32_t index) { //char *gpgll = "GPGGA"; //char *gpgsv = "GPGSV"; // All pieces of data start with GP if (*(buffer+(index%BUFFERSIZE)) != 'G') return; index++; if (*(buffer+(index%BUFFERSIZE)) != 'P') return; index++; // Check for the GLL data if (*(buffer+(index%BUFFERSIZE))=='G' && *(buffer+((index+1)%BUFFERSIZE))=='G' && *(buffer+((index+2)%BUFFERSIZE))=='A') { update_coordinates(buffer, (index+4)%BUFFERSIZE); } }
void AI::read_input() { update_coordinates(); update_direction(); if (try_move_to_pellet()) return; if (!m_tron) { if (rand() % SNAKE_TURN_CHANCE == 0) { if (ok_to_turn()) { go_safest_turn_direction(); return; } } } else if (m_offensive_count > 0) { offensive(); return; } defensive(); }