Ir ao conteúdo
  • Cadastre-se

Arthur Boss

Membro Júnior
  • Posts

    4
  • Cadastrado em

  • Última visita

posts postados por Arthur Boss

  1. @1freakday Realmente me equivoquei naquela parte, não pensando em todas as condições. Agradeço a vocês por me ajudarem com isto. E no laço aonde você perguntou seria executado 2 vezes, sendo i=0 é executado até se tornar i=1, porém passei o dia escrevendo o código e alterei algumas coisas, então desfiz o laço por necessidade de ocupar valores independentes depois.

    Outra pergunta que é um dos principais requisitos para o jogo, existe algum modo de, em qualquer momento que pressionado ESC, saia do jogo (ou apareça uma tela com a opção)? O requisito informa que a qualquer momento que pressionada a tecla saia do jogo, mas eu somente consegui implementar em dados momentos do jogo, utilizando a condição "if (getch()=27)". Tentei executar todo o jogo dentro de um "do{} while (getch()!=27)", mas não funcionou (talvez por não saber de onde começar e terminar o que incluo dentro de do while).

    Como não vou ter tempo de passar o jogo para uma biblioteca tipo allegro, muito menos de aprender a usar tal, será que é possível criar alguma condição utilizando somente bibliotecas padrão, ou no máximo "conio2"?

    Segue o código mais atual:

     

    //BIBLIOTECAS
    #include <stdio.h>
    #include <stdlib.h>
    #include <locale.h>
    #include <time.h>
    #include <windows.h>
    #include <conio2.h>

     

    #define SIZE 6


    //PROTÓTIPOS DAS FUNÇÕES
    void game();
    void table    (char hidden[][SIZE]);
    void score    (int *points);
    void generate (char pieces[][SIZE]);
    void request  (char pieces[][SIZE], char hidden[][SIZE], int *points);

     

    //FUNÇÃO PRINCIPAL

    int main()
    {
        setlocale (LC_ALL, "Portuguese");

        SetConsoleTitle ("Memory Game in C - by Arthur & Paola"); //Define o título para a janela do console

        srand ((unsigned)time(NULL)); //Alimenta rand() com números diferentes

        game(); //Chama a função que dá início ao jogo

        return 0;
    }


    //EXECUÇÃO DO JOGO
    void game()
    {
        char pieces[5][SIZE]={}; //Matriz que conterá as peças
        char hidden[5][SIZE]={}; //Matriz que conterá os pares encontrados
        int points=0; //Pontuação do jogo

        table    (hidden);
        score    (&points);
        generate (pieces);
        request  (pieces, hidden, &points);
    }


    //IMPRIME A MESA
    void table (char hidden[][SIZE])
    {
        int i, j;

        cputsxy (8,2, "1   2   3   4   5   6\n\n"); //Imprime o índice das colunas

        for (i=0; i<5; i++)
        {
            printf ("  %d   ", i+1); //Imprime o índice das linhas

            for (j=0; j<SIZE; j++)
                printf ("[%c] ", hidden[j]);

            printf ("\n\n");
        }
    }


    //IMPRIME A PONTUAÇÃO
    void score (int *points)
    {
        gotoxy (7,15);

        printf ("Pontuação: %d", *points);
    }


    //GERA AS PEÇAS
    void generate (char pieces[][SIZE])
    {
        char cards[15]={'A','E','I','O','U','a','e','i','o','u','&','<','>','?','@'}; //Peças do jogo
        int n=0, x1, y1, x2, y2;

        while (n<15)
        {
            x1=rand()%5;
            x2=rand()%5;
            y1=rand()%6;
            y2=rand()%6;

            if (pieces[x1][y1]==0 && pieces[x2][y2]==0)
            {
                if (x1!=x2 || y1!=y2)
                {
                    pieces[x1][y1]=cards[n];
                    pieces[x2][y2]=cards[n];

                    n++;
                }
            }
        }
    }


    //OPERAÇÃO DO JOGADOR
    void request (char pieces[][SIZE], char hidden[][SIZE], int *points)
    {
        int x[2], y[2];

        do
        {
            cputsxy (35,4, "Qual a localização da primeira peça?");
            cputsxy (35,6, "Linha:  ");
            scanf   ("%d", &x[0]);
            cputsxy (35,7, "Coluna: ");
            scanf   ("%d", &y[0]);

            hidden[x[0]-1][y[0]-1]=pieces[x[0]-1][y[0]-1];

            system ("cls");
            table  (hidden);
            score  (points);


            cputsxy (35,4, "Qual a localização da primeira peça?");
            cputsxy (35,6, "Linha:  ");
            scanf   ("%d", &x[1]);
            cputsxy (35,7, "Coluna: ");
            scanf   ("%d", &y[1]);


            if ((x[0]==x[1]) && (y[0]==y[1])) //Caso o jogador digite 2 vezes a mesma peça, ela é virada novamente
            {
                printf ("\a"); //Emite um som de alerta
                cputsxy (35,10, "Digite uma posição diferente!");

                delay (1500);

                hidden[x[0]-1][y[0]-1]=0;
                hidden[x[1]-1][y[1]-1]=0;

                system ("cls");
                table  (hidden);
                score  (points);

            } else {

                hidden[x[1]-1][y[1]-1]=pieces[x[1]-1][y[1]-1];

                system ("cls");
                table  (hidden);
                score  (points);

                gotoxy (2,15);

                if  (hidden[x[0]-1][y[0]-1]==hidden[x[1]-1][y[1]-1])
                {
                    cputsxy (35,4, "Parabéns, você acertou!");

                    *points+=100;

                    score (points);

                    delay (1500);

                } else {

                    printf ("\a"); //Emite um som de alerta
                    cputsxy (35,4, "Você errou! Tente novamente.");

                    if (*points!=0)
                        *points-=100;

                    score (points);

                    delay (1500);

                    hidden[x[0]-1][y[0]-1]=0;
                    hidden[x[1]-1][y[1]-1]=0;

                    table (hidden);
                }
            }

        }while (*points<=1500);
    }
     

  2. 2 horas atrás, MassakiMsk disse:

    O mais provavel é que essa linha esteja "travando" a geração randomica

    Por exemplo se faltar só 2 cartas para preencher e elas forem na mesma linha ou coluna. Ele nunca vai entrar nesse if e por isso fica em um loop infinito. Para resolver isso só precisa mudar && para ||.

     

    Outra coisa é que esse metodo de ficar sorteando as cartas até achar 2 que estejam vazias pode demorar muito se o tabuleiro for muito grande.

    Poxa amigo, agradeço demais!! Realmente era a questão do && e ||. Quebrei muito a cabeça com isso, e pelo visto ainda tenho dificuldades com a lógica em geral.

    No caso é um tabuleiro de 30 cartas, isso não será alterado. Mas qual dos métodos de sorteio seria mais eficiente no caso, você saberia indicar?

    Infelizmente estes ainda são meus primeiros contatos com programação, e devido ao prazo dado pra fazer este trabalho juntamente de tantos outros compromissos, realmente preciso de ajuda ou qualquer crítica, caso não se importem. É de grande importância pra mim!

  3. Agradeço pela simplificação da função table, de fato não pensei em utilizar o i+1. 

    Meu professor disse que pode ser algo que escrevi errado na função rand() (porém ele não olhou o código). Pelo que revi diversas vezes, não há nada de errado com a forma em que utilizei rand() no código. Pior é que tenho 2 dias restantes pra terminar tudo, e não estou conseguindo finalizar.

  4. Boa tarde pessoal!

    Procurei em muitos fóruns e de todas formas que consegui pensar, mas não encontrei solução para meu problema, nem alguém com problema parecido.
    Tenho 4 dias pra entregar um jogo da memória feito em C, e devo gerar peças aleatórias a cada jogo novo. O código funciona algumas vezes, mas outras não executa, simplesmente fica a tela do console toda preta e o cursor piscando. O debugger também não funciona assim que chamo uma função no main, logo após a declaração de srand. Se eu tiro srand do código, ele funciona todas as vezes que executado. Alguém por favor consegue me ajudar? (OBS.: Ainda estão faltando algumas lógicas do jogo em si, portanto, tem outras coisas que estou com dificuldades a serem finalizadas):


     

    //BIBLIOTECAS
    #include <stdio.h>
    #include <stdlib.h>
    #include <locale.h>
    #include <time.h>

    #define SIZE 6 //Constante global para o uso da palavra SIZE


    //PROTÓTIPOS DAS FUNÇÕES
    void game     (char deck[][SIZE]);
    void generate (char deck[][SIZE]);
    void table    (char matrix[][SIZE]);
    void request  (char printable_deck[][SIZE], char deck[][SIZE]);


    //FUNÇÃO PRINCIPAL
    int main()
    {
        setlocale (LC_ALL, "Portuguese");
        srand (time(NULL)); //Alimenta rand() com números diferentes


        char deck[5][SIZE]={}; //Baralho que conterá as cartas


        game(deck); //Chama a função que dá início ao jogo

        return 0;
    }


    //EXECUÇÃO DO JOGO
    void game(char deck[][SIZE])
    {
        char printable_deck[5][SIZE]={}; //Matriz que oculta as cartas

        generate (deck);
        table    (deck);

        system ("pause");
        system ("cls");

        table (printable_deck);

        request (printable_deck, deck);
    }


    //GERA AS CARTAS PARA O BARALHO
    void generate (char deck[][SIZE])
    {
        char cards[15]={'A','E','I','O','U','a','e','i','o','u','&','<','>','?','@'}; //Cartas disponíveis no jogo
        int n=0, x1, y1, x2, y2;

        while (n<15)
        {
            x1=rand()%5;
            x2=rand()%5;
            y1=rand()%6;
            y2=rand()%6;

            if (deck[x1][y1]==0 && deck[x2][y2]==0)
            {
                if (x1!=x2 && y1!=y2)
                {
                    deck[x1][y1]=cards[n];
                    deck[x2][y2]=cards[n];

                    n++;
                }
            }
        }
    }


    //IMPRIME O BARALHO NA TELA
    void table (char matrix[][SIZE])
    {
        int i, j;
        int m=1;

        printf ("\n      1   2   3   4   5   6\n\n"); //Imprime o índice das colunas

        for (i=0; i<5; i++)
        {
            printf (" %d   ", m); //Imprime o índice das linhas

            for (j=0; j<SIZE; j++)
                printf ("[%c] ", matrix[j]);

            printf ("\n\n");

            m++;
        }
    }


    //PERGUNTA AO USUÁRIO A CARTA QUE DESEJA VIRAR
    void request (char printable_deck[][SIZE], char deck[][SIZE])
    {
        int i, m, n;
        int x[2], y[2];

        for (i=0; i<=1; i++)
        {
            printf ("Qual a localização da carta desejada?"
                    "\nLinha:  ");
            scanf  ("%d", &m);
            printf ("Coluna: ");
            scanf  ("%d", &n);

            x=m-1;
            y=n-1;

            printable_deck[m-1][n-1]=deck[m-1][n-1];

            system ("cls");

            table (printable_deck);
        }

        if (deck[x[0]][y[0]]!=deck[x[1]][y[1]])
            printf ("\n\nVocê errou! Tente novamente.");
        else
        {
            printf ("Parabéns! Você acertou.\n\n");

            request (printable_deck, deck);
        }
    }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!