Quantcast
Channel: Tópicos
Viewing all articles
Browse latest Browse all 11336

Função para verificar vitória em jogo

$
0
0
Tentei colocar o código a funcionar, mas algo nas funções de verificar as vitórias que não está a funcionar! Alguém me ajuda a identificar? O problema é que quando existe um vencedor, por alguma razão, é sempre o Jogador 2 e também acontece que nem sempre #include <stdio.h> #include <stdlib.h> #include <string.h> #define CLEAR_INPUT while(getchar() != '\n') /*void*/ #define UM 1 #define DOIS 5 #define TRES 9 void MostraTabuleiro(char* ptabuleiro){ for(int i = 0; i < 3; i++){ for(int j = 0; j < 11; j++){ printf("%c", ptabuleiro[j + i * 11]); } putchar('\n'); } } char* AlocaMemoriaTabuleiro(char* tabuleiro){ if( ( tabuleiro = malloc( sizeof(char) * 3 * sizeof(char)* 11 + 1) ) == NULL ){ printf("Memory error!\n"); exit(-1); } return tabuleiro; } void PedeCoord(int* pcx, int* pcy){ int ok = 0; printf("Insira as coordenadas <x y>:\n"); while(ok != 2){ ok = scanf(" %d %d", pcx, pcy); if( (*pcx - 1 < 0) || (*pcx - 1 > 2) || (*pcy - 1 < 0) || (*pcy - 1 > 2) || ok != 2 ){ printf("Coordenadas inválidas! Tente de novo:\n"); ok = 0; }else if(*pcy == 2 ){ (*pcx)--; *pcy = 5; } else if(*pcy == 3){ (*pcx)--; *pcy = 9; }else (*pcx)--; } } int ActualizaTabuleiro(int* px, int* py, char* ptabuleiro, const char psim){ if( ptabuleiro[*py + (*px) * 11] == '_' ? 1 : 0 ){//se caractér da posição for igual a '_', posição está livre ptabuleiro[*py + (*px) * 11] = psim; return 1; }else{ printf("Posição ocupada!\n"); return 0; } } void ResetTabuleiro(char* ptabuleiro){ for(int i = 0; i < 3; i++) for(int j = 0; j < 11; j++) ptabuleiro[j + i * 11] = (j + 1) % 4 ? '_' : '|'; } int VerificaHorizontal(char* ptabuleiro){ for(int i = 0; i < 3; i++){ if( ptabuleiro[i * 11 + UM] == ptabuleiro[i * 11 + DOIS] && ptabuleiro[i * 11 + UM] == ptabuleiro[i * 11 + TRES] && ptabuleiro[i * 11 + UM] != '_') return ptabuleiro[i * 11 + UM] == 'X' ? -1 : 1; } return 0; } int VerificaVertical(char* ptabuleiro){ for(int i = UM; i < TRES; ){ if( ptabuleiro[0 * 11 + i] == ptabuleiro[1 * 11 + i] && ptabuleiro[0 * 11 + i] == ptabuleiro[2 * 11 + i] && ptabuleiro[0 * 11 + i] != '_') return ptabuleiro[0 * 11 + i] == 'X' ? -1 : 1; i = i == UM ? DOIS : (i == DOIS ? TRES : TRES + 1); } return 0; } int VerificaDiagonal(char* ptabuleiro){ if( ptabuleiro[0 * 11 + UM] == ptabuleiro[1 * 11 + DOIS] && ptabuleiro[0 * 11 + UM] == ptabuleiro[2 * 11 + TRES] && ptabuleiro[0 * 11 + UM] != '_') return ptabuleiro[0 * 11 + UM] == 'X' ? -1 : 1; if( ptabuleiro[0 * 11 + TRES] == ptabuleiro[1 * 11 + DOIS] && ptabuleiro[0 * 11 + TRES] == ptabuleiro[2 * 11 + UM] && ptabuleiro[0 * 11 + TRES] != '_') return ptabuleiro[0 * 11 + UM] == 'X' ? -1 : 1; return 0; } int VerificaVitoria(char* ptabuleiro){ int resultado = VerificaHorizontal(ptabuleiro) || VerificaVertical( ptabuleiro) || VerificaDiagonal( ptabuleiro); if(resultado){ printf("Resultado: %d\n", resultado);//<------Está a retornar sempre 1, quando devia também retornar -1 return resultado; } //procura espaços vazios for(int i = 0; i < 3; i++) for(int j = 0; j < 11; ){ if(ptabuleiro[i * 11 + j] == '_') return -2; j = j == UM ? DOIS : (j == DOIS ? TRES : TRES + 1); } //empate return 0; } int Jogar2Jogadores(int* pcx, int* pcy, char* ptabuleiro){ char psim = 'X'; int jogador = 0, res, ok; printf("Jogador 1:\n"); while(1){ ok = VerificaVitoria(ptabuleiro); //printf("Verifica Vitória: %d\n", ok); switch(ok){ //Não há vencedores e ainda há posições vazias case -2: PedeCoord(pcx, pcy); res = ActualizaTabuleiro(pcx, pcy, ptabuleiro, psim); //printf("Actualiza Tabuleiro: %d\n", res); if(res){ jogador ^= 1; //printf("Jogador: %d\n", !jogador); psim = !jogador ? 'X' : '0'; //printf("Símbolo: %c\n", psim); MostraTabuleiro(ptabuleiro); printf("Vez: Jogador %d\n", jogador ? 2 : 1); } break; case -1: printf("Jodador 1 é o vencedor!\n"); return 0; case 0: printf("Jogo empatado!\n"); return 0; case 1: printf("Jogador 2 é o vencedor!\n"); return 0; default: printf("Erro desconhecido!\n"); free(ptabuleiro); exit(-1); } } } int main(void){ char* tabuleiro = NULL; int cx, cy; tabuleiro = AlocaMemoriaTabuleiro(tabuleiro); ResetTabuleiro(tabuleiro); Jogar2Jogadores(&cx,&cy, tabuleiro); free(tabuleiro); return 0; }

Viewing all articles
Browse latest Browse all 11336

Trending Articles