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

Jogo Paciência - Linguagem C


juniorfv

Pergunta

Meu código para um programa de paciência está apresentando os seguintes erros:

C:\Users\Pc\Documents\CS350B\teste.cpp    In function 'Informacao* novaInformacao(int, int)':
47    35    C:\Users\Pc\Documents\CS350B\teste.cpp    [Error] invalid conversion from 'void*' to 'Informacao*' [-fpermissive]
C:\Users\Pc\Documents\CS350B\teste.cpp    In function 'void inicializaPaciencia()':
421    40    C:\Users\Pc\Documents\CS350B\teste.cpp    [Error] invalid conversion from 'void*' to 'Informacao**' [-fpermissive]

 

alguém poderia me ajudar? Segue o Codigo do programa:

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

 

/* Pilha, marca o comeco e o fim da pilha num vetor */
typedef struct {
   int comeco;
   int ocultas;      /* marcas as cartas ocultas, ajuda na hora de ver o comeco e o fim das cartas não ocultas */
   int fim;
   /* algumas flags para as pilhas, ajudam na hora de ficar fazendo procura de jogadas */
   int podeEntrar;   /* diz se existe algum monte na pilha de jogo pode ou não entrar nessa pilha */
   int podeSair;     /* diz se esse monte pode entrar ou não em alguma pilha de jogo ou pilha final */
} Pilha;

 

/* minha definicao de carta:
 * um inteiro, entre 0 e 51
 * para saber o simbola da carta c (valor) basta pegar (c%13 + 1)
 * onde 1 representa A, 2 = 2 ... 10 = 10 , 11 = J, 12 = Q, 13 = K
 * para saber o naipe da carta c basta pegar c/13 
 * onde 0 = ouro, 1 = espada, 2 = copas, 3 = paus
 * 
 * Vantagens dessa organizacao:
 * 
 * Saber se as cartas a e b são da mesma cor
 *    (a/13)%2 == (b/13)%2
 *
 * Saber se a carta a pode ser colocada em acima da carta b, na pilha de jogo
 *  ser um simbolo a menos e   cor diferente 
 *    (a%13 == (b%13 -1)) && (a/13)%2 != (b/13)%2
 */

/* Carta é um inteiro, apenas a posicao do meu vetor onde está suas informacoes */
typedef int Carta;

/* estrutura que contem informacao sobre a carta */
typedef struct {
   int valor;      /* valor da carta, descrito acima                                        */
   int virada;     /* se 1, a carta ta virada, se 0 a carta não pode ser vista pelo jogador */
   Pilha *pilha;   /* ponteiro para a pilha que a carta pertence                            */
} Informacao;

Informacao *novaInformacao(int valor, int virada) {
   Informacao *i = malloc(sizeof*i);
   i->valor = valor;
   i->virada = virada;
   i->pilha = NULL;
   return i;
}


Informacao **baralho;
/* um vetor de ponteiros para Informacao é o meu baralho */

/* para facilitar algumas coisas no programa,
 * vou deixar as estruturas de pilhas e o vetor 
 * como variaveis globais */

Pilha pilhaJogo[7];

/* Como não é permitido tirar cartas da pilha de saida,
 * para deixar mais rapido, vou deixa-los todos numa unica pilha
 * e guardar apenas quem foi o ultimo colocado de cada naipe */
Pilha pilhaSaida;    

int podeSaida[4];   /* diz se o cara da saida pode receber cartas */
int ultimoSaida[4]; /* diz a ultima carta da saida                */

/* Para quem já jogou paciencia, 
 * é intuitivo que as pilhas de estoque e de descarte
 * são as que ficam maiores durante o jogo.
 * Como o espaco para todas as pilhas é apenas de 60, tudo junto
 * faz sentido querer alterar as pilhas de estoque e de descarta a 
 * menor quantidade de vezes possiveis, então vou colocalas nas pontas
 * ou seja, a pilha de descarte vai sempre terminar no 0
 * e a pilha de estoque no 59.
 * Olhando de outra menira, se a pilha de descarte termina em n, 
 * e a pilha de estoque termina em m
 * eu vou organizar as outras pilhas entre n+1 e m-1
 */

Pilha estoqueDescarte;  /* estoque e descarta */

/* assinaturas de algumas funcoes uteis */

/* responde se pode mover uma carta, para uma pilha */
int podeMoverCarta(Carta carta, Pilha b);

/* responde se pode mover a pilha a, para a pilha b */
int podeMoverPilha(Pilha a, Pilha b);

/* procura no no Topo de uma pilha de jogo a carta de valor dado */
int procuraTopo(int valor, Pilha pilha); 

/* responde se a carta pode ser colocada no topo ou não */
int podeSair(int valor);

/* coloca a ultima carta de uma Pilha de Jogo numa das pilhas finais */
void mudaFinal(Pilha *pilha);

/* coloca uma pilha na outra */
void movePilha(Pilha *a, Pilha *b);

/* coloca uma carta em uma determinada posicao do baralho */
void moveCarta(Informacao *carta, int posicao, int meio);

/* move da pilha de descarta para a pilha de Saida */
void moveSairDescarte();

/* pega uma carta da pilha de estoque e coloca na pilha de descarte */
void pescaGrimorio();

/* imprime o jogo */
void imprimeJogo();

/* imprime a pilha de Estoque e de Descarte */
void imprimeEstoqueDescarta();

/* inicializa o jogo */
void inicializaPaciencia();

/* imprime uma pilha */
void imprimePilha(Pilha pilha);

/* imprime uma pilha de saida */
void imprimeSaida(int pilha);

/* imprime uma carta */
void imprimeCarta(int valor, int virada);

 

/* responde se pode mover uma carta, para uma pilha */
int podeMoverCarta(Carta carta, Pilha b) {
   Carta topoB = b.fim - 1;
   int va = baralho[carta]->valor, vb ;
   /* se for um reis */
   if(baralho[carta]->valor%13 == 12) {      
      /* se b estiver vazio pode mover um Reis */
      if(b.comeco == b.fim)
     return 1;
      return 0;
   }

   /* se b estiver vazia não pode */
   if(b.comeco == b.fim)
      return 0;
   vb = baralho[topoB]->valor;

   /* verifica se a carta pode ir em b */
   if(va%13 == (vb%13-1) && (va/13)%2 != (vb/13)%2)
      return 1;
   return 0;
}

/* responde se pode mover a pilha a, para a pilha b */
int podeMoverPilha(Pilha a, Pilha b) {
   Carta comecoA  = a.comeco + a.ocultas; /* comeco de A despresando as cartas ocultas */
   
   /* se a pilha a estiver vazia, ela não pode ser movida pra lugar nenhum */
   if(a.comeco == a.fim)
      return 0;

   /* se for um reis */
   if(baralho[comecoA]->valor%13 == 12 && a.comeco == comecoA) {
      /* não faz sentido removar o Reis de A e deixar o A vazio */
      return 0;
   }
   return podeMoverCarta(comecoA, b);
}

/* procura no no Topo de uma pilha de jogo a carta de valor dado */
int procuraTopo(int valor, Pilha pilha) {
   Carta topo = pilha.fim - 1;
   /* se a pilha estiver vazia, a carta não está nela */   
   if(pilha.comeco == pilha.fim)
      return 0;
   
   return baralho[topo]->valor == valor;   
}

/* responde se a carta pode ser colocada no topo ou não */
int podeSair(int valor) {
   int naipe = valor/13;   
   if(ultimoSaida[naipe] == valor%13)
      return 1;
   return 0;
}

/* coloca a ultima carta de uma Pilha de Jogo numa das pilhas finais */
void mudaFinal(Pilha *pilha) {
   Carta topo = pilha->fim -1;
   baralho[topo]->pilha = &pilhaSaida;
   pilha->fim--;
   
   ultimoSaida[(baralho[topo]->valor)/13]++;
   if(ultimoSaida[(baralho[topo]->valor)/13] != 13)
      podeSaida[(baralho[topo]->valor)/13] = 1; /* como mudei o topo da pilha, eu digo que agora alguém pode entrar */
   else
      podeSaida[(baralho[topo]->valor)/13] = 0; /* se chegou um reis, não pode entrar mais aqui */

   /* se não tem mais cartas mostradas na pilha e ainda tem cartas na pilha*/
   if(pilha->fim == (pilha->comeco + pilha->ocultas) && pilha->fim != pilha->comeco) {      
      pilha->ocultas--;
      topo = pilha->fim -1;
      baralho[topo]->virada = 1;     
   }   
}


int procuraVazio() {
   int i;
   for(i=0;i<60;i++)
      if(baralho==NULL)
     break;
   return i;       
}
/* coloca uma pilha na outra */
void movePilha(Pilha *a, Pilha *b) {
   Pilha auxiliar;
   int i, vazio;
   auxiliar.fim = a->fim;
   auxiliar.comeco = a->comeco + a->ocultas;
   
   a->fim = a->comeco + a->ocultas;
   if(a->ocultas) {
      baralho[a->comeco + a->ocultas]->virada = 1;
      a->ocultas--;
   }
   
   for(i=auxiliar.comeco;i<auxiliar.fim;i++) {
      baralho->pilha = &auxiliar;
   }
   for(i=auxiliar.fim-1;i>=auxiliar.comeco;i--) {
      Informacao *carta = baralho;
      baralho = NULL;
      carta->pilha = b;
      
      /* caso b seja vazio */
      if(b->fim == b->comeco) {
     vazio = procuraVazio();
     b->fim = vazio + 1;
     b->comeco = vazio;
     b->ocultas = 0;
     baralho[vazio] = carta;
     continue;
      }
      
      moveCarta(carta, b->fim, 1);      
   }
   b->podeEntrar = a->podeEntrar;
   b->podeSair = a->podeSair || b->podeSair;
   a->podeEntrar = 1;
   a->podeSair = 1;
}

/* coloca uma carta em uma determinada posicao do baralho */
void moveCarta(Informacao *carta, int posicao, int meio) {
   Informacao *proxima;
  
   
   int mesmaPilha, proximaPosicao = posicao + 1;  

   if(posicao == estoqueDescarte.comeco) {
      moveCarta(carta, estoqueDescarte.fim, meio);
      return;
   }

   if(carta->pilha==&pilhaSaida) {
      posicao = procuraVazio();
      baralho[posicao] = carta;
      return;
   }
   
   carta->pilha->fim = posicao+1;


   /* lugar vago */
   if(baralho[posicao]==NULL) {
      baralho[posicao]=carta;
      return;
   } else {
      mesmaPilha = baralho[posicao]->pilha == carta->pilha;
      proxima = baralho[posicao];
      imprimeCarta(proxima->valor, 1);
      if(!mesmaPilha) {     
     proxima->pilha->comeco = proximaPosicao;
      }

      baralho[posicao] = carta;
      moveCarta(proxima, proximaPosicao, mesmaPilha);
   }

}
/* move da pilha de descarta para a pilha de Saida */
void moveSairDescarte() {
   int valor = baralho[estoqueDescarte.fim -1]->valor;
   baralho[estoqueDescarte.fim -1]->pilha = &pilhaSaida;
   ultimoSaida[valor/13]+=1;
   podeSaida[valor/13]=1;

   estoqueDescarte.fim--;
}

/* pega uma carta da pilha de estoque e coloca na pilha de descarte */
void pescaGrimorio() {
   Informacao *carta = baralho[estoqueDescarte.fim];

   /* ver se tem carta pra pescar */
   if(estoqueDescarte.comeco == 59)
      return;

   baralho[estoqueDescarte.fim] = baralho[estoqueDescarte.comeco + 1];
   baralho[estoqueDescarte.fim]->virada = 1;
   baralho[estoqueDescarte.comeco + 1] = NULL;
   if(carta!=NULL) {
      if(baralho[estoqueDescarte.comeco-1]==NULL || baralho[estoqueDescarte.comeco-1]->pilha != carta->pilha) {    
     carta->pilha->comeco = estoqueDescarte.fim +1;
      }
      imprimeCarta(carta->valor, 1);
     
      moveCarta(carta, estoqueDescarte.fim + 1, 1);
   } 
   estoqueDescarte.fim++;
   estoqueDescarte.comeco++;
}


/* imprime o jogo */
void imprimeJogo() {
   int i;
   printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n");
   imprimeEstoqueDescarta();
   printf("\nPilhas de Jogo\n");
   for(i=0;i<7;i++) {
      printf("%d : ",i+1);
      imprimePilha(pilhaJogo);
   }
   printf("\nPilhas de Saida\n");
   for(i=0;i<4;i++) {
      imprimeSaida(i);      
   }  
   printf("--\n");
}

/* imprime a pilha de Estoque e de Descarte */
void imprimeEstoqueDescarta() {
   int i;
   printf("Pilha de Estoque\n");
   for(i=59;i>estoqueDescarte.comeco;i--) {
      imprimeCarta(baralho->valor, baralho->virada);
      printf(" ");
   }
   printf("\n\n");
   printf("Pilha de Descarte\n");
   for(i=0;i<estoqueDescarte.fim;i++) {
      imprimeCarta(baralho->valor, baralho->virada);
      printf(" ");
   }
   printf("\n\n");

/* imprime uma pilha */
void imprimePilha(Pilha pilha) {
   int i;
   for(i=pilha.comeco;i<pilha.fim;i++) {
      imprimeCarta(baralho->valor, baralho->virada);
      printf(" ");
   }
   printf("\n");
}

/* imprime uma pilha de saida */
void imprimeSaida(int pilha) {
   int i;
   for(i=0;i<ultimoSaida[pilha];i++) {
      imprimeCarta(pilha*13 + i, 1);
      printf(" ");
   }      
   printf("\n");
}

/* imprime uma carta */

   char getNaipe(int valor) {
      if(valor/13 == 0)
     return 'O';
      if(valor/13 == 1)
     return 'E';
      if(valor/13 == 2)
     return 'C';
      return 'P';
   }
void imprimeCarta(int valor, int virada) {
   printf("[%2d%c %c]",valor%13+1, getNaipe(valor), virada ? ' ' : 'X');
}

void atualizaPilha(int pi, int pf, int pilha) {
   for(;pi<=pf;pi++) {
      baralho[pi]->pilha = &pilhaJogo[pilha];
   }
}
/* inicializa o jogo */
void inicializaPaciencia() {
   int cartas[52], i, pos, aux;

   for(i=0;i<52;i++) /* incializando */
      cartas = i;

   /* embaralhando */
   for(i=0;i<51;i++) {
      pos = i + rand()%(52 - i);
      aux = cartas;
      cartas = cartas[pos];
      cartas[pos] = aux;
   }

   baralho = malloc(60*(sizeof*baralho));

   for(i=1;i<=52;i++) {
      baralho[60 - i] = novaInformacao(cartas[i-1], 0);      
   }
   for(;i<=60;i++)
      baralho[60 - i] = NULL;

   pos = 35;

   for(i=0;i<7;i++) { /* incializando pilhas de jogo */
      pilhaJogo.comeco  = pos - i;
      pilhaJogo.fim     = pos + 1;
      pilhaJogo.ocultas = i;
      pilhaJogo.podeSair = 1;
      pilhaJogo.podeEntrar = 1;
      atualizaPilha(pos - i, pos, i);
      baralho[pilhaJogo.comeco + pilhaJogo.ocultas]->virada = 1;
      pos-=(i+1);
   }   

   estoqueDescarte.comeco = 35;
   estoqueDescarte.fim = 0;

   for(i=0;i<4;i++) {
      podeSaida = 1;
      ultimoSaida = 0;
   }

}


/* funcao que joga o paciencia */
void jogar() { 
   int i,j, houveMovimento; 
   /* a variavel houveMovimento serve para garantir que faco uma jogada a cada iteracao do meu laco */
   while(1) {

      if(estoqueDescarte.fim == 0) 
     pescaGrimorio();

      imprimeJogo();
      houveMovimento = 0;

      /* passo 1, verifico se algum monte final quer carta */
      for(i=0;i<4 && !houveMovimento ;i++) {
     /* se a quer receber carta */
     if(podeSaida == 1) {
        for(j=0;j<7;j++) { /* procuro na pilha de jogo */
           if(procuraTopo(i*13 + ultimoSaida,pilhaJogo[j])) {
          printf("Colocar carta da pilha %d para pilha final\n",j+1);
          mudaFinal(&pilhaJogo[j]); /* coloca o topo de j em i */
          houveMovimento = 1;
          break;
           }
        }
        if(!houveMovimento)
           podeSaida = 0; /* se ninguém quis entrar em Saida i, eu anoto isso */
     }        
      }

      if(houveMovimento)
     continue;

      /* passo 2 do jogo, procuro alguma pilha que pode ser movida para outra */
      for(i=0;i<7 && !houveMovimento ;i++) {     
     if(pilhaJogo.podeSair) {
        /* se pode sair então procuro algum monte pra ele ir */
        for(j=0;j<7;j++) {
           if(j!=i && podeMoverPilha(pilhaJogo, pilhaJogo[j]) ) {
          printf("Colocar pilha %d na pilha %d\n", i+1, j+1);
          movePilha(&pilhaJogo, &pilhaJogo[j]);
          houveMovimento = 1;
          break;
           }
        }        
        if(!houveMovimento && podeSair( baralho[pilhaJogo.comeco + pilhaJogo.ocultas]->valor) )
        {
           mudaFinal(&pilhaJogo);
           houveMovimento = 1;
           break;
        }
        if(!houveMovimento)
           pilhaJogo.podeSair = 0; /* se ninguém aceitou essa pilha eu anoto isso */
     }
     if(pilhaJogo.podeEntrar && !houveMovimento) {
        /* se pode entrar então procuro alguém pra vir */
        for(j=0;j<7;j++) {
           if(j!=i && podeMoverPilha(pilhaJogo, pilhaJogo) ) {
          printf("Movendo da pilha %d pra pilha %d\n", j,i);
          movePilha(&pilhaJogo[j], &pilhaJogo);
          houveMovimento = 1;
          break;
           }
        }
        if(!houveMovimento)
           pilhaJogo.podeEntrar = 0; /* se ninguém entrou na minha pilha eu anoto isso tambem */
     }
      }

      if(houveMovimento)
     continue;

      /* passo 3, verificar se a pilha de descarta pode ir pra algum lugar */
      if(estoqueDescarte.fim != 0) { /* se a pilha de descarte não esta vazia */
     imprimeCarta(baralho[estoqueDescarte.fim-1]->valor, 1);
     if(podeSair( baralho[estoqueDescarte.fim-1]->valor )) {
        printf("Colocar carta da pilha de descarta na pilha de saida\n");
        moveSairDescarte();
        houveMovimento = 1;
     }
     if(!houveMovimento) {
        for(i=0;i<7;i++) {
           if(podeMoverCarta(estoqueDescarte.fim -1, pilhaJogo)) {          
          Informacao *carta;
          printf("Carta da pilha de descarte para a pilha de jogo Numero %d\n", i+1);
          carta = baralho[estoqueDescarte.fim -1];
          baralho[estoqueDescarte.fim -1]= NULL;
          carta->pilha = &pilhaJogo;
          /* se tiver vazia */
          if(carta->pilha->comeco == carta->pilha->fim) {
             int vazio = procuraVazio();
             carta->pilha->comeco = vazio;
             carta->pilha->fim = vazio +1;
             moveCarta(carta, vazio, 1);

          } else {
             moveCarta(carta, carta->pilha->fim, 1);
          }
          estoqueDescarte.fim--;
          houveMovimento = 1;
          break;
           }
        }
     }
      }
      if(houveMovimento == 1)
     continue;

      if(estoqueDescarte.comeco == 59)
     break;

      printf("pescando uma carta\n");
      pescaGrimorio();

   }
}
/* main pra compilar */

int main() {
   int semente = 1133229541;
   srand(semente);
   inicializaPaciencia();
   jogar();
   return 0;
}

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Os erros estão na utilização do malloc, em dois locais distintos:


Informacao *novaInformacao(int valor, int virada) {
   Informacao *i = malloc(sizeof*i);
   i->valor = valor;
   i->virada = virada;
   i->pilha = NULL;
   return i;
}

 

E

 

 baralho = malloc(60*(sizeof*baralho));

 

Não sei oquê  fazer para rodar o programa.

Link para o comentário
Compartilhar em outros sites

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...