Jump to content

Jogo da Velha ou Galo, saber se ganha


jonhhy

Recommended Posts

Boa noite,

estou a fazer o código para verificar se ganha o jogo do Galo ou da Velha (como se chama lá no Brasil)
 

/*
xxx x** **x acontece quando: "ganha = 0 if( i==j ^^ v[i][j]= || ) then ganha=1"
*** x** *x*
*** x** x**
ganha se tiver uma linha ou coluna ou diagonal completa

linha (i) linha = 1 for(j=0;j < DIM;j++) 
coluna 
diagonal
*/
int linha(char m[DIM][DIM]){ //same symbol
    for (int i=0; i<DIM;i++){
        int counter=0;
        char ch=m[i][0];
        for(int j = 0; j<DIM; j++){
          // int // X O X  != ESPAÇO ^^
          if(m[i][j]==ch){
            counter++;
            if(counter == 3){
                puts("Vitória Horizontal!");
                return 1;
            } 
          }
        }
    }
    puts("NL");
    return 0;
}

int diagonal(char m[DIM][DIM]){
    int counter,i=0;
    char ch=m[i][0];     
    for (int j=0; i<DIM;i++,j++){
        if(m[i][j]==ch){
            counter++;
            if(counter == 3){
                puts("Vitória Diagonal!");
                return 1;
            } 
        }
    }
    puts("NB");
    return 0;
}

int coluna(char m[DIM][DIM]){ //same symbol
    for (int j=0; j<DIM;j++){
        int counter=0;
        char ch=m[0][j];
        for(int i = 0; j<DIM; i++){
          // int // X O X  != ESPAÇO ^^
          if(m[i][j]==ch){
            counter++;
            if(counter == 3){
                printf("Vitória Vertical!\n");
                return 1;
            } 
          }
        }
    }
    puts("NV");
    return 0;
}

int ganha(char m[DIM][DIM]){
        return linha(m) || coluna(m) || diagonal(m);
}

A questão é que não dá erros mas mal faço a primeira jogada, diz que ganha.

<script src="//onlinegdb.com/embed/js/B1S6lJL9v?theme=dark"></script>
código completo

 

 

já agora existe alguma parte do fórum onde podemos partilhar resoluções de exercícios?
Fiz a da transf. em matrix composta funciona e esta diferente da sol. do livro e gostava de a partilhar e saber a opinião de programadores + experientes.

Grato pela vossa atenção, 
cumprimentos
 

Edited by jonhhy
Link to comment
Share on other sites

Olá jonhhy,

O facto de dizer que ganha é precisamente o que o @maluco-123 disse:  nas tuas funções de verificar vitória (linha, coluna e diagonal), estás a contar o caractere independentemente de ser espaço ou um caractere de jogador ('X' ou '0'). No início o array está todo inicializado com espaços o que faz o teu contador incrementar até 3.

Aproveito e ficam aqui outras observações:

Tens um erro na função coluna na condição do ciclo for mais interior. Os i's e os j's são tramados às vezes 😛

Na função diagonal só estás a verificar na diagonal principal (aka: \), tens que verificar também a outra diagonal (/).

Na função diagonal não estás a inicializar a variável counter. Provavelmente tens a ideia que ao atribuires um valor à ultima variável numa linha com múltiplas variáveis declaradas estás a atribuir esse valor a todas as variáveis nessa linha, o que é errado. Isto é um erro comum, ao qual costumo aconselhar a declarar uma variável por linha para evitar este tipo de erros.
E.g.:

// Em vez de
int counter, i = 0;
// Escreveres assim, caso queiras inicializar ambos a 0
int count = 0;
int i = 0;



Sobre o partilhar resoluções também não sei porque acabei de registar-me neste forum 😄  

Mas sobre a transposta, parece-me bem. Está simples e claro. Se quiseres um exercício tenta fazer o mesmo, mas sem usares o if-else.

Dica: se tiveres que pensar muito provavelmente está errado

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.