void walls (int n, player_t * p1, player_t * p2) { Uint32 color; int (*v)[2]; int i,j; int index; int new_wall_p; if (graphicsp) color = SDL_MapRGB(screen->format, 50, 50, 50); /* Envia la cantidad de muros que habra */ write_cords (p1, n, 0); write_cords (p2, n, 0); new_wall_p = 1; while(n>0) { int i,j; if (!new_wall_p) { int c; int directions[][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}}; int di, dj; int d; c=0; do { d = (int)((float)rand() / RAND_MAX * 4); di = directions[d][0]; dj = directions[d][1]; directions[d][0] = -1; directions[d][0] = -1; c++; } while( c<20 && (i+di<0 || i+di >= N || j+dj<0 || j+dj >= N || map[i+di][j+dj] == 1 )); i += di; j += dj; if (c==20) new_wall_p = 1; else new_wall_p = (float)rand() / RAND_MAX >= WALL_P; } if (new_wall_p) { random_position (&i, &j); new_wall_p = 0; } draw_point (i, j, color); map[i][j]=1; write_cords (p1, i, j); write_cords (p2, i, j); n--; } }
// mix up characters in word by swapping letters string scramble(string word){ unsigned long size = word.size(); for (int i = 0; i < size; i++) { unsigned long temp_index = random_position(size); char temp = word[temp_index]; word[temp_index] = word[i]; word[i] = temp; } return word; }
/* Funcion principal del programa */ int main (int argc, char * argv[]) { player_t * player1; player_t * player2; int finishp; int p[2][2]; int opt; const char * progname1; const char * progname2; while ((opt = getopt(argc, argv, "bd:n:w:")) != -1) { switch (opt) { /* Establece el retraso entre movimiento y movimiento */ case 'd': delay = atoi (optarg); break; /* No usa SDL, solo recolecta estadisticsa. */ case 'b': graphicsp = 0; break; /* Numero de partidas para simular. */ case 'n': plays = atoi (optarg); break; /* Numero de particulas de muro */ case 'w': nwalls = atoi (optarg); break; default: /* '?' */ usage(); } } if (argc-optind < 2) usage(); progname1 = argv[optind++]; progname2 = argv[optind++]; if(graphicsp) { SDL_Init (SDL_INIT_VIDEO); SDL_WM_SetCaption ("AI Tron", NULL); screen = SDL_SetVideoMode(N * POINTSIZE, N * POINTSIZE, 32, SDL_HWSURFACE); if (screen == NULL) { fprintf (stderr, "El sistema no soporta esta resolucion.\n"); exit (-1); } } initialize_random(); player1 = create_player (progname1); player2 = create_player (progname2); for(current_play=0; current_play<plays; current_play++) { memset (map, 0, sizeof(map)); if (graphicsp) SDL_FillRect( screen, NULL, 0 ); random_position (&p[0][0], &p[0][1]); random_position (&p[1][0], &p[1][1]); prepare_player (player1, p[0][0], p[0][1]); prepare_player (player2, p[1][0], p[1][1]); write_cords (player1, p[1][0], p[1][1]); write_cords (player2, p[0][0], p[0][1]); walls(nwalls, player1, player2); /* Bucle principal */ finishp=0; while(!finishp) { SDL_Event event; draw_point (player1->i, player1->j, 255); draw_point (player2->i, player2->j, 65025); /* Lee los siguientes movimientos de cada bot */ read_cords (player1, &p[0][0], &p[0][1]); read_cords (player2, &p[1][0], &p[1][1]); /* Comprueba si alguien ha perdido */ finishp |= lossp (player1, p[0][0], p[0][1]); finishp |= lossp (player2, p[1][0], p[1][1]); if (!finishp && p[0][0]==p[1][0] && p[0][1]==p[1][1]) { player1->loses++; player2->loses++; finishp = 1; } /* Actualiza el mapa con los movimientos */ move (player1, p[0][0], p[0][1]); move (player2, p[1][0], p[1][1]); turns++; /* Informa del ultimo movimiento de cada bot al otro */ write_cords (player1, p[1][0], p[1][1]); write_cords (player2, p[0][0], p[0][1]); if (graphicsp) { /* Elimina procesos de la cola, y termina en caso de que el usuario lo haya solicitado. */ while( SDL_PollEvent( &event ) ){ if (event.type == SDL_QUIT) { plays = current_play; finishp = 1; } } SDL_Flip (screen); SDL_Delay (delay); } } finish_player (player1); finish_player (player2); } printf ("Resumen:\n"); printf (" %s: %d/%d\n", player1->name, plays - player1->loses, plays); printf (" %s: %d/%d\n", player2->name, plays - player2->loses, plays); printf ("\n"); printf ("Un total de %d turnos, %f turnos de media por partida.\n", turns, (float)turns/plays); close_player (player1); close_player (player2); finalize_random(); if (graphicsp) SDL_Quit (); return 0; }