void self_go(char *filename, char *weightfile, char *f2, char *w2, int multi) { network net = parse_network_cfg(filename); if(weightfile){ load_weights(&net, weightfile); } network net2 = net; if(f2){ net2 = parse_network_cfg(f2); if(w2){ load_weights(&net2, w2); } } srand(time(0)); char boards[300][93]; int count = 0; set_batch_network(&net, 1); set_batch_network(&net2, 1); float *board = calloc(19*19, sizeof(float)); char *one = calloc(91, sizeof(char)); char *two = calloc(91, sizeof(char)); int done = 0; int player = 1; int p1 = 0; int p2 = 0; int total = 0; while(1){ if (done || count >= 300){ float score = score_game(board); int i = (score > 0)? 0 : 1; if((score > 0) == (total%2==0)) ++p1; else ++p2; ++total; fprintf(stderr, "Total: %d, Player 1: %f, Player 2: %f\n", total, (float)p1/total, (float)p2/total); int j; for(; i < count; i += 2){ for(j = 0; j < 93; ++j){ printf("%c", boards[i][j]); } printf("\n"); } memset(board, 0, 19*19*sizeof(float)); player = 1; done = 0; count = 0; fflush(stdout); fflush(stderr); } //print_board(board, 1, 0); //sleep(1); network use = ((total%2==0) == (player==1)) ? net : net2; int index = generate_move(use, player, board, multi, .1, .7, two, 0); if(index < 0){ done = 1; continue; } int row = index / 19; int col = index % 19; char *swap = two; two = one; one = swap; if(player < 0) flip_board(board); boards[count][0] = row; boards[count][1] = col; board_to_string(boards[count] + 2, board); if(player < 0) flip_board(board); ++count; move_go(board, player, row, col); board_to_string(one, board); player = -player; } }
/* * Play a number of training games. */ int main(int argc, char *argv[]) { game my_game; int i, j, n = 100; int num_players = 3; int expansion = 0, advanced = 0, promo = 0; char buf[1024], *names[MAX_PLAYER]; double factor = 1.0; /* Set random seed */ my_game.random_seed = time(NULL); /* Read card database */ if (read_cards(NULL) < 0) { /* Exit */ exit(1); } /* Parse arguments */ for (i = 1; i < argc; i++) { /* Check for verbosity */ if (!strcmp(argv[i], "-v")) { /* Set verbose flag */ verbose++; } /* Check for number of players */ else if (!strcmp(argv[i], "-p")) { /* Set number of players */ num_players = atoi(argv[++i]); } /* Check for advanced game */ else if (!strcmp(argv[i], "-a")) { /* Set advanced flag */ advanced = 1; } /* Check for expansion level */ else if (!strcmp(argv[i], "-e")) { /* Set expansion level */ expansion = atoi(argv[++i]); } /* Check for promo cards */ else if (!strcmp(argv[i], "-o")) { /* Set promo cards */ promo = 1; } /* Check for number of games */ else if (!strcmp(argv[i], "-n")) { /* Set number of games */ n = atoi(argv[++i]); } /* Check for random seed */ else if (!strcmp(argv[i], "-r")) { /* Set random seed */ my_game.random_seed = atoi(argv[++i]); } /* Check for alpha factor */ else if (!strcmp(argv[i], "-f")) { /* Set factor */ factor = atof(argv[++i]); } } /* Set number of players */ my_game.num_players = num_players; /* Set expansion level */ my_game.expanded = expansion; /* Set advanced flag */ my_game.advanced = advanced; /* Set promo flag */ my_game.promo = promo; /* Assume no options disabled */ my_game.goal_disabled = 0; my_game.takeover_disabled = 0; /* No campaign selected */ my_game.camp = NULL; /* Call initialization functions */ for (i = 0; i < num_players; i++) { /* Create player name */ sprintf(buf, "Player %d", i); /* Set player name */ my_game.p[i].name = strdup(buf); names[i] = my_game.p[i].name; /* Set player interfaces to AI functions */ my_game.p[i].control = &ai_func; /* Initialize AI */ my_game.p[i].control->init(&my_game, i, factor); /* Create choice log for player */ my_game.p[i].choice_log = (int *)malloc(sizeof(int) * 4096); /* Clear choice log size and position */ my_game.p[i].choice_size = 0; my_game.p[i].choice_pos = 0; } /* Play a number of games */ for (i = 0; i < n; i++) { /* Initialize game */ init_game(&my_game); printf("Start seed: %u\n", my_game.start_seed); /* Begin game */ begin_game(&my_game); /* Play game rounds until finished */ while (game_round(&my_game)); /* Score game */ score_game(&my_game); /* Print result */ for (j = 0; j < num_players; j++) { /* Print score */ printf("%s: %d\n", my_game.p[j].name, my_game.p[j].end_vp); } /* Declare winner */ declare_winner(&my_game); /* Call player game over functions */ for (j = 0; j < num_players; j++) { /* Call game over function */ my_game.p[j].control->game_over(&my_game, j); /* Clear choice log */ my_game.p[j].choice_size = 0; my_game.p[j].choice_pos = 0; } /* Reset player names */ for (j = 0; j < num_players; j++) { /* Reset name */ my_game.p[j].name = names[j]; } } /* Call interface shutdown functions */ for (i = 0; i < num_players; i++) { /* Call shutdown function */ my_game.p[i].control->shutdown(&my_game, i); } /* Done */ return 0; }