Esempio n. 1
0
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);
  }

}
Esempio n. 3
0
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();
}