Ir ao conteúdo
  • Cadastre-se
FelipeMV

RESOLVIDO Dúvida Jogo

Recommended Posts

Olá estou tentando fazer um jogo de dados randomizado,em que um jogador tira dois dados e o segundo jogador tira dois dados,dessa forma o que tirar a pontuação maior é o vencedor da rodada,cada jogador inicia o jogo com 10 pontos de vida.O programa rodou legal,mas só teve uma parte do meu código que não entendi,logo após pontos=10 eu coloquei opções=2; (linha 156),mas foi coincidência pois  antes disso em algumas ocasiões o programa fechava no término de uma partida.Gostaria de entender por que ao colocar opções=2; o programa continua rodando da forma esperada?(ou seja,inicia uma nova partida).

Eis o código:

#include<iostream>#include<cstdlib>#include<ctime>   //Para randomizar.#include<string.h> //Operações com strings.#include<conio.h> //Para mudar cor da fonte,limpar tela.#include<stdio.h> //Para limpar buffer.using namespace std;char jogador1[30],jogador2[30],x[30];            //Introduz variáveis globais.Vetor de caracteres x servirá para troca de strings.int pontos1=10,pontos2=10;int retornaGanhador(int soma1,int soma2);        //Introduz protótipo de funções.int sorteioprimeirojogador();int main(){ int opcoes,soma1,soma2,i,dado[4],y,z,a;        //Variável i é variável de controle,y e z servirão para troca de variáveis. double anime=3000000000000;                    //Anime animára a tela,sendo um valor double para não transbordar(overflow). srand(time(NULL));                             //Função para garantir aleatoriedade,sendo colocada no início para garantir aleatoriedade. system("color A");                              //Muda a cor da fonte. system("title JOGO DOS DADOS - ATAQUE FATAL");  //Muda titulo da barra principal do console.do{  if(opcoes!=3)                                                            //Se opcoes diferente de 3 entao apelidos serão pegos.      { cout<<"               Jogo dos Dados ATAQUE FATAL               \n\n";        fflush(stdin);                                                     //Limpa o buffer,pois na repetição do loop será necessário.        cout<<"Apelido do Jogador 1.\n";        cin.getline(jogador1,30,'\n');                                      //Coleta os apelidos dos jogadores.        cout<<"Apelido do Jogador 2.\n";        cin.getline(jogador2,30,'\n');        system("cls");                                                       //Limpa a tela.      }while(anime>1){cout<<" _______________________________________________________\n";cout<<"|              *    *  ATAQUE FATAL  *    *             |\n";cout<<"|           *   *          PLAY         *    *          |\n";cout<<"|_______________________________________________________|\n\n";system("cls");cout<<" _______________________________________________________\n";cout<<"|   *    *             ATAQUE FATAL             *    *  |\n";cout<<"|*   *                     PLAY                   *    *|\n";cout<<"|_______________________________________________________|\n\n";system("cls");cout<<" _______________________________________________________\n";cout<<"|        *    *        ATAQUE FATAL       *    *        |\n";cout<<"|     *   *                PLAY              *    *     |\n";cout<<"|_______________________________________________________|\n\n";system("cls");anime=anime/2;                             //Dimuni  anime para dar a sensação de movimento até anime ser menor que 1}do{cout<<".-------------------------------------------------------\n";cout<<"|   *    *               ATAQUE FATAL          *   *    |\n";cout<<"|      *    *       JOGUE SEU DADO NA MESA  *   *       |\n";cout<<"`---------------Digite a opcao desejada.----------------\n\n";cout<<"1.Sortear o primeiro atacante.\n";cout<<"2.Renomear jogadores.\n";cout<<"3.Regras\n";cout<<"4.Sair do jogo.\n";cin>>opcoes;if(opcoes!=1&&opcoes!=2&&opcoes!=3&&opcoes!=4)       //Caso o usuário digite uma opção diferente dessas  o programa apresenta opção inválida. {system("cls"); cout<<"OPCAO INVALIDA\n"; }}while(opcoes!=1&&opcoes!=2&&opcoes!=3&&opcoes!=4); //Caso o usuário digite uma opção diferente dessas  o programa  permanece nessa tela.system("cls");                    //Limpa a tela.switch(opcoes){case 1:cout<<"                  Cada jogador tem 10 pontos de vida.\n";        a=sorteioprimeirojogador(); //Iguala a a para facilitar escrita.        if(a==0)        cout<<"                      "<<jogador1<<" e o PRIMEIRO a jogar.\n\n"; //O jogador 1 começa.        else           {cout<<"                      "<<jogador2<<" e o PRIMEIRO a jogar.\n\n";  //O jogador 2 começa.           }        do{           if(a==0)                  //Se o sorteio resultar em 0.             {cout<<jogador1<<" jogue os dados.\n";    //O jogador 1 começa.              system ("color 0F");              //Muda a cor.              system ("PAUSE");}                //Pausa a tela.          else                                           //Caso sorteio resulte em 1.             {cout<<jogador2<<" joque os dados.\n";           //O jogador 2 começa;              system ("color 0F");              system ("PAUSE");             }              system("cls");        for(i=1;i<=4;i++)               //Laço for para facilitar atribuição de 4 dados,utilização por vetor para facilitar.           {dado[i]=(rand()%6) + 1;             //Escolhe um valor de 1 a 6 aleatoriamente.           soma1=dado[1]+dado[2];           soma2=dado[3]+dado[4];           }                if(a==0)                 {cout<<"                "<<jogador1<<" tirou nos dados "<<dado[1]<<" e "<<dado[2]<<" totalizando "<<soma1<<endl;                  cout<<"                "<<jogador2<<" tirou nos dados "<<dado[3]<<" e "<<dado[4]<<" totalizando "<<soma2<<endl;                 }                else                 {cout<<"                "<<jogador2<<" tirou nos dados "<<dado[3]<<" e "<<dado[4]<<" totalizando "<<soma2<<endl;                  cout<<"                "<<jogador1<<" tirou nos dados "<<dado[1]<<" e "<<dado[2]<<" totalizando "<<soma1<<endl;                 }                if(a==0)                 {                retornaGanhador(soma1,soma2); //Verifica quem atacou,quem defendeu,quantos pontos perdeu.                strcpy(x,jogador1);                        //Troca jogadores para a proxima rodada.                strcpy(jogador1,jogador2);                strcpy(jogador2,x);                y=pontos1;                pontos1=pontos2;                pontos2=y;                                    //Dessa maneira troca pontos.                z=soma1;                soma1=soma2;                                 //E troca-se a soma,garantindo uma lógica perfeita de troca.                soma1=z;                 }                else                 {                 strcpy(x,jogador1);                 strcpy(jogador1,jogador2);                 strcpy(jogador2,x);                       //Troca jogadores para o jogador 2 começar o jogo,garantindo menos ifs e eles.                 y=pontos1;                 pontos1=pontos2;                 pontos2=y;                 z=soma1;                 soma1=soma2;                 soma1=z;                 retornaGanhador(soma2,soma1);                 }           }      while(pontos1>0&&pontos2>0);       //Executa rodadas até que os pontos de algum dos jogadores seja igual a 0.      if(pontos1==0)                                          //Se pontos do jogador = 0 o outro jogador é quem vence.        {cout<<"\t\t"<<jogador2<<" VENCEU O JOGO,PARABENS\n\n";         system("PAUSE");         system("cls");        }      else      {        cout<<"\t\t"<<jogador1<<" VENCEU O JOGO,PARABENS\n\n";        system("PAUSE");        system("cls");      }      pontos1=10;               //Restaura os pontos para iniciar uma nova partida.      pontos2=10;      opcoes=2;      break;case 2:cout<<"Renomear Jogadores\n";                                            //Volta pra etapa que pede o nome.               break;case 3:cout<<"Cada jogador lanca dois dados em cada rodada,\n"           <<"se a soma dos dados de um for maior que a do \n"            //Apresenta a regra.           <<"outro,o primeiro vence a rodada,e o outro \n"           <<"perde um ponto de vida,o processo se repete\n"           <<"sucessivamente ate que um dos jogadores perca\n"           <<"o jogo com 0 pontos de vida.\n\n";           system("PAUSE");           system("cls");            break;case 4:cout<<"Sair do programa\n";                     break;default :;}}while(opcoes!=4);                 //Garante que opção 4 finalize o programa.system("PAUSE");return 0;}int retornaGanhador(int soma1,int soma2){    cout<<endl<<endl<<"                                     ATACANTE:"<<jogador1<<"\n";    //Executa possibilidades tautológicas entre as somas.    cout<<"                                     DEFENSOR:"<<jogador2<<"\n";    if(soma1>soma2)       {cout<<jogador1<<" ACERTOU o ataque.\n"<<jogador1<<" venceu a rodada.\n";        pontos2--;       }    else if(soma1==soma2)        cout<<"EMPATE NOS DADOS.\n";    else if(soma1<soma2)             {cout<<jogador1<<" ERROU o ataque.\n"<<jogador2<<" venceu a rodada.\n";              pontos1--;             }    cout<<"                                     VIDAS:"<<jogador1<<" "<<pontos1<<" \n";    cout<<"                                     VIDAS:"<<jogador2<<" "<<pontos2<<" \n";if(soma1>soma2)         //Possibilidades tautológicas executadas para mudar de cor.{   system("color 0A");   system("pause");}else if(soma1<soma2)       {system("color 0C");        system("pause");       }else if(soma1==soma2)       {system("color 0F");        system("pause");       }     system("cls");}int sorteioprimeirojogador()       //Sorteio do primeiro jogador,semelhante a cara ou coroa.{    int jogador;    jogador=rand()%2;    return jogador;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu código tá muito difícil de entender sem indentação adequada pra eu se quer ver se consigo descobrir onde está o problema...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu código tá muito difícil de entender sem indentação adequada pra eu se quer ver se consigo descobrir onde está o problema...

Eu realmente tentei indentar parte por parte,cada detalhe,não sei onde melhorar.

 

@FelipeMV

 

Use o gdb (The GNU Project Debugger).

Depurando seu programa você saberá o que está acontecendo.

já ativei o depurador do codeblocks,coloquei pra rodar ele rodou não deu nada errado,marquei brakepoint na linha 156.Não sei como tem que usá-lo.,Como te disse não tem erro no programa mas queria entender essa linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui procurei um programa de indentação automática e achei um chamado AStyle e passei seu programa por ele:

 

#include<iostream>#include<cstdlib>#include<ctime>   //Para randomizar.#include<string.h> //Operações com strings.#include<conio.h> //Para mudar cor da fonte,limpar tela.#include<stdio.h> //Para limpar buffer.using namespace std;char jogador1[30],jogador2[30],x[30];            //Introduz variáveis globais.Vetor de caracteres x servirá para troca de strings.int pontos1=10,pontos2=10;int retornaGanhador(int soma1,int soma2);        //Introduz protótipo de funções.int sorteioprimeirojogador();int main(){    int opções,soma1,soma2,i,dado[4],y,z,a;        //Variável i é variável de controle,y e z servirão para troca de variáveis.    double anime=3000000000000;                    //Anime animára a tela,sendo um valor double para não transbordar(overflow).    srand(time(NULL));                             //Função para garantir aleatoriedade,sendo colocada no início para garantir aleatoriedade.    system("color A");                              //Muda a cor da fonte.    system("title JOGO DOS DADOS - ATAQUE FATAL");  //Muda titulo da barra principal do console.    do    {   if(opções!=3)                                                            //Se opções diferente de 3 então apelidos serão pegos.        {   cout<<"               Jogo dos Dados ATAQUE FATAL               \n\n";            fflush(stdin);                                                     //Limpa o buffer,pois na repetição do loop será necessário.            cout<<"Apelido do Jogador 1.\n";            cin.getline(jogador1,30,'\n');                                      //Coleta os apelidos dos jogadores.            cout<<"Apelido do Jogador 2.\n";            cin.getline(jogador2,30,'\n');            system("cls");                                                       //Limpa a tela.        }        while(anime>1)        {            cout<<" _______________________________________________________\n";            cout<<"|              *    *  ATAQUE FATAL  *    *             |\n";            cout<<"|           *   *          PLAY         *    *          |\n";            cout<<"|_______________________________________________________|\n\n";            system("cls");            cout<<" _______________________________________________________\n";            cout<<"|   *    *             ATAQUE FATAL             *    *  |\n";            cout<<"|*   *                     PLAY                   *    *|\n";            cout<<"|_______________________________________________________|\n\n";            system("cls");            cout<<" _______________________________________________________\n";            cout<<"|        *    *        ATAQUE FATAL       *    *        |\n";            cout<<"|     *   *                PLAY              *    *     |\n";            cout<<"|_______________________________________________________|\n\n";            system("cls");            anime=anime/2;                             //Dimuni  anime para dar a sensação de movimento até anime ser menor que 1        }        do        {   cout<<".-------------------------------------------------------\n";            cout<<"|   *    *               ATAQUE FATAL          *   *    |\n";            cout<<"|      *    *       JOGUE SEU DADO NA MESA  *   *       |\n";            cout<<"`---------------Digite a opcao desejada.----------------\n\n";            cout<<"1.Sortear o primeiro atacante.\n";            cout<<"2.Renomear jogadores.\n";            cout<<"3.Regras\n";            cout<<"4.Sair do jogo.\n";            cin>>opções;            if(opções!=1&&opções!=2&&opções!=3&&opções!=4)       //Caso o usuário digite uma opção diferente dessas  o programa apresenta opção inválida.            {   system("cls");                cout<<"OPCAO INVALIDA\n";            }        } while(opções!=1&&opções!=2&&opções!=3&&opções!=4); //Caso o usuário digite uma opção diferente dessas  o programa  permanece nessa tela.        system("cls");                    //Limpa a tela.        switch(opções)        {        case 1:            cout<<"                  Cada jogador tem 10 pontos de vida.\n";            a=sorteioprimeirojogador(); //Iguala a a para facilitar escrita.            if(a==0)                cout<<"                      "<<jogador1<<" e o PRIMEIRO a jogar.\n\n"; //O jogador 1 começa.            else            {   cout<<"                      "<<jogador2<<" e o PRIMEIRO a jogar.\n\n";  //O jogador 2 começa.            }            do {                if(a==0)                  //Se o sorteio resultar em 0.                {   cout<<jogador1<<" jogue os dados.\n";    //O jogador 1 começa.                    system ("color 0F");              //Muda a cor.                    system ("PAUSE");                }                //Pausa a tela.                else                                           //Caso sorteio resulte em 1.                {   cout<<jogador2<<" joque os dados.\n";           //O jogador 2 começa;                    system ("color 0F");                    system ("PAUSE");                }                system("cls");                for(i=1; i<=4; i++)             //Laço for para facilitar atribuição de 4 dados,utilização por vetor para facilitar.                {   dado[i]=(rand()%6) + 1;             //Escolhe um valor de 1 a 6 aleatoriamente.                    soma1=dado[1]+dado[2];                    soma2=dado[3]+dado[4];                }                if(a==0)                {   cout<<"                "<<jogador1<<" tirou nos dados "<<dado[1]<<" e "<<dado[2]<<" totalizando "<<soma1<<endl;                    cout<<"                "<<jogador2<<" tirou nos dados "<<dado[3]<<" e "<<dado[4]<<" totalizando "<<soma2<<endl;                }                else                {   cout<<"                "<<jogador2<<" tirou nos dados "<<dado[3]<<" e "<<dado[4]<<" totalizando "<<soma2<<endl;                    cout<<"                "<<jogador1<<" tirou nos dados "<<dado[1]<<" e "<<dado[2]<<" totalizando "<<soma1<<endl;                }                if(a==0)                {                    retornaGanhador(soma1,soma2); //Verifica quem atacou,quem defendeu,quantos pontos perdeu.                    strcpy(x,jogador1);                        //Troca jogadores para a proxima rodada.                    strcpy(jogador1,jogador2);                    strcpy(jogador2,x);                    y=pontos1;                    pontos1=pontos2;                    pontos2=y;                                    //Dessa maneira troca pontos.                    z=soma1;                    soma1=soma2;                                 //E troca-se a soma,garantindo uma lógica perfeita de troca.                    soma1=z;                }                else                {                    strcpy(x,jogador1);                    strcpy(jogador1,jogador2);                    strcpy(jogador2,x);                       //Troca jogadores para o jogador 2 começar o jogo,garantindo menos ifs e eles.                    y=pontos1;                    pontos1=pontos2;                    pontos2=y;                    z=soma1;                    soma1=soma2;                    soma1=z;                    retornaGanhador(soma2,soma1);                }            }            while(pontos1>0&&pontos2>0);       //Executa rodadas até que os pontos de algum dos jogadores seja igual a 0.            if(pontos1==0)                                          //Se pontos do jogador = 0 o outro jogador é quem vence.            {   cout<<"\t\t"<<jogador2<<" VENCEU O JOGO,PARABENS\n\n";                system("PAUSE");                system("cls");            }            else            {                cout<<"\t\t"<<jogador1<<" VENCEU O JOGO,PARABENS\n\n";                system("PAUSE");                system("cls");            }            pontos1=10;               //Restaura os pontos para iniciar uma nova partida.            pontos2=10;            opções=2;            break;        case 2:            cout<<"Renomear Jogadores\n";                                            //Volta pra etapa que pede o nome.            break;        case 3:            cout<<"Cada jogador lanca dois dados em cada rodada,\n"                <<"se a soma dos dados de um for maior que a do \n"            //Apresenta a regra.                <<"outro,o primeiro vence a rodada,e o outro \n"                <<"perde um ponto de vida,o processo se repete\n"                <<"sucessivamente ate que um dos jogadores perca\n"                <<"o jogo com 0 pontos de vida.\n\n";            system("PAUSE");            system("cls");            break;        case 4:            cout<<"Sair do programa\n";            break;        default :            ;        }    }    while(opções!=4);                 //Garante que opção 4 finalize o programa.    system("PAUSE");    return 0;}int retornaGanhador(int soma1,int soma2){    cout<<endl<<endl<<"                                     ATACANTE:"<<jogador1<<"\n";    //Executa possibilidades tautológicas entre as somas.    cout<<"                                     DEFENSOR:"<<jogador2<<"\n";    if(soma1>soma2)    {   cout<<jogador1<<" ACERTOU o ataque.\n"<<jogador1<<" venceu a rodada.\n";        pontos2--;    }    else if(soma1==soma2)        cout<<"EMPATE NOS DADOS.\n";    else if(soma1<soma2)    {   cout<<jogador1<<" ERROU o ataque.\n"<<jogador2<<" venceu a rodada.\n";        pontos1--;    }    cout<<"                                     VIDAS:"<<jogador1<<" "<<pontos1<<" \n";    cout<<"                                     VIDAS:"<<jogador2<<" "<<pontos2<<" \n";    if(soma1>soma2)         //Possibilidades tautológicas executadas para mudar de cor.    {        system("color 0A");        system("pause");    }    else if(soma1<soma2)    {   system("color 0C");        system("pause");    }    else if(soma1==soma2)    {   system("color 0F");        system("pause");    }    system("cls");}int sorteioprimeirojogador()       //Sorteio do primeiro jogador,semelhante a cara ou coroa.{    int jogador;    jogador=rand()%2;    return jogador;}

 

Não vejo nada que setando o valor de "opções" igual a 2 (ou não setando), alteraria o comportamento do programa. Tenta retirar essa linha e ver se o problema volta a ocorrer, se não, então o problema era outra coisa.

 

Obs: Se você não vai usar a opção "default" do comando switch você pode simplesmente removê-la.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isrnick valeu pela sugestão do programa,muito bom.

Também não entendi a lógica ,mas se você testar o programa vai ver que sem opções 2 o programa termina em alguns casos após a partida(quando um dos jogadores tiver vida igual a 0)

,já com opções igual a 2 isso não ocorre para nenhuma ocasião do jogo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei a solução substitui o tipo int de opções para char e fiz as devidas alterações,passando numeros do case para caracteres.Dessa forma pude retirar opções=2 porque assim o programa nao encerra mais sozinho.valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×