jonhhy Posted November 21, 2020 at 12:40 AM Report Share #620273 Posted November 21, 2020 at 12:40 AM (edited) 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 November 21, 2020 at 12:41 AM by jonhhy Link to comment Share on other sites More sharing options...
maluco-123 Posted November 21, 2020 at 12:31 PM Report Share #620283 Posted November 21, 2020 at 12:31 PM Boas, Assim de repente, parece que não estás a verificar se o "char" vencedor é válido, isto é, 'x' ou 'o'. A vitória parece ser do ESPAÇO. Link to comment Share on other sites More sharing options...
rbsrbs_dev Posted November 21, 2020 at 09:16 PM Report Share #620286 Posted November 21, 2020 at 09:16 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now