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; }
/** 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]); } }
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; }
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; }
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; }
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; }
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); } } }
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; }
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; }
//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; }