Jump to content

Dúvidas no Jogo do Galo


JemanPT

Recommended Posts

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

Link to comment
Share on other 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; 

Criar é Divertido

Link to comment
Share on other 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

Link to comment
Share on other 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.

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other 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.

Criar é Divertido

Link to comment
Share on other 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 );

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other 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"  ? :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  😉

Link to comment
Share on other 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...

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other 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á

Link to comment
Share on other 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.

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other 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

Link to comment
Share on other 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:

Link to comment
Share on other 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';
}

Criar é Divertido

Link to comment
Share on other 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  ?

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

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.