void move(int index, char dir, struct game_state* Game, struct game_info* Info) { int *row = &Game->my_ants[index].row; int *col = &Game->my_ants[index].col; char *val = &Info->map[mkindex(*row, *col, Info)]; if (*val == '0') *val = 'A'; else *val = '.'; fprintf(stdout, "O %i %i %c\n", *row, *col, dir); switch (dir) { case 'N': if (*row != 0) *row -= 1; else *row = Info->rows - 1; break; case 'E': if (*col != Info->cols - 1) *col += 1; else *col = 0; break; case 'S': if (*row != Info->rows - 1) *row += 1; else *row = 0; break; case 'W': if (*col != 0) *col -= 1; else *col = Info->cols - 1; break; } val = &Info->map[mkindex(*row, *col, Info)]; if (*val == '0') *val = 'A'; else *val = 'a'; }
static inline void difuse_rules(int buff, int row, int col, struct game_state *G, struct game_info *I) { int i; int buff_prev = (buff+1) % 2; int pos = MAP(mkindex(row, col, I)); if (_last_seen[mkindex(row, col, I)] < turn) AGENT(buff_prev, EXPLORE, row, col) = INT_MAX - (0.001*INT_MAX)*_last_seen[mkindex(row, col, I)]; if (pos == '%') { /* wall */ int agent; for (agent = 0; agent < NUM_AGENTS; agent++) { AGENT(buff_prev, agent, row, col) = 0; } } else if (pos == '*') { /* food */ AGENT(buff_prev, FOOD, row, col) = INT_MAX; for (i = 0; i < NUM_AGENTS; i++) if (i != FOOD) difuse_default(buff, i, row, col, I); } else if (pos == 'a') { /* my ant */ AGENT(buff_prev, ALLY, row, col) = INT_MAX; AGENT(buff_prev, ENEMY, row, col) = 0; AGENT(buff_prev, FOOD, row, col) = 0; AGENT(buff_prev, EXPLORE, row, col) = 0; difuse_default(buff, ENEMY_HILL, row, col, I); } else if (pos == 'A') { /* my hill + my ant */ AGENT(buff_prev, MY_HILL, row, col) = INT_MAX; AGENT(buff_prev, ALLY, row, col) = INT_MAX; AGENT(buff_prev, FOOD, row, col) = 0; AGENT(buff_prev, EXPLORE, row, col) = 0; difuse_default(buff, ENEMY_HILL, row, col, I); } else if (pos == '0') { /* my hill */ AGENT(buff_prev, MY_HILL, row, col) = INT_MAX; AGENT(buff_prev, EXPLORE, row, col) = 0; } else if (isdigit(pos) || isupper(pos)) { /* enemy hill */ AGENT(buff_prev, ENEMY_HILL, row, col) = INT_MAX; } else if (isalnum(pos)) { /* enemy */ AGENT(buff_prev, ENEMY, row, col) = INT_MAX; AGENT(buff_prev, ALLY, row, col) = INT_MIN; } else { for (i = 0; i < NUM_AGENTS; i++) difuse_default(buff, i, row, col, I); } }
static inline void dump_last_seen(struct game_info *I) { int row, col; int buff = turn % 2; int buff_next = (turn+1) % 2; DBG("last_seen\n"); for (row=0; row < I->rows; row++) { for (col=0; col < I->cols; col++) { char *beg = "\033[0m"; int v = _last_seen[mkindex(row, col, I)]; if (MAP(mkindex(row, col, I)) == '*') beg = "\033[30;42m"; else if (MAP(mkindex(row, col, I)) == 'a') beg = "\033[30;47m"; else if (MAP(mkindex(row, col, I)) == 'A') beg = "\033[30;47m"; else if (MAP(mkindex(row, col, I)) == '0') beg = "\033[30;47m"; else if (MAP(mkindex(row, col, I)) == '%') beg = "\033[44m"; else if (isalnum(MAP(mkindex(row, col, I)))) beg = "\033[41m"; DBG("%s%5d\033[0m", beg, 10*v); } DBG("\n"); } DBG("\n"); }
/* * main entry point */ int main(int argc, char *argv[]) { if (argc < 2) usage(); mkindex(--argc, ++argv); return 0; }
void mark_seen(struct game_state *G, struct game_info *I) { int i, ant; for (ant = 0; ant < G->my_count; ant++) { int row = ANTS(ant).row, col = ANTS(ant).col; for (i=1; i < circle[0]; i+=2) { _last_seen[mkindex(row+circle[i], col+circle[i+1], I)] = turn; } } }
static inline void dump_agent(unsigned int agent, struct game_info *I) { int row, col; int buff = turn % 2; int buff_next = (turn+1) % 2; DBG("agent: %s\n", agent_string[agent]); if (agent >= NUM_AGENTS) return; for (row=0; row < I->rows; row++) { for (col=0; col < I->cols; col++) { char *beg = "\033[0m"; int v = agent_get(buff, agent, row, col, I); if (MAP(mkindex(row, col, I)) == '*') beg = "\033[30;42m"; else if (MAP(mkindex(row, col, I)) == 'a') beg = "\033[30;47m"; else if (MAP(mkindex(row, col, I)) == 'A') beg = "\033[30;47m"; else if (MAP(mkindex(row, col, I)) == '0') beg = "\033[30;47m"; else if (MAP(mkindex(row, col, I)) == '%') beg = "\033[44m"; else if (isalnum(MAP(mkindex(row, col, I)))) beg = "\033[41m"; DBG("%s%5.2f\033[0m", beg, (double)v / INT_MAX); } DBG("\n"); } DBG("\n"); }