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

n1ckooo

Projecto Uno - Problema com a pesquisa!

1 mensagem neste tópico

Olá boa noite...

Eu estou a fazer um projecto em C, usando o dev C++ (windows) que consiste criar o jogo do UNO.

Regras básicas do uno: o jogador pode jogar se tiver uma carta da mesma cor ou do mesmo valor, que a que que a da mesa. Exemplo: Carta na mesa : 8 Vermelho, Um jogador só pode jogar se tiver alguma carta vermelha, ou algum carta com o valor 8 ou alguma carta WILD (C e Q, "muda cor" e "apanha 4 e muda cor", respectivamente.

Estou com um problema em ver se é um jogador X tem uma carta possível de jogar.

O vector com as cartas do jogador esta ordenado e guardado na estrutura jogadores.

Vou por o código para ver se entendem onde quero chegar.

// código que fará o jogo correr, embora deva ter erros o erro que estou a falar não //deverá ser aqui.
void JogarUno(cartas bar[],cartas monte_jogo[],jogadores jogador[],int njogadores)
{
int i,possivel = 0;
while (jogador[i].contcartas>0)
{
	i=0;
	while (i < njogadores)
	{
		// verifica se o jogador tem alguma carta possivel para jogar
		possivel = JogadaPossivel(i,monte_jogo,bar,jogador);
		if (possivel == 1)
		{
				printf("Jogador %d",i);

				printf("\nPossivel");
				getch();
		}
		else
		{

			printf("\nIMPossivel");
			Apanha1Carta(i,bar,jogador);
			LimpaTela();
			ImprimirCartas(jogador,njogadores);
			MostrarCartaTopo(monte_jogo);

		}
	i++;
	}

}
}


// Código da função Jogada Possivel
int JogadaPossivel(int x,cartas monte_jogo[],cartas bar[],jogadores jogador[])
{
// Ver se Existe Cartas Wild
int q,c,possivel,i;
int res = 0;
char val;
int cor;
       \\ Carta wild Q (apanha 4 e muda cor)
\\ A cor das cartas wild sao sempre 9 (PRETO)

q = PesquisaCarta (x,'Q',9,jogador);

	if (q!=-1)
	{
	return 1;
}
\\ Carta wild C( muda cor)
c = PesquisaCarta (x,'C',9,jogador);
if (c!=-1)
{
	return 1;
}

i = RetornarTopo(monte_jogo);
val = monte_jogo[i].valor;
cor = monte_jogo[i].cor;

possivel = PesquisaCarta(x,val,cor,jogador);

if (possivel !=-1)
{
	return 1;
}
return res;



}

\\ o codigo da pesquisa
int PesquisaCarta(int ijog,char val,int cor,jogadores jogador[])
{
    
    int u,i,ncartas;
int z = 0;
    ncartas = jogador[ijog].contcartas;
u = ncartas-1;
    i = (z+u) / 2;
  	
    while ((z<=u) && (jogador[ijog].carta[i].valor != val) && (jogador[ijog].carta[i].cor != cor))
    {   
      
   if(val < jogador[ijog].carta[i].valor && cor < jogador[ijog].carta[i].cor)
            u = i+1;
        else
            z = i+1;

        i = ( z + u ) / 2;
    }
    
    if ( z <= u ) 
        return i;
    else
        return -1;

}

O erro acontece, quando o jogador x nao tem nenhuma carta wild, e quando não tem nenhuma cor igual a cor da carta da mesa, MAS tem um carta com valor igual a carta da mesa. Ou seja deveria ser possível jogar e retornar um calor != de -1. O que nao acontece...

Posso resolver este problema criando duas pesquisas distintas uma para a cor e outra para o valor, penso que assim Já funcionava.

Já agora aproveitando o tópico, qual os factores que influenciam a eficiência do código.

E onde encontrar dicas para optimizar o código?

Se alguém puder ajudar, agradecia.

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