• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JemanPT

Dúvidas no Jogo do Galo

16 mensagens neste tópico

Viva,

Estou no 1º ano de Engenharia Multimédia e estou a desenvolver o jogo do galo... há semanas (sou iniciante) para apresentar no diia 15 de Janeiro. O jogo já está a bulir, mas não consigo pôr a imprimir a ensagem quando o jogador introduz uma casa já ocupada

void Jogador1()
{
    //declaração e inicializacao das variaveis para os dados do jogador 1
int x, y;
do
    {
	do
        {
	    printf("\n\n j1, introduza a linha e a coluna: ");
	    scanf("%d %d", &x, &y);
        }
    while(x<=1 && x>=4);
    	x--; y--; //porque os indices começam a 0
    	/*if(matrix[x][y]!=' ')
              matrix[x][y] = 'X';
          else
              printf("\n Posicao ja ocupada");*/
    }
    while(matrix[x][y]!=' ');
        matrix[x][y] = 'X';
}

Outra coisa que queria era pôr os nommes dos jogador, ma está a dar erro...

main()
{
     printf("\n***************************************\n");
     printf("**             Jogo do Galo          **\n");
     printf("***************************************\n");

/* char n1, n2;
     printf("\n\nNome do jogador 1: ");
     scanf("%c", &n1);
     printf("Nome do jogador 2: ");
     scanf("%c", &n2);
void Jogador1 = n1;
void Jogador2 = n2; */

    int Vencedor = ' '; /* perim...

Podem-me dar umas dicas? Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Da mesma forma que verificas se a casa que se pretende alterar já está ou não preenchida no while, basta-te alterar o if que tens comentado para:

if(matrix[x][y]!=' ')
    printf("\n Posicao ja ocupada");

Quanto ao nome tens que enviar o nome por parametro (para isso tens que alterar a função) para a função de jogador ou declarar os nomes como variável global. Outra opção seria o nome aparecer antes de chamares a função do jogador.

Já agora o que pretendias fazer com

void Jogador1 = n1;
void Jogador2 = n2; 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois... isso do if, por acaso já o tinha feito, mas não deu resultado... qd o faço, aparece a mensgem em todas as jogadas; devo estar a oôr no sitio errado (achp q n, mas  :wallbash:)

char n1, n2;
void Jogador1()
{
    //declaração e inicializacao das variaveis para os dados do jogador 1
int x, y;
do
    {
	do
        {
	    printf("\n\n %c, introduza a linha e a coluna: ", &n1);
	    scanf("%d %d", &x, &y);
        }
    while(x<=1 && x>=4);
    	x--; y--; //porque os indices começam a 0
    }
    while(matrix[x][y]!=' ');
    matrix[x][y] = 'X';
   if(matrix[x][y]!=' ')
            printf("\n Posicao ja ocupada");
}

Relativamente ao nome... deve ser do sono pq não  estou a conseguir

main()
{
     printf("\n***************************************\n");
     printf("**             Jogo do Galo          **\n");
     printf("***************************************\n");

     printf("\n\nNome do jogador 1: ");
     scanf("%c", &n1);
     printf("Nome do jogador 2: ");
     scanf("%c", &n2);

    int Vencedor = ' '; /* perimite controlar se existe vencedor ou nao */
    inicializa_matriz();
do
{ 
        ...
}
while(Vencedor ==  ' ');
if(Vencedor=='X') 
        printf("\n\n j1, venceu o jogo! \n\n");
  	else 
      if (Vencedor=='0')
          printf("\n\n j2, venceu o jogo! \n\n");
  	else 
      printf("\n\n Empate! \n\n");
  	Vizualiza_Matriz();

void inicializa_matriz();
void Jogador1();
void Jogador2();
void Vizualiza_Matriz();
char Verifica_Vencedor();
char Empate();

  system("PAUSE");	
  return 0; 
}

Nem acredito que estou encalhado aqui... tá bem que andei semana para fazer o jogo, mas... é normal demorar tanto???

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Às vezes ficamos mesmo "cegos" ;) Acontece a todos, convem fazer umas pausas.

matrix[x][y] = 'X';
if(matrix[x][y]!=' ')
            printf("\n Posicao ja ocupada");

Tás a colocar o 'X' antes do if, por isso é natural que a posição (x,y) seja sempre X

Tens outro erro:

do {

    ...

}while(x<=1 && x>=4);

Cuidado com as condições! Tu queres repetir a leitura se  o X dado for menor que 1 ou maior que 3. Já agora... porque não validas também o Y ?

Em relação ao nome, tu tens variaveis char. Só consegues ler um caracter. Para leres uma string tens de usar um array de char's e ler com 

char nome[20];
scanf("%s" , nome );  // nome já é um apontador para a posição de memória onde queres o resultado. Não leva o & 

PS: Para postar o código coloca code=c na tag. Fica mais legivel.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que percebi a ideia seria que quando fosse detectada uma jogada inválida ele imprimisse para o ecrã uma mensagem de aviso e em seguida repetisse o pedido. Nesse caso o if teria que estar dentro do while, onde o tinhas no primeiro post por exemplo.

Para leres o nome tens que fazer o que o mogers já disse e declarar arrays de caracteres. Agora para ler o scanf não é o mais indicado porque só te vai ler até ao primeiro espaço. Podes tentar usar um gets por exemplo:

char n1[50];
gets(n1);

O problema do gets é que não há maneira de verificar se inseriste mais caracteres do que n1 aguenta. Podes usar fgets em vez de gets:

char n1[50];
fgets( n1, 50, stdin );

O que tens aqui é uma função que leva o array de caracteres que queres usar, o tamanho máximo de caracteres que queres que sejam inseridos no array (se inserires caracteres a mais ele simplesmente ignora-os) e a stream de onde vêm os caracteres que no teu caso fica stdin.

Com o 50 como limite máximo podes inserir 49 caracteres (tudo o resto é desprezado) ele reserva 1 para por o 0 que vai terminar a string.

Uma coisa é que ao contrário do gets o fgets inclui o caracter '\n' que é adicionado quando carregas em ENTER. Se não o quiseres terás que o retirar manualmente.

Embora já seja menos uma fonte de prováveis erros o fgets também tem os seus problemas. Se leres o valor null para a string quando a fores a imprimir ele vai pensar que a string termina aí. Mas no caso de leres algo escrito do teclado isso não deve acontecer. Terás é que ter cuidado se algum dia usares o fgets para ler de uma fonte que não controlas, como por exemplo um ficheiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Jesus Crist... só aqui já revi quase a mat toda e aprendi umas tanta novas. vcs sao uns optimos prof's.

Relatiivamente á condição, tirei a validação do Y pq nãp funcionava e não  :-[

while(x<=1 && x>=4 || y<=1 && y>=4);

Obrigado pelos ensinamentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas essa condição não está bem  ;)

Podes pensar em português normal. Tu queres repetir o ciclo se:

-> o  X não estiver no intervalo [1,3] ou o Y não estiver no intervalo [1,3]

isto é,

->  Se  (  Not ( X >= 1 e X <= 3 ) ou Not ( Y >= 1 e Y <= 3 ) )

ou seja:

while( ( !( x >= 1 && x <= 3 ) ) ||  ( ! ( y >= 1 && y <= 3 ) ) );

ou se preferires

->  Se  ( X < 1 ou X > 3 ) ou ( Y < 1 ou Y > 3 )

ou seja:

while( x < 1 || x > 3 ||  y < 1 || y > 3 );

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto.Já tem mais lógica.

se puseres o if, ele imprime a mensgem de erros em toda as jogada a partir da colocação do 3º "O"  :eek: :wallbash:

while( x < 1 || x > 3 ||  y < 1 || y > 3 );
//while(x<=1 && x>=4);
if(matrix[x][y]!=' ')
    printf("\n Posicao incorrecta ou ja ocupada! Jogue novamente.");
x--; y--; //porque os indices começam a 0

de resto, tudo a rolar como eu kerie... com menu e tudo  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O decremento das variaveis não devia ser antes do if ? O melhor é voltares a colar aí o teu código. Deve ser uma coisa pequena...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É claro que devia!  :wallbash:

O único erro que agora tem deve dizer respeito á condição...

O while é tipo repete até á condição ser V, ou seja, até para de serem introduzidos valores que não pertençam ao intervalo 1 e 3 certo? logo, não passa para o printf do erro e sim para o que pede a posição. já tetei subtituir o while com if, mas...

Tenho de chegar la porra.

té já

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não.

While - Repetir Enquanto.  Repete enquanto a condição for verdadeira. Ou seja, só repete o ciclo se a condição for falsa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto... se o jogador introduzir valores entre 1 e 3 (inclusive), ele sai do ciclo. Se é assim, é obvio que ele não me imprime a mensagem de erro, caso digite 1 e 4, por exemplo porque torna ao ciclo, ou seja, ao:

do
    {
		    printf("\n\n %s, introduza a linha e a coluna: ", n2);
		    scanf("%d %d", &x, &y);
            }

Já experimentei por

if(x<1||x>3||y<1||y>3)
    printf("\n Posicao incorrecta ou ja ocupada! Jogue novamente.");

dentro do ciclo, mas nada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a por esse if dentro do while que valida se as posições estão ou não correctas? Assim devia funcionar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

void Jogador2()
{
    //declaração e inicializacao das variaveis para os dados do jogador 1
int x, y;
        do
    {
    	do
	    {
		    printf("\n\n %s, introduza a linha e a coluna: ", n2);
		    scanf("%d %d", &x, &y);
//JÁ PUS AQUI
            }
            while(x<1||x>3||y<1||y>3);
//JÁ PUS AQUI
            //while(x<=1 && x>=4);
            x--; y--; //porque os indices começam a 0
//JÁ PUS AQU
            if(matrix[x][y]!=' ')
                printf("\n Posicao incorrecta ou ja ocupada! Jogue novamente.");
            
        }
        while(matrix[x][y]!=' ');
//JÁ PUS AQUI
        matrix[x][y] = 'O';
}

:fartnew2:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epah é estranho não ter funcionado no primeiro sítio que disseste que puseste.

Eu fiz um pequeno teste e funciona. Só alterei os printfs para distinguir as situações e eliminei os comentários. Mas funcionou. Vê se era assim que estavas a fazer.

void Jogador2()
{
    //declaração e inicializacao das variaveis para os dados do jogador 1
int x, y;
        do
    {
    	do
	    {
		    printf("\n\n %s, introduza a linha e a coluna: ", n2);
		    scanf("%d %d", &x, &y);
                            if(x<1||x>3||y<1||y>3)
                                 printf("\n Posicao incorrecta! Jogue novamente.");
            }
            while(x<1||x>3||y<1||y>3);

            x--; y--; //porque os indices começam a 0
            if(matrix[x][y]!=' ')
                printf("\n Posicao ja ocupada! Jogue novamente.");

        }
        while(matrix[x][y]!=' ');
        matrix[x][y] = 'O';
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais, UM BOM 2008.

Relativamente ao jogo, já funciona... desta vez não consegui aproveitar para aprender, pois não sei o que tinha mal; tenho a certeza que já tinha posto o if dentro do ciclo e não funcionou... talvez me teha esquecido de desactivado algum outro codigo  :hmm:

Mais uma vez, obrigado pelos esinamentos e um bom 2008.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora