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;
}
↧