[SOLUCIONADO] Picas y Fijas

Iniciado por Sudh0zi, Mayo 27, 2020, 10:30:13 PM

Tema anterior - Siguiente tema

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

Mayo 27, 2020, 10:30:13 PM Ultima modificación: Mayo 30, 2020, 05:36:57 PM por Gabriela
Buenas.

Estoy empezando en C++ y me han pedido realizar el juego de "Picas y Fijas" en C++ con funciones.

Me han proporcionado el código pero debo hacer las siguientes modificaciones:
- Pasarlo a C++
- Utilizar 4 funciones
    - Generar el número aleatorio
    - Número de picas
    - Número de fijas
    - Una función que evalúe si el número aleatorio ya se encuentra dentro del arreglo

Código: c
#include <iostream>
#include <ctime>
#include <stdlib.h>



int main(int argc, char** argv) {

// inicio de declaraciÛn de variables
int numa[4];  // arreglo de enteros donde se guarda el numero inicial
int nume[4];  // arreglo de enteros donde se guarda el numero ingresado popr el usuario
int fijas,picas,num=0,i;  // num numero de intentos
// fin de declaraciÛn de variables

//inicio llenar vector aleatorio
    srand (time(NULL));

    for( i = 0; i < 4; i++){
    int b = rand()%10;
    int c = 0;
    for( int j = 0; j < i; j++){
    if (numa[j]== b) c = 1;
}

    if(c==0){
    numa[i] = b;
} else {
i--;
}

}
    //fin llenar vector aleatorio

   for( i = 0; i < 4; i++){
    printf("%d\n",numa[i]);
}
   
//inicio del juego
    printf("JUEGO PICAS Y FIJAS\n\n");
    for( i = 0; i < 12; i++){
    printf("Ingrese cada digito seguido de un enter\n");
    for( int j = 0; j < 4; j++){
    printf("%d.- ",j+1);
    scanf("%d",&nume[j]);
    }

    picas = 0; fijas = 0;   

    //inicio hayar fijas
    for( int l=0;l<4;l++){
            if (numa[l]==nume[l]){
                fijas++;
            }
}
//fin hayar fijas
       
//inicio hayar picas
    for( int l=0;l<4;l++){
            for( int m=0;m<4;m++){
            if (numa[l]==nume[m]){
                  picas++;
                }
            }
}
picas-= fijas;
//fin hayar picas

    if(fijas == 4) break;
num++;
printf("intentos: %d, fijas: %d, picas: %d\n",num,fijas,picas);
}
    //fin del juego


//inicio mensaje de salida
if(num < 4) printf("Bien, Excelente\n");
else if(num <  8 ) printf("Bien, Aceptable\n");
else if(num < 12) printf("Bien, Regular\n");
else printf("Mal, este juego como que no es para ti\n")

    for( i = 0; i < 4; i++){
    printf("%d\n",numa[i]);
}
//fin mensaje de salida
return 0;
}

En verdad he intentado muchas cosas pero nada me funciona...

De antemano, agradezco su colaboración :)




Mayo 29, 2020, 05:54:59 AM #1 Ultima modificación: Mayo 30, 2020, 11:03:44 PM por d3adly
Hola @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Respecto a las funciones
La de generar un numero aleatorio podria quedar asi
Código: cpp

void GenerarNumero(int (&nArray)[4]){
srand(time(nullptr));
for(int i = 0; i < 4; i++){
int b = rand()%10;
        if(!EstaEnArreglo(b, nArray, i)){
        nArray[i] = b;
        } else {
i--;
}
    }
}


Y te explico la linea
Código: php
int (&nArray)[4]

Se le pasa por referencia un array de 4 enteros por eso el & antes del nombre de la variable nArray, asi cualquier modificacion a la variable dentro de la funcion se conserva al final de la misma.
Eso si, si le pasas un array mayor de cuatro te dara error de compilacion ya que esta esperando un array de 4. Para solucionar este problema y pasar un array de numero indefinido se puede emplear el uso de templates
Código: php
template<typename T, size_t N>


Y asi la funcion se podria modificar quedando asi
Código: php
void GenerarNumer(T (&nArray)[N])


Pero ya que este ejercicio requiere de 4 te queda de tarea el uso de templates ;D

La funcion para obtener el numero picas se podria implementar de la siguiente manera
Código: cpp
int NPicas(int nArrayA[], int nArrayB[]){
int iPicas = 0;
for( int l=0;l<4;l++){
for( int m=0;m<4;m++){
            if (nArrayA[l]==nArrayB[m]){
iPicas++;
            }
        }
    }
    return iPicas;
}

Esta funcion retorna un valor entero fijate el int antes de el nombre de la funcion, recibe como parametro dos arrays nArraA y nArraB. Se declara primero la variable iPicas y se inicializa a 0 para poder ir incrementando su valor. Luego se compara cada elemento verificando si se encuentra en el array, de ser asi se incrementa la variable local iPicas. Al finalizar la comparacion la function retorna el valor de la variable local iPicas.

La funcion para obtener el numero de fijas se puede implementar de la siguiente manera
Código: cpp

int NFijas(int nArrayA[], int nArrayB[]){
int iFijas = 0;
for( int l=0;l<4;l++){
        if (nArrayA[l]==nArrayB[l]){
iFijas++;
        }
    }
return iFijas;
}

Esta funcion al igual que la otra retorna un valor entero y  recibe dos array como parametros nArraA y nArraB. A diferencia de la anterior solo se hace un for ya que la posicion del numero debe ser exacto, al igual que la funcion anterior se declara una variable local llamada iFijas que va incrementando segun se encuentre una concordancia en el bucle. Al final la funcion retorna el valor local de iFijas.

Y por ultimo la funcion para verificar si el numero generado aleatoriamente ya se encuentra en el arreglo
Código: cpp

bool EstaEnArreglo(int iNumero, int nArray[], int iArrTam){
for(int i = 0; i < iArrTam; i++){
if(iNumero == nArray[i]){
return true;
}
}
return false;
}

Esta funcion retorna un valor del tipo bool, osea verdadero o falso. Recibe como parametro el numero a verificar iNumero, el array en el cual verificar si existe el numero proporcionado (nArray) y el tamaño actual de los valores seteados dentro del arreglo, para evitar recorrer el arreglo innecesariamente iArrTam. Si el numero ya se encuentra retorna true, de lo contrario finaliza el bucle y retorna false.

Con lo cual tu codigo podria quedar de la siguiente manera
Código: cpp

#include <iostream>
#include <ctime>
#include <cstdlib>

bool EstaEnArreglo(int iNumero, int nArray[], int iArrTam){
for(int i = 0; i < iArrTam; i++){
if(iNumero == nArray[i]){
return true;
}
}
return false;
}

void GenerarNumero(int (&nArray)[4]){
srand(time(nullptr));
for(int i = 0; i < 4; i++){
int b = rand()%10;
        if(!EstaEnArreglo(b, nArray, i)){
        nArray[i] = b;
        } else {
i--;
}
     
    }
}

int NPicas(int nArrayA[], int nArrayB[]){
int iPicas = 0;
for( int l=0;l<4;l++){
for( int m=0;m<4;m++){
            if (nArrayA[l]==nArrayB[m]){
iPicas++;
            }
        }
    }
    return iPicas;
}

int NFijas(int nArrayA[], int nArrayB[]){
int iFijas = 0;
for( int l=0;l<4;l++){
        if (nArrayA[l]==nArrayB[l]){
iFijas++;
        }
    }
return iFijas;
}

int main(int argc, char** argv) {
     
       int numa[4];
       int nume[4];
       int fijas = 0,picas = 0,num = 0, i = 0;
       GenerarNumero(numa);
       
       //Esto deberia de ocultarse para no hacer visible el numero a adivinar
   //**************************
       for( i = 0; i < 4; i++){
           std::cout<<numa[i]<<' ';
       }
       std::cout<<'\n';
       //***************************
       std::cout<<"JUEGO PICAS Y FIJAS\n\n";
        for( i = 0; i < 12; i++){
           std::cout<<"Ingrese cada digito seguido de un enter\n";
           for( int j = 0; j < 4; j++){
              std::cout<<j+1<<".- ";
              scanf("%i",&nume[j]);
}
     
picas = 0; fijas = 0;       
     
fijas = NFijas(numa, nume);
picas = NPicas(numa, nume);
picas-= fijas;
         
           if(fijas == 4) break;
          num++;
          std::cout<<"intentos: "<<num<<" fijas: "<<fijas<<", picas: "<<picas<<"\n";
       }
       if(num < 4) std::cout<<"Bien, Excelente\n";
       else if(num <  8 ) std::cout<<"Bien, Aceptable\n";
       else if(num < 12) std::cout<<"Bien, Regular\n";
       else std::cout<<"Mal, este juego como que no es para ti\n";
     
        for( i = 0; i < 4; i++){
           std::cout<<numa[i]<<' ';
}
std::cout<<'\n';
       return 0;
    }


Por ultimo te si te apasiona la programacion te recomiendo leer mucho y sobre todo practicar, espero te funcione.

Saludos.
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn

¡Hola! @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Te quedó perfecto, mil gracias por tomarte el tiempo de realizarlo y explicarlo.

¡Saludos!

Me alegro ayudarte, cualquier duda no vaciles en pedir ayuda.
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn