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
#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.
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.
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:
#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;
}