Ir para conteúdo
Fórum Script Brasil
  • 0

Não estou Conseguindo achar o erro do meu Algoritmo em C


Aprendiz2

Pergunta

Boa Noite a todos ,

Sou novo nessa comunidade e também com programação, e gostaria de saber se alguém pode me da uma ajuda porque estou desesperado e não consigo achar o erro o enunciado é esse,é um jogo que utiliza uma lista duplamente cadiada e circular:

Faça um programa que simule esse jogo de acordo com as seguintes instruções:

– Crie uma lista duplamente encadeada circular.

– Insira 10 nós nesta lista, representado os jogadores, onde a chave de cada nó é o número

do jogador.

– Imprima na tela a configuração inicial da roda.

– O jogo deve começar pelo jogador 1.

– Peça ao usuário que digite na tela a carta a ser tirada, como se o usuário fosse o baralho.

– Após ler a carta, execute o que a carta representa.

– Se for a carta 1, pule o jogador ao lado e vá para o próximo, sendo que este será o

próximo jogador a jogar. Por exemplo, na configuração inicial, começando-se pelo

jogador 1, a carta 1 faria com que o jogador 2 fosse pulado e o próximo jogador a jogar

fosse o 3.

– Se for a carta 3, elimine o terceiro jogador contado a partir do atual. Por exemplo, na

configuração inicial, começando-se pelo jogador 1, a carta 3 faria com que o jogador 4

fosse eliminado e o próximo jogador a jogar fosse o 2.

– Se for a carta 9, elimine o jogador que vem antes do atual. Por exemplo, na

configuração inicial, começando-se pelo jogador 1, a carta 9 faria com que o jogador 10

fosse eliminado e próximo jogador a jogar fosse o 2.

– Se for a carta 13, inverta o sentido do jogo. Por exemplo, na configuração inicial,

começando-se pelo jogador 1, a carta 13 faria com que o próximo jogador a jogar fosse

o 10, ao invés do 2.

– Cuidado para não contar a cabeça da lista como jogador. Observe bem a sequência de

passos mostrada anteriormente. E lembre-se de manipular corretamente os ponteiros de

anterior e próximo de acordo com o sentido atual do jogo.

– Depois que a carta for executada, imprima a nova configuração da roda e de qual jogador é

a vez. Peça ao usuário para digitar a nova carta a ser tirada.

– O jogo deve ficar nesse loop até que só reste um jogador, que será o vencedor.

– Imprima o jogador vencedor na tela.

até agora eu consegui fazer isso:

//lista duplamente encadeada circular com nó cabeça

#include<stdio.h>
#include<conio.h>
#include <stdlib.h>

int cont=10;

typedef struct no{
  int jogador;
  struct no* prox;
  struct no* ant;
}no;

no* cria(void){
  no *n;
  n = (no*) malloc (sizeof (no));
  n -> jogador = 1;
  n -> prox = n;
  n -> ant = NULL;
  return n;
}

no* cria_no(int ch){
no *n;

n = (no*) malloc (sizeof (no));
n -> jogador = ch;
n -> prox = n;
n -> ant = NULL;
return n;
}

void inserir_fim(no *lista, int ch) {
no *n; 
no *aux;
n= cria_no(ch);
aux=lista;
while(aux->prox!=lista) 
   aux = aux->prox;
aux->prox = n;
n -> prox = lista;
n -> ant = aux;
}

void imprime(no* Lista){
no* aux;
aux = Lista->prox;
  do {
    printf("%d ",aux-> jogador);
    aux = aux->prox;
  }while(aux != Lista);
}

void imprime_reverso(no* Lista){
  no *aux;
  aux = Lista->prox;
  while(aux ->prox != Lista)
     aux = aux -> prox;
  while(aux !=Lista){
    printf("%d  ",aux-> jogador);
    aux = aux->ant;
  }
}

void remover(no *L, int ch) {
no *aux; 
aux = L->prox;
getch();
  while (aux->jogador!=ch && aux!=NULL){
     aux = aux -> prox;
  }
  if (aux  == NULL)
     printf("não há lista");
  else if (aux == L->prox){ //primeiro elemento
     L->prox = aux->prox;
     aux -> prox -> ant = L;
  }
  else{
   aux -> ant -> prox = aux -> prox;
   aux ->prox -> ant = aux -> ant;
  }
  free(aux);
  
}

void carta_validar(int carta, no* Lista, no* aux, no *L, int ch){

 aux = Lista->prox;
     
     switch(carta) { 
            case '1': printf ("Pule o jogador ao lado e passe para o seguinte\n");
                      aux = aux -> prox; aux = aux -> prox;
                      printf("Nova configuração da roda: \n");
                      imprime(Lista);
                      printf("\não é? a vez do jogador %d",aux ->jogador);
                      break; 
                             
               case '9': printf ("Elimine o jogador que vem antes do atual\n");
                         remover(Lista, ch);
                         printf("Nova configuração da roda: \n");
                         imprime(Lista);
                         cont=cont--;
                         printf("\não é? a vez do jogador %d",aux ->jogador);
                      break;  
                               
            case '3': printf ("Elimine o terceiro jogador contado a partir do jogador atual");
                      aux = aux -> prox; aux = aux -> prox;
                      remover(Lista, ch);
                      imprime(Lista);
                      cont=cont--;
                      printf("\não é? a vez do jogador %d",aux -> jogador);
                     break;  
            
            case '13': printf ("Inverta o sentido da roda.\n");
                       printf("Nova configuração da roda: \n");
                       imprime_reverso(aux);
                       printf("\não é? a vez do jogador %d",aux -> jogador);
                     break;              
                
            default: printf("opção inválida\n");
                     printf("Escolha outra carta: ");
                     scanf("%d ", &carta);
                     carta_validar(carta);
                  }
int main(){
int carta,n;
  no *Lista;
  no *aux;
  aux = Lista;

  Lista = cria();
  printf("Jogo de cartas\n\n\n");
  printf("Os jogadores são: \n\n");
  
  for(n=1;n<11;n++)
  {
    inserir_fim(Lista,n);
  }
  imprime(Lista);

  printf("\n\n\n");
  printf("O jogo comeca pelo jogador %d", 1);
   
  while(cont != 1)
  { 
  printf("Digite a carta que o jogador vai tirar: \n");
  scanf("%d",&carta);
  carta_validar(carta,no* aux, no* Lista);
  }
  
  if(cont == 1)
  printf("O vencedor é o jogador %d", aux -> jogador);
  
  
  getch();
}

Quem puder me ajudar ficarei muito grato

Abraço a todosssss!!!!!!

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...