Jogo da Velha , erro na função diagonal [RESOLVIDO]

1. Jogo da Velha , erro na função diagonal [RESOLVIDO]

Marco Brainiac
mbrainiac

(usa Debian)

Enviado em 08/08/2015 - 18:03h

Ex 11 cap 6 do Dammas;

coloquei:
int diagonal(char g[DIM][DIM], char ch)
{
return (g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] && g[0][0] == ch) || (g[0]g[2] == g[1][1] && g[2]g[0] == g[1][1] && g[0][2]== ch);
}

Mas no livro está:

int diagonal(char g[DIM][DIM], char ch)
{
return (g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] && g[0][0] == ch) || (g[0]g[2] == g[1][1] && g[2]g[0] == g[1][1] && g[0][2]== ch);
}

a do livro
/* return (g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] & g[0][0] == ch) || (g[0]g[2] == g[1][1] && g[2]g[0] == g[1][1] & g[0][2]== ch); */


tentei com ambas e nada e nã ocompreendi também a esse '&&' e o '&'
Achava que o and seria apenas '&&'

/* pg162 ex4 cap 6*/
#include<stdio.h>

#define DIM 3
#define ESPACO ' '


void inic(char s[][DIM]);
void mostra(char s[DIM][DIM]);

int ganhou(char g[DIM][DIM], char ch);
int linha(char v[], char c);
int coluna(char g[DIM][DIM], int col, char ch);

int diagonal(char g[DIM][DIM], char ch);


/* Inicia tabuleiro*/
void inic(char s[][DIM])
{
int i,j;

for(i =0; i < DIM; i++)
for(j = 0; j < DIM; j++)
s[i][j] = ESPACO;

}

/*Mostra aspecto do tabuleiro*/
void mostra(char s[DIM][DIM])
{
int i, j;

for(i =0; i < DIM; i++)
{
for(j = 0; j < DIM; j++)
printf("%c %c ",s[i][j], j == DIM - 1?' ': '|');
if(i != DIM-1)
printf("\n-------------");
putchar('\n');
}


}

/*Verifica se n-ésima linha est'preenchida com o char c */
int linha(char v[], char c)
{
return v[0] == v[1] && v[1] == v[2] && v[0] == c;

}

/*VErifica se a coluna col está toda prenchida com char '*' */
int coluna(char g[DIM][DIM], int col, char ch)
{
return g[0][col] == g[1][col] && g[1][col] == g[2][col] && g[0][col] == ch;

}

/*Verifica se alguma das diagonais está preenchida totalmente
com o char c*/
int diagonal(char g[DIM][DIM], char ch)
{
return (g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] && g[0][0] == ch) || (g[0]g[2] == g[1][1] && g[2]g[0] == g[1][1] && g[0][2]== ch);
}

/* Verifica se o jogador so caractere ch ganhou o jogo*/
int ganhou(char g[DIM][DIM], char ch)
{
if(linha(g[0], ch) || linha(g[1], ch) || linha(g[2], ch))
return 1;
if(coluna(g,0, ch) || coluna(g,1, ch) || coluna(g,2, ch))
return 1;
if(diagonal(g, ch))
return 1;

return 0; /* Não ganhou o jogo*/

}


main()
{
char velha[DIM][DIM];
int posx, posy;
char ch = '0'; /* caractere a jogar*/
int n_jogadas = 0;


inic(velha);
while(1) /* Laço infinito*/
{
mostra(velha);
printf("\n Introduza a Posição de jogo Linha Coluna :");
scanf("%d %d", &posx, &posy);
if(posx > DIM || posy > DIM)
{
printf("n\\n ***** Valores Inválidos *****\n\n");
continue; /* Próxima iteração*/
}
posx--, posy--; /* Os indices do vetor começam do zero */
if(velha[posx][posy] == ESPACO) /* casa livre */
{
velha[posx][posy] = ch = (ch == '0') ? 'x' : '0';
n_jogadas ++;
if(ganhou(velha,ch)) /* Basta verificar o jogador corrente*/
{
printf("\n\n **** Ganhou o jogador %c ****\n\n",ch);
break;
}
else
printf("Posição já ocupada\n Jogue novamente !!!\n");
if(n_jogadas == DIM * DIM)
{
printf(" \n\n **** EMPATE TÉCNICO ****\n\n");
break; /* Acabar o Laço */
}
}
mostrar(velha);


}
return 0;
}


erro:

com
int diagonal(char g[DIM][DIM], char ch)
{
return (g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] && g[0][0] == ch) || (g[0]g[2] == g[1][1] && g[2]g[0] == g[1][1] && g[0][2]== ch);
}

brainiac@hotpc:~/C_programas$ gcc damas0611.c -o damas0611.x
damas0611.c: In function ‘diagonal’:
damas0611.c:64:18: warning: comparison between pointer and integer [enabled by default]
damas0611.c:64:25: error: expected ‘)’ before ‘g’
damas0611.c:64:80: error: expected ‘)’ before ‘g’
brainiac@hotpc:~/C_programas$ clear


erro com
nt diagonal(char g[DIM][DIM], char ch)
{
return (g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] & g[0][0] == ch) || (g[0]g[2] == g[1][1] && g[2]g[0] == g[1][1] & g[0][2]== ch);
}
brainiac@hotpc:~/C_programas$ gcc damas0611.c -o damas0611.x
damas0611.c: In function ‘diagonal’:
damas0611.c:64:18: warning: comparison between pointer and integer [enabled by default]
damas0611.c:64:25: error: expected ‘)’ before ‘g’
damas0611.c:64:79: error: expected ‘)’ before ‘g’








  


2. MELHOR RESPOSTA

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 08/08/2015 - 19:07h

Ah sim, quanto ao seu erro, é o seguinte:
observe na linha 63, na função diagonal(), você colocou um 'g' a mais na parte g[2][2] == g[1]g[1]
Está em negrito o erro.


3. Re: Jogo da Velha , erro na função diagonal [RESOLVIDO]

Marco Brainiac
mbrainiac

(usa Debian)

Enviado em 08/08/2015 - 20:14h

SamL escreveu:

 return (g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] & g[0][0] == ch) || (g[0]g[2] == g[1][1] && g[2]g[0] == g[1][1] & g[0][2]== ch);  


O & aqui significa que está executando uma operação bit a bit, no caso um 'and' bit a bit. Tipo, 1 & 1 é 1, 1 & 4 é 5, veja aqui 1 em binário é 001 e 4 em binário é 100, o que o & faz é comparar cada bit da esquerda para direita com cada bit do outro operando, nessa última operação seria o mesmo que fazer assim:
1 & 4 =>
0 & 1 = 1 (primeiro bit)
0 & 0 = 0 (segundo bit)
1 & 0 = 1 (terceiro bit)
Do primeiro ao terceiro tem-se 101 que em decimal é 5. Eu coloquei o primeiro bit aqui como o mais alto só pra exemplificar, mas na prática é contado da direita para esquerda.

Só que no código acima você poderia tranquilamente trocar o & por &&, pois veja:
A parte g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] vai dar um valor booleano (0 ou 1)
A parte seguinte g[0][0] == ch vai dar outro valor booleano (0 ou 1)
Em seguinda será executado o &, vamos supor que as duas partes deram 1 cada uma, então 1 & 1 = 1


Muito obrigado SamL, Não iria desempacar tão cedo!






4. Re: Jogo da Velha , erro na função diagonal [RESOLVIDO]

Marco Brainiac
mbrainiac

(usa Debian)

Enviado em 08/08/2015 - 20:17h

SamL escreveu:

 return (g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] & g[0][0] == ch) || (g[0]g[2] == g[1][1] && g[2]g[0] == g[1][1] & g[0][2]== ch);  


O & aqui significa que está executando uma operação bit a bit, no caso um 'and' bit a bit. Tipo, 1 & 1 é 1, 1 & 4 é 5, veja aqui 1 em binário é 001 e 4 em binário é 100, o que o & faz é comparar cada bit da esquerda para direita com cada bit do outro operando, nessa última operação seria o mesmo que fazer assim:
1 & 4 =>
0 & 1 = 1 (primeiro bit)
0 & 0 = 0 (segundo bit)
1 & 0 = 1 (terceiro bit)
Do primeiro ao terceiro tem-se 101 que em decimal é 5. Eu coloquei o primeiro bit aqui como o mais alto só pra exemplificar, mas na prática é contado da direita para esquerda.

Só que no código acima você poderia tranquilamente trocar o & por &&, pois veja:
A parte g[0][0] == g[1]g[1] && g[2][2] == g[1]g[1] vai dar um valor booleano (0 ou 1)
A parte seguinte g[0][0] == ch vai dar outro valor booleano (0 ou 1)
Em seguinda será executado o &, vamos supor que as duas partes deram 1 cada uma, então 1 & 1 = 1


Perfect!

Muito obrigado










Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts