Ejemplo n.º 1
0
int fourofakindpos (DATABASE * simulacao, int jog, int sametype,MAO jogadas[40], int count) { /*sametype: 1-> a última jogada foi um four of a kind 0: foi uma jogada de rank inferior */
    MAO temp = 0;
    int n,v, ind;
    int i = 0;
    int rank[13] = {0};
    separa_val(simulacao->mao[jog], rank);
    if(sametype != 0){
        i = (maior_carta_mao(simulacao->jogada) % 13) + 1;
    }
    for(; i < 13; i++)
        if(rank[i] == 4){
            jogadas[count] = 0;
            temp = add_carta(temp,0,i);
            temp = add_carta(temp,1,i);
            temp = add_carta(temp,2,i);
            temp = add_carta(temp,3,i);
            for(ind = 0; ind < 52;ind++){
                n = ind / 13;
                v = ind % 13;
                if(carta_existe(simulacao->mao[jog],n,v) && v != i){
                    jogadas[count] = add_carta(temp,n,v);
                    count++;
                }
            }
        }
    return count;
}
Ejemplo n.º 2
0
/**
Esta função tem como objetivo imprimir as cartas no tabuleiro.
Se a carta a apresentar se encontre na mão do jogador (mao toma o valor de 0 e o actual_jogador no estado for igual a 0),
e caso a carta seja selecionada é então adicionada ao highlight. Se já se encontrar no highlight, então é removida de lá.
Caso contrário, se a carta se encontrar na mão de um bot, é imprimido o verso de uma carta, caso contrário a carta já foi jogada por um bot logo é mostrada a carta correspondente.
@param path O path.
@param x Coordenada HTML.
@param y Coordenada HTML.
@param e O estado atual.
@param mao Número de um jogador.
@param naipe O naipe da carta (inteiro entre 0 e 3).
@param valor O valor da carta (inteiro entre 0 e 12).
*/
void imprime_carta(char *path, int x, int y, ESTADO e, int mao, int naipe, int valor) {
    char *suit = NAIPES;
    char *rank = VALORES;
    char script[10240];
    ESTADO novo = e;
    novo.card = 1;
    
    if (mao == 0 && e.actual_jogador == 0) {
        if (carta_existe (novo.highlight, naipe, valor)) {
            novo.highlight = rem_carta(novo.highlight, naipe, valor);
        }
        
        else {
            novo.highlight = add_carta(novo.highlight, naipe, valor);
        }
        
        sprintf(script, "%s?%s", SCRIPT, estado2str(novo));
        printf("<a xlink:href = \"%s\"><image x = \"%d\" y = \"%d\" height = \"110\" width = \"80\" xlink:href = \"%s/%c%c.svg\" /></a>\n", script, x, y, path, rank[valor], suit[naipe]);  
    }
    
    else {
        if (carta_existe(e.mao[1],naipe,valor) || carta_existe(e.mao[2],naipe,valor) || carta_existe(e.mao[3],naipe,valor))
            printf("<image x = \"%d\" y = \"%d\" height = \"110\" width = \"80\" xlink:href = \"%s/11C.png\" />\n", x, y, path);
        else printf("<image x = \"%d\" y = \"%d\" height = \"110\" width = \"80\" xlink:href = \"%s/%c%c.svg\" />\n", x, y, path, rank[valor], suit[naipe]);
    }
}
Ejemplo n.º 3
0
int fullhousepos (DATABASE * simulacao, int jog, int sametype, MAO jogadas[40], int count) {
    int rank[13] = {0};
    int rank2[13] = {0};
    int i = 0, v, n;
    int c = 0;
    MAO mao = simulacao->mao[jog], temp = 0;
    separa_val(mao, rank);
    if(sametype != 0){
        separa_val(simulacao->jogada, rank2);
        for(i = 0; i < 13; i++)
            if(rank2[i] == 3){
                ++i;
                break;
            }
    }
    for(; i < 13; i++){
        temp = 0;
        if(rank[i] > 2){
            for(n = 0; n < 4; n++)
                if(carta_existe(mao, n, i)){
                    temp = add_carta(temp,n,i);
            		c++;
                    if(c == 3){
                        c = 0;
                        n = 4;
                    }
                }
            for(v = 0; v < 13; v++)
                if(rank[v] > 1 && v != i){
                    jogadas[count] = temp;
                    for(n = 0; n<4; n++)
                        if(carta_existe(mao,n,v)){
                            jogadas[count] = add_carta(jogadas[count],n,v);
                            c++;
                            if(c == 2){
                                c = 0;
                                count++;
                                n = 4;
                            }
                        }
                }
        }
    }
    return count;
}
Ejemplo n.º 4
0
int jogadas1(DATABASE * simulacao, int jog, MAO jogadas[40]){
    int count = 0, n = 0, v,max;
    max = maior_carta_mao(simulacao->jogada);
    if(max == -1)
        v = 0;
    else{
        v = max % 13;
        n = max / 13;
    }
    for(; n<4; n++)
        if(carta_existe(simulacao->mao[jog],n,v)){
            jogadas[count] = add_carta(0,n,v);
            count++;
        }
    v++;
    for(; v < 13; v++)
        for(n= 0; n < 4; n++)
        	if(carta_existe(simulacao->mao[jog],n,v)){
            	jogadas[count] = add_carta(0,n,v);
            	count++;
            }
    count++;
    return count;
}
Ejemplo n.º 5
0
int jogadasN(DATABASE * simulacao, int jog, MAO jogadas [4][40], int nc){    int n, v = 0, i, temp_naipe[4]={0}, count = 0, a;
    MAO estado = simulacao->mao[jog];
    int max = maior_carta_mao(simulacao->jogada);
    if (max==-1) v=0;
    else v=max%13;
    for(; v < 13; v++){
        i = 0;
        for(n = 0; n < 4; n++)
            if(carta_existe(estado,n,v)){
                temp_naipe[i] =n;
                i++;
            }
        if(i >= (nc+1) && (v > max % 13 || temp_naipe[i - 1] > max / 13)){
            jogadas[nc][count] = 0;
            for(a = 0, i = i -1; a <= nc; i--, a++)
                jogadas[nc][count] = add_carta(jogadas[nc][count], temp_naipe[i], v);
            count++;
        }
    }
    jogadas[nc][count] = 0;
    count++;
    return count;
}
Ejemplo n.º 6
0
long long int straightflushpos (DATABASE * simulacao, int jog, int sametype,MAO jogadas[40], int count) {
    MAO temp = 0;
    int n=3;
    int c = 0;
    int naipe[4] = {0};
    separa_nap(simulacao->mao[jog], naipe);
    while(n>=0) {
        if(naipe[n]>4) {
            int v;
            for(v=12; v>=0; v--) {
                if(carta_existe(simulacao->mao[jog], n, v)) temp = add_carta(temp, n, v);
            }
             c = straightpos2(temp,simulacao,jog,sametype,jogadas,0);
            if(temp==0) n--;
            else {
                count += c;
                n = -1;
            }
        }
        else n--;
    }
    return count;
}
Ejemplo n.º 7
0
void simula_maos(DATABASE * data){
    int ind, jog;
    int i,n,v;
    int num[4] = {13,13,13,13};
    int flag = 0;
    MAO atribuir=0x000fffffffffffff;
    for(jog = 1; jog<4; jog++)
        data->mao[jog] = 0;
    
    for(ind = 0;ind < 52; ind ++){
        n = ind / 13;
        v = ind % 13;
        for(i = 0; i < 3; i++){
            if(carta_existe(data->usadas[i+1],n,v)){
                atribuir = rem_carta(atribuir, n, v);
                num[i]--;
            }
            else if(carta_existe(data->mao[0],n,v) ||carta_existe(data->usadas[0],n,v) )
                atribuir = rem_carta(atribuir, n, v);
        }
    }
    for (ind = 0; ind < 52 ; ind ++){
        n = ind / 13;
        v = ind % 13;
        if(carta_existe(atribuir,n,v)){
            do{
                flag = 0;
            	jog = rand()%3;
                if(num[jog] > 0){
                    data->mao[jog+1] = add_carta(data->mao[jog+1],n,v);
                    num[jog]--;
                    flag = 1;
                }
            }while(flag == 0);
        }
    }
}
Ejemplo n.º 8
0
long long int flushpos (DATABASE * simulacao, int jog, int sametype, MAO jogadas[40], int count) {
    int i = 0;
    int naipe[4] = {0};
    int max = 0;
    int c = 0;
    int v;
    MAO temp = simulacao->mao[jog];
    separa_nap(temp, naipe);
    if(sametype != 0){
        max= maior_carta_mao(simulacao->jogada);
        i = max / 13;
        if(naipe[i]>4){
            for(v = 12; v >= 0; v--)
                if (carta_existe(temp,i,v)){
                    if(v > max % 13){
                        jogadas[count] = add_carta(0,i,v);
                        c = 1;
                        for(v--; v >= 0; v--)
                            if(carta_existe(temp,i,v)){
                                jogadas[count] = add_carta(jogadas[count],i,v);
                                c++;
                                if(c == 5){
                                    c = 0;
                                    i++;
                                    count++;
                                    v = -1;
                                    break;
                                }
                            }
                    }
                	else
                        i++;
                }
        }
        else{
            i++;
        }
        for(; i< 4; i++){
            if(naipe[i] > 4){
                jogadas[count] = 0;
                for(v = 0; v < 13; v++){
                    if (carta_existe(temp,i,v)){
                        jogadas[count] = add_carta(jogadas[count],i,v);
                        c++;
                        if(c==5){
                            count++;
                            c = 0;
                            break;
                        }
                    }
                }
            }
        }
    }
    else{
        i = 0;
        while(i < 4){
            if(naipe[i]>4){
                c = 0;
                jogadas[count] = 0;
                for(v = 0; v < 13 && c < 5; v++)
                    if (carta_existe(temp,i,v)){
                        jogadas[count] = add_carta(jogadas[count],i,v);
                        c++;
                        if(c == 5){
                            c = 0;
                            i++;
                            count++;
                            break;
                        }
                    }
            }
            else
                i++;
        }
    }
    return count;
}
Ejemplo n.º 9
0
int straightpos2 (MAO mao, DATABASE * simulacao, int jog, int sametype, MAO jogadas[40], int count) {
    int c=0, n, v = 11, vn[2], i= 0,count2, maxi;
    int straights[15]={-1};
    int rank[13] = {0};
    int tempN[15] = {-1};
    separa_val(mao, rank);
    if(sametype != 0){
        atualizastraight(rank, simulacao->jogada, vn);
        v = vn[0] - 4;
        if(v < 0)
            v = 13 + v;
    }
    for(; v != 7; v = (v + 1) % 13){
        if(rank[v] > 0)
            c++;
        else
            c = 0;
        if(c == 5){
            if(sametype != 0){
                if(v > vn[0]){
                    v = v - 4;
                    if(v < 0)
                        v = 13 + v;
                    straights[i] = v;
                    i++;
                    c = 0;
                }
                else{
                    for(n = 3; n >= 0; n--)
                        if(carta_existe(simulacao->mao[jog],n,v))
                            break;
                    if(n > vn[1]){
                        tempN[i] = n;
                        v = v - 4;
                        if(v < 0)
                            v = 13 + v;
                        straights[i] = v;
                        i++;
                        c = 0;
                    }
                    else{
                        c = 0;
                    }
                }
            }
            else{
                v = v - 4;
                if(v < 0)
                    v = 13 + v;
                straights[i] = v;
                i++;
                c = 0;
            }
        }
    }
    if(i > 0)
        for(count2 = 0; count2 < i ; count2++){
            jogadas[count] = 0;
            for(v = straights[count2], maxi = straights[count2] + 4 ; v <= maxi; v++){
                if (v != maxi){
                    for(n = 0; n<4;n++)
                        if(carta_existe(simulacao->mao[jog],n,v)){
                            jogadas[count] = add_carta(jogadas[count],n,v);
                            n = 4;
                        }
                }
                else{
                    if(sametype != 0){
                        jogadas[count] = add_carta(jogadas[count], tempN[count2],v);
                        count++;
                    }
                    else{
                        for(n = 0; n<4;n++)
                            if(carta_existe(simulacao->mao[jog],n,v)){
                                jogadas[count] = add_carta(jogadas[count],n,v);
                                n = 4;
                                count++;
                            }
                    }
                }
            }
        }
    return count;
}
Ejemplo n.º 10
0
//se precisa de começar e tem mais 3's pode n ter nenhuma jogada e passa, daí os 4 passos
//jogadasN, vai sempre com o mm sametype, para1, 2 ou 3 cartas
int main(){
    char input[100];
    int flag = 0, i;
    int flag2[1] = {0};
    int flag3 = 0;
    char output[100];
    int n, v;
    int io_count = 0;
    int counter = 0;
    int jog = 3;
    int jog_temp = 0;
    int a = 0;
    MAO mao_temp = 0;
    MAO usadas_temp[3] = {0};
    MCtree temp;
    char mao[13][2];
    DATABASE data = {{0},0,0,0,{0},0};
    DATABASE simulacao;
    MCtree tree = NULL;
    clock_t start;
    memset(mao,0,26);
    srand(time(0));
    fgets(input, 100, stdin);
    while(input[0] != 'A'){
        switch(input[0]){
            case 'J':
                if(input[3] == 'A'){
                    if((flag3 != 0 )|| (carta_existe(data.mao[0],0,0))){
                        flag3 = 1;
                        start = clock();
                        if(data.firstplay == 0){
                            data.firstplay = 1;
                            for(jog_temp = jog_temp -1, counter = 0; counter <= jog_temp; counter++)
                                data.usadas[counter +(3-jog_temp)] = usadas_temp[counter];
                            if(usadas_temp[0] != 0)
                                data.firstplay = 2;
                        }
                        while(((clock()-start)/CLOCKS_PER_SEC) < 2.0){
                            simulacao = data;
                            while(flag == 0){
                                temp = treePolicy(tree, &simulacao, flag2);
                                flag = defaultPolicy(temp, &simulacao, flag2);
                                flag2[0] = 0;
                                a++;
                            }
                            flag = 0;
                        }
                        jog = 1;
                        if(data.firstplay != 2)
                            checkFirst(tree, &data);
                        temp = choosePlay(tree,&data);
                        if(temp != NULL)
                            convertejogstr(temp->estado,output);
                        else{
                            strcpy(output, "PASSO");
                        }
                        printf("%s\n", output);
                        if(output[0] != 'P')
                            fgets(input, 100, stdin);
                        else
                            input[0] = 'O';
                        if(input[0] == 'O'){
                            if(temp == NULL || temp->estado == 0){
                                data.passar++;
                                if(data.passar == 3){
                                    data.nc = 0;
                                    data.jogada = 0;
                                }
                            }
                            else{
                                data.passar = 0;
                                data.jogada = temp->estado;
                                data.nc = 0;
                                for(i = 0; i < 52; i++){
                                    n = i / 13;
                                    v = i % 13;
                                    if(carta_existe(temp->estado,n,v))
                                        data.nc++;
                                }
                                free_nodes(tree,temp);
                                tree = temp;
                                tree->prev = NULL;
                                data.usadas[0] = data.usadas[0] | tree-> estado;
                                data.mao[0] = (data.mao[0]) ^ (tree->estado);
                            }
                            
                        }
                        else if(input[0] == 'N'){
                            data.passar++;
                            if(data.passar == 3){
                                data.nc = 0;
                                data.jogada = 0;
                            }
                        }
                    }
                    else{
                        printf("PASSO\n");
                    }
                }
                else{
                    mao_temp = 0;
                    io_count = sscanf(input, JOGADA, &mao[0][0],&mao[0][1],&mao[1][0],&mao[1][1],&mao[2][0],&mao[2][1],&mao[3][0],&mao[3][1],&mao[4][0],&mao[4][1],&mao[5][0],&mao[5][1],&mao[6][0],&mao[6][1],&mao[7][0],&mao[7][1],&mao[8][0],&mao[8][1],&mao[9][0],&mao[9][1],&mao[10][0],&mao[10][1],&mao[11][0],&mao[11][1],&mao[12][0],&mao[12][1]);
                    for(i = 0; i < io_count/2; i++){
                        if(mao[i][0] >= '3' && mao[i][0] <='9')
                            v = mao[i][0] - '3';
                        else{
                            switch(mao[i][0]){
                                case '2':
                                    v = 12;
                                    break;
                                case 'A':
                                    v = 11;
                                    break;
                                case 'K':
                                    v = 10;
                                    break;
                                case 'Q':
                                    v = 9;
                                    break;
                                case 'J':
                                    v = 8;
                                    break;
                                case 'T':
                                    v = 7;
                                    break;
                            }
                        }
                        switch (mao[i][1]){
                            case 'D':
                                n = 0;
                                break;
                            case 'C':
                                n = 1;
                                break;
                            case 'H':
                                n = 2;
                                break;
                            case 'S':
                                n = 3;
                                break;
                        }
                        mao_temp = add_carta(mao_temp,n,v);
                    }
                    if(data.firstplay != 0){
                        jog = (jog + 1) % 4;
                        data.usadas[jog] = data.usadas[jog] | mao_temp;
                    }
                    else{
                        usadas_temp[jog_temp] = mao_temp;
                        jog_temp++;
                    }
                    data.jogada = mao_temp;
                    data.nc = i;
                    if(data.nc == 5)
                        data.nc = 4;
                    data.passar = 0;
                    flag3 = 1;
                }
                break;
            case 'P':
                if(flag3 != 0){
                    data.passar++;
                    if(data.firstplay == 0){
                        if(jog_temp != 0)
                            jog_temp++;
                    }
                    else{
                        jog = (jog + 1) % 4;
                    }
                    if(data.passar == 3){
                        data.nc = 0;
                        data.jogada = 0;
                    }
                }
                break;
            case 'M':
                sscanf(input, MAO_INICIAL, &mao[0][0],&mao[0][1],&mao[1][0],&mao[1][1],&mao[2][0],&mao[2][1],&mao[3][0],&mao[3][1],&mao[4][0],&mao[4][1],&mao[5][0],&mao[5][1],&mao[6][0],&mao[6][1],&mao[7][0],&mao[7][1],&mao[8][0],&mao[8][1],&mao[9][0],&mao[9][1],&mao[10][0],&mao[10][1],&mao[11][0],&mao[11][1],&mao[12][0],&mao[12][1]);
                for(i = 0; i < 13; i++){
                    if(mao[i][0] >= '3' && mao[i][0] <='9')
                        v = mao[i][0] - '3';
                    else{
                        switch(mao[i][0]){
                        	case '2':
                                v = 12;
                                break;
                            case 'A':
                                v = 11;
                                break;
                            case 'K':
                                v = 10;
                                break;
                            case 'Q':
                                v = 9;
                                break;
                            case 'J':
                                v = 8;
                                break;
                            case 'T':
                                v = 7;
                                break;
                        }
                    }
                    switch (mao[i][1]){
                        case 'D':
                            n = 0;
                            break;
                        case 'C':
                            n = 1;
                            break;
                        case 'H':
                            n = 2;
                            break;
                        case 'S':
                            n = 3;
                            break;
                    }
                    data.mao[0] = add_carta(data.mao[0],n,v);
                }
                tree = createTree(data.mao[0]);
                temp = tree;
                flag3 = 0;
                break;
            
        }
    	fgets(input, 100, stdin);
    }
    return 0;
}