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

Sion

Problema For (Actualizado o 1 Post!!)

12 mensagens neste tópico

Boas

Para nao fazer nova thread decidi editar este post, tem andado a continuar o meu jogo do galo (uma vez que e trabalho fim de ano, ja para esta quarta)

Surgiu-me com que nunca me tinha deparado antes lol.

Eu criei a estrutura for para correr o vector todo e preencher a primeira casa que puder com 'X' Se essa casa estiver vazia, assim que isso se verifique ele interrompe o duplo ciclo(for).

So que ja exprimeitei breaks e nao resulta. Se puderem ajudar agradecia

else 
     {
         for(a=0;a<3;a++)
         {
            for(b=0;b<3;b++)
            {
             if (jogo[a][b]=='-') // significa que a casa está vazia 
                  jogo[a][b]='X'; // se isto se verificase queria que o for fica-se interropido se nao vai encher o resto das casas
            }
        }
     }        

Cumps .

Thx

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tens cont = cont +2;

se fizers as contas 2 4 6 8 10.... cont nunca vai ser igual a 9...

ve se assim dá para ti:

          sair=player1(jogo,simb);
          tabelainicial(jogo);
           cont++;
           if(cont==9)                 //apesar do cont chegar aos 9 o ciclo continua ...
              sair=0;

          sair=player2(jogo,simb2);
          tabelainicial(jogo);
          cont++;
           if(cont==9)                 //apesar do cont chegar aos 9 o ciclo continua ...
          {
              sair=0;
            }
          

     

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

          sair=player1(jogo,simb);
          tabelainicial(jogo);
           cont++;
           if(cont==9)                 //apesar do cont chegar aos 9 o ciclo continua ...
              sair=0;

          sair=player2(jogo,simb2);
          tabelainicial(jogo);
          cont++;
           if(cont==9)                 //apesar do cont chegar aos 9 o ciclo continua ...
              sair=0;

Não precisas de ter cont = cont++ (Só estás a fazer duas atribuições, uma delas desnecessária)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tens cont = cont +2;

se fizers as contas 2 4 6 8 10.... cont nunca vai ser igual a 9...

Provavelmente tens razao, mas usar o cont++ , vai adicionar 1 valor a cada passada no ciclo so que em cada passada sao efectuadas !2 jogadas!, e assim o maximo de jogadas que o cont ia permitir eram 18  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

          if(cont>9)                 //cont>9? ^^
          {
              sair=0;
             }

?

Se contares 10 como 9, trabalha, cont>9 ^^"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esta é uma daquelas ocasiões em que o break dá jeito.

Pessoalmente não programava o jogo dessa forma, até porque nas funções player1 e player2 estás sem dúvida a repetir código. juntava as duas funções e, se fosse necessário, passava mais um argumento à função resultante a indicar qual era o jogador activo. Depois disto, chamava a função apenas uma vez por cada iteração do do {} while, o que finalmente iria simplificar a contagem das jogadas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas de ter cont = cont++ (Só estás a fazer duas atribuições, uma delas desnecessária)

Esqueci-me de tirar o "cont =" =P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma pequena sugestão, não sei se será a mais correcta, mas podes tentar assim...

//Vitoria como variavel global
int vitoria = 0; //0 = ninguem ganhou; 1= ganhou player 1; 2 = ganhou player 2;

//Funções

int main()
{

    char jogo[3][3];
    int posicao,cont=0;
    char simb,simb2;
char *players[2];

//ler nomes dos jogadores

    menuinicial();
    tabelainicializar(jogo);
    tabelainicial(jogo);
    simb=escolhasimbolo();
    simb2=escolhasimbolo2();
  
while(1) {
	jogada(jogo,simb,1); //1 = numero de player
	cont++;
	if(cont==9)
		break;

	jogada(jogo,simb,2);
	cont++;
	if(cont==9)
		break;
	//vais ter outra condição que controle se algum jogador ganhou, como por exemplo;
	if(vitoria!=0)
		break;
}

if(vitoria!=0)
	printf("Vitória para o jogador %s ", players[vitoria]);
else
	printf("Empate");
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

          if(cont>9)                 //cont>9? ^^
          {
              sair=0;
             }

xD, nao sei como nao me lembrei dessa lol.

NoOne se calhar vou pegar nalgumas ideas do teu codigo como o TheDark disse e tranformar a jogada numa funcao unica esplica-me so esta parte do codigo que percebi bem s.f.f , é que ainda nao dei string e nao as domino muito bem  :fartnew2:

if(vitoria!=0)

printf("Vitória para o jogador %s ", players[vitoria]);

o players[vitoria] escreve o nome do jogador que ganhou mas o que e ao certo a variavel vitoria?

__

orbigado pelas sugestões a todos ajudou bastante sem duvida , mais um bocado de trabalho e está feito :thumbsup:

So mais um coisa.. estive a trabalhar no código pra reconhecer quando se ganha ou perde , pus o IF desta maneira, mas dá-me erro, nao é possivel fazer isto? tem que se fazer condição a condição? :hmm:

int wincheck(char jogo[3][3],int x, char sim )
{
   int jog=0;
    if (x==0)
    {
       jog=1;
    }
    else
    {
        jog=2;
    }
               
    if (jogo[0][0]== sim && jogo[0][1]== sim && jogo[0][2]== sim) || (jogo[2][0]== sim && jogo[2][1]== sim && jogo[2][2]== sim) || 
                     (jogo[1][0]== sim && jogo[1][1]== sim && jogo[1][2]== sim)
    {
                   printf("Jogador %d, Ganhou!\n",jog);
                   return 0;
    }
   
    }
    

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma pequena sugestão, não sei se será a mais correcta, mas podes tentar assim...

//Vitoria como variavel global
int vitoria = 0; //0 = ninguem ganhou; 1= ganhou player 1; 2 = ganhou player 2;

//Funções

int main()
{

    char jogo[3][3];
    int posicao,cont=0;
    char simb,simb2;
char *players[2];

//ler nomes dos jogadores

    menuinicial();
    tabelainicializar(jogo);
    tabelainicial(jogo);
    simb=escolhasimbolo();
    simb2=escolhasimbolo2();
  
while(1) {
	jogada(jogo,simb,1); //1 = numero de player
	cont++;
	if(cont==9)
		break;

	jogada(jogo,simb,2);
	cont++;
	if(cont==9)
		break;
	//vais ter outra condição que controle se algum jogador ganhou, como por exemplo;
	if(vitoria!=0)
		break;
}

if(vitoria!=0)
	printf("Vitória para o jogador %s ", players[vitoria]);
else
	printf("Empate");
}

lol, isso foi mais ou menos o que eu disse, mas substituía esse while por

while(1) {
vitoria = jogada(jogo, cont%2);
if ( vitoria != 0 || ++cont == 9 ) break;
}

onde jogada receberia como 2º parâmetro 0 para o jogador 1, e 1 para o jogador 2, e determina o símbolo a partir desse parâmetro. jogada retorna ainda 0 no caso de nessa jogada ninguém ter ganho, 1 para o caso em que ganha o jogador 1, e 2 para o caso em que ganha o jogador 2, o que evita ter vitoria como variável global.

So mais um coisa.. estive a trabalhar no código pra reconhecer quando se ganha ou perde , pus o IF desta maneira, mas dá-me erro, nao é possivel fazer isto? tem que se fazer condição a condição? :hmm:

Sim, é possível. Tens é que pôr parêntesis à volta de toda a condição, a a abrir logo a seguir ao if e a fechar logo antes do {.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sair=player1(jogo,simb);
          tabelainicial(jogo);
          sair=player2(jogo,simb2);
          tabelainicial(jogo);

          cont=cont+2;
          printf("%d\n",cont);          /*output a confirmar o valor que o cont tem */
          if(cont==9)                 //apesar do cont chegar aos 9 o ciclo continua ...
          {
              sair=0;
             }

Nunca jogaste ao galo? Ele faz com que ambos joguem e em seguida faz a verificação, ora nem era preciso saber o que é um número ímpar, bastava ver que para o jogo acabar empatado quem joga por último é o JOGADOR 1, se tu fazes a verificação a seguir ao JOGADOR 2 é impossível isso funcionar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também exprimetei atribuir valores acima do "suposto" as variaveis que fazem de contadores no for para ele parar mas nao da :x

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