[?]Tengo problemas con los contadores de un videojuego

Iniciado por nathaniel, 23 Mayo 2019, 07:49 AM

0 Miembros y 1 Visitante están viendo este tema.

nathaniel

Buenas a todos, estoy programando un videojuego del ahorcado que me encargaron para un proyecto.  Estoy a punto de terminarlo, lo único que no pude conseguir es que los contadores funcionaran bien, dejen explico:

El contador de "letras acertadas" debe empezar desde cero y el contador de "oportunidades restantes" en 5 cada vez que suba de nivel. En el segundo nivel si empieza de cero lo de "letras acertadas" pero en las "oportunidades restantes" puede empezar con un 4 en vez de un 5. Entenderán todo el lío en el código. Y bueno si alguien puede tomarse la molestia de leer el siguiente código y decir por lo menos algo que vale la pena intentar, sera de gran ayuda para alguien que ha perdido las esperanzas y ha recurrido a un foro. ;-)


DEV C++5.11
Código (cpp) [Seleccionar]
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <iostream>
#include "conio.h"
#include <time.h>
using namespace std;
int main() {
   char rep[100],temporal[100];
   char pal;
   char *palabra[]={"ambiente","cuidado","ecosistema","naturaleza","conservacion","recursos","equilibrio","forestacion","purifica","tierra","vida","ecologico","animales","ambiental","reciclaje","atmosfera","diversidad","energia"};
   char *frase;
   int tacertado,nivel;
   srand(time(NULL));
int k=0;
   int longitud,i,j,inicial,acertado=0,temp=0,oportunidades=5,n=1;
   int repetido=0,gano=0, nrepetidos = 0;
   char nombre, apellido,edad, direccion;

cout<<" AHORCADO JUEGO"<<endl;

system("pause");
while(oportunidades != 0)
{
oportunidades=5;
    acertado=0;
    repetido=0;
    nrepetidos=0;
    frase=0;
   for(int v=0;v<=1;v++)
   {
       frase=palabra[rand()%18];   //Guarda un palabra al azar de las 18 existentes
   }

  system("cls");

   longitud = 0;   //Variables utilizadas para longitud de la palabra
   inicial = 0;
   j = 0;
   
   rep[0] = ' ';
   rep[1] = '\0';

do{

   //Hacer todo hasta que las oportunidades(Vidas del juego) se acaben o adivine la palabra
   system("cls");
   temp=0;
cout<<" JUEGO DEL AHORCADO"<<endl;
cout<<endl;
       if(inicial == 0) {      //Calcula cuantas letras hay en la palabra con la funcion "strlen" y dependiendo de ello imprime los guiones bajos
        for(i=0;i<strlen(frase);i++) {
         if(frase[i] == ' ') {
           temporal[i] = ' ';
            longitud++;
         }
         else {
            temporal[i] = '_';      
            longitud++;
         }
        }
       }

       inicial = 1;

       temporal[longitud] = '\0';
       
   ////////////////////////////////////////////////////////////////////////////////
//FOR REPETIDOS
       repetido = 0;

       for(i=0;i<nrepetidos;i++) { //For para cuando se repite la letra, empieza si se introduce la misma letra 2 veces
          if(rep[i] == pal) {          //Ejemplo Palabra casa:
           repetido = 1;               //  _ _ _ _    <----------Ingresa "a" el usuario  REPETIDO=0                    
                                       //  _ a _ a    <----------Ingresa "a"            
         }
       }

       if(repetido == 0) {                 //For para contar los ACIERTOS
           for(i=0;i<=strlen(frase);i++) {
               if(frase[i] == pal ) {
                   temporal[i] = pal;
                   acertado++;
                   temp=1;
               }
           }
           if(temp == 0) {
               oportunidades = oportunidades - 1;
           }    //Si la letra es diferente y no es una repetitiva ni tampoco es un acierto se le quita una oportunidad

           nrepetidos++;
       } else {
        printf("Ya se ha introducido este caracter");
        printf("\n\n");
       }

////////////////////////////////////////////////////////////////////////////////

       printf("\n");

for(i=0;i<strlen(temporal);i++) {
       printf(" %c ",temporal[i]);
    }
     
printf("\n");

       if(strcmp(frase,temporal) == 0) {
           gano = 1;
           break;
       }
  cout<<endl;
  cout<<"Nivel "<<n<<endl;
       printf("\n");
       printf("Letras Acertadas: %d",acertado);
       printf("\n");
       printf("Oportunidades Restantes: %d",oportunidades);
       printf("\n");

rep[j] = pal;//Guarda el valor de "pal"(Letra que introduce el usuario) en un arreglo
       j++;

       if (oportunidades==0)
       {
          break;
       }

       printf("Introduzca una letra:");
       scanf("\n%c",&pal);

   }while(oportunidades != 0); //Hasta que no haya oportunidades o adivine la palabra imprime:

nivel=n-1;
   if(gano && oportunidades>0) {
       printf("\n\n");
       printf("Enhorabuena, has ganado.");
    }
       else{
        printf("\n\n");
       printf("Has perdido.");
       cout<<"La palabra era : "<<frase<<endl;
       cout<<"Puntaje total :"<<tacertado<<endl;
       cout<<"Nivel maximo : "<<nivel<<endl;
}
   system ("pause");
   n++;
   tacertado+=acertado;
}

   printf("\n\n");
   system("PAUSE");
   return 0;
}

Nota: Puede que a algunos les salga [Warning]deprecated conversion from...En mi caso era que el programa se desconfigura de vez en cuando, como solución lo abría en otro archivo nuevo.

K-YreX

No me voy a poner a revisar el código entero pero...
  • ¿Por qué mezclar C con C++? <printf()>/<cout> <scanf()>/<cin>...
  • ¿Por qué usar <conio.h>? Si lo necesitas para <getch()> tienes, <getchar()> (<cstdio>) o <cin.get()> (<iostream>) No es estándar y a muchos no nos dejará probar ese código al tener esa librería...
  • No uses <system(...)>. Usa <cin.get()> en vez de <system("pause")> y para limpiar la pantalla tienes la alternativa de hacer una función que pinte muchos saltos de línea.
  • <for> de la línea 30... ¿Por qué lo repites 2 veces la acción de asignar una palabra?
  • En la línea 18 yo diría que faltan punteros o... cada variable solo es un <char>?? ¿Por qué no usar <string>?

    Para códigos de ya un cierto tamaño es recomendable empezar a modularizar un poco. Crea funciones que hagan cosas específicas y si tienes problemas con algo solo tienes que mirar la función que se encarga de eso y no todo el código.

    Te dejo un pseudocódigo para que veas cómo lo puedes implementar.

    nivel := 0
    mientras nivel < NIVEL_MAX  and !has_perdido
        vidas := VIDAS_MAX - nivel // asi ya restas una vida al empezar cada nivel. Ten en cuenta que VIDAS_MAX > NIVEL_MAX
        mientras vidas > 0 and !acertado
            jugar()
        fin mientras
        has_perdido = !acertado // si has acertado no pierdes. Si te has quedado sin vidas, si
        si !has_perdido
            nivel := nivel + 1
        fin si
    fin mientras

    Se puede ahorrar alguna variable como <has_perdido> pero lo dejo así para que lo veas mejor.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

nathaniel

Oh si, ya lo resolví por mi cuenta. Bueno gracias por responder y por los consejos. Dejo el código aquí ya resuelto por si alguien lo necesita.  :rolleyes:

Código (cpp) [Seleccionar]
#include <stdlib.h>
#include <iostream>
#include "conio.h"
#include <time.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
int res=1,oportunidades=5,ni=1,tpuntaje=0;
    do{
   
char rep[100],temporal[100];
    char pal;
    char *palabra[]={"ambiente","cuidado","ecosistema","naturaleza","conservacion","recursos","equilibrio","forestacion","purifica","tierra","vida","ecologico","animales","ambiental","reciclaje","atmosfera","diversidad","energia"};
    char *frase;
    int tacertado=0,nivel=1;
    srand(time(NULL));
   

    int longitud,i,j,inicial,acertado=0,temp=0,n=1;
    int repetido=0,gano=0, nrepetidos=0;
     

    cout<<"JUEGO DEL AHORCADO"<<endl;
    /*printf("Introduzca la palabra a adivinar: ");
    gets(frase);*/
   
//while(oportunidades != 0)
//{
        oportunidades=5;
    acertado=0;
    repetido=0;
    nrepetidos=0;
    frase=0;
   
    for(int v=0;v<=1;v++)
    {
        frase=palabra[rand()%18];   //Guarda un palabra al azar de las 18 existentes
    }
   

    system("cls");
   
    longitud = 0;
    inicial = 0;
    j = 0;
   
    rep[0] = ' ';
    rep[1] = '\0';
   
   
    do {
   
        system("cls");
        cout<<"JUEGO DEL AHORCADO"<<endl;
        cout<<endl;
        temp=0;
   
        if(inicial == 0) {
         for(i=0;i<strlen(frase);i++) {
          if(frase[i] == ' ') {
            temporal[i] = ' ';
             longitud++;
          }
          else {
             temporal[i] = '_';       
             longitud++;
          }
         }
        }
   
        inicial = 1;
       
        temporal[longitud] = '\0';
 

       ///////ojo
       /*for(i=0;i<strlen(rep);i++) {
           if(rep[i] == pal) {
            repetido = 1;
            break;
          }
          else {
           repetido = 0;
         }
        }*/
       
        if(repetido == 0) {
         for(i=0;i<strlen(frase);i++) {
            if(frase[i] == pal) {
             temporal[i] = pal;
              acertado++;
              temp=1;
            }
          }
        }
       
      if(repetido == 0 && j>0) {
         if(temp == 0) {
           oportunidades = oportunidades - 1;   
    }
}

       /* else {
         printf("Ya se ha introducido este caracter");
         printf("\n\n");
        }*/
       
        printf("\n");
       
        for(i=0;i<strlen(temporal);i++) {
         printf(" %c ",temporal[i]);
        }
       
        printf("\n");
       
        if(strcmp(frase,temporal) == 0) {
            gano = 1;
            break;
        }
        printf("\n");
        cout<<"Nivel: "<<ni<<endl;
        printf("\n");
        printf("Letras Acertadas: %d",acertado);
        printf("\n");
        printf("Oportunidades Restantes: %d",oportunidades);
        printf("\n");
   
        rep[j] = pal;
        j++;
       
        if (oportunidades==0)
        {
           break;
        }
     
        printf("Introduzca una letra:");
        scanf("\n%c",&pal);
       
        for(i=0;i<j;i++) {
           if(rep[i] == pal) {
            repetido = 1;
            cout<<"Ya se ha introducido este caracter"<<endl;
            system ("pause");
            break;
          }
          else {
           repetido = 0;
         }
        }
     
    }while(oportunidades != 0);
   
   
    if(gano) {
    printf("\n\n");
    printf("Enhorabuena, has ganado.");
    printf("\n\n");
    printf("Deseas continuar: 1 = si, 2 = no :\n");
    scanf("%i",&res);
    if(res==1)
    {
    ni++;
    tpuntaje+=acertado;
}
    }
    else {
        printf("\n\n");
        printf("Has perdido.");
        cout<<"La palabra era "<<frase<<endl;
        cout<<"Puntaje total "<<tpuntaje<<endl;
        cout<<"Nivel maximo:"<<ni-1<<endl;
        printf("Deseas continuar jugando?: 1 = si, 2 = no :\n");
    scanf("%i",&res);
    if(res==1)
    {
    ni=1;
    tpuntaje=0;
}
    }

}while (res!=2);
    system("PAUSE");
    return 0;

}