예제 #1
0
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;
    }
}
예제 #2
0
/*
 * 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;
}