Ir al contenido principal

Adivinar un número de 4 cifras, picas y fijas

//Adivinar un número de 4 cifras, picas y fijas

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

using namespace std;

//Ayuda a generar número randómicos más eficientemente
int rdtsc()
{
    __asm__ __volatile__("rdtsc");
}

main()
{
	//Mostrar tildes y acentos del español
    setlocale(LC_CTYPE, "Spanish");
    int n[4] = { 0, 0, 0, 0 }, f = 0, p = 0, forzar = 0;

    char numero[4];
    char nusuario[4];
    // *secret es un apuntador a numero
    char* secret = numero;

    //Condiciones necesarias para generar números randómicos que no repitan digitos con un esfuerzo adicional
    while (n[0] == n[1] || n[0] == n[2] || n[0] == n[3] || n[1] == n[2] || n[1] == n[3] || n[2] == n[3] || forzar < 100) {
        // se untiliza la función rdtsc para generar mejores números randómicos
        srand(rdtsc());
        n[0] = rand() * time(0) % 10;
        n[1] = rand() * time(0) % 10;
        n[2] = rand() * time(0) % 10;
        n[3] = rand() * time(0) % 10;
        forzar++;
    }

    cout << "Este juego genera un número aleatorio de 4 cifras, usted deberá adivinarlo con las pistas arrojadas." << endl;
    cout << "Pica significa que algún número de los digitados esta dentro del número secreto" << endl;
    cout << "Fija significa que algún número de los digitados esta dentro del número secreto y se encuentra en la misma posición del número secreto" << endl;
    cout << "Usted cuenta con 10 oportunidades, mucha suerte!!!!!" << endl;

    for (int i = 0; i < 4; i++) {
        secret += sprintf(secret, "%d", n[i]);
    }

    int oportunidades = 0;
    int fijas = 0;

    while (oportunidades < 10 && fijas < 4) {
        int ln = 0;
        int repetido = 0;
        //Se debe validar que él número ingresado tenga 4 cifras y que no tenga cifras repetidas
        while (ln != 4 && ln != 100) {
            cout << endl
                 << "Ingrese un numero de 4 cifras: ";
            cin >> nusuario;
            ln = strlen(nusuario);

            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (nusuario[i] == nusuario[j] && i != j) {
                        ln = 100;
                    }
                }
            }

            if (ln == 100) {
                //Se recuernda al usuario que el número secreto no repite cifras
                cout << endl
                     << "Recuerde que el número secreto no tiene cifras repetidas" << endl;
                ln = 101;
            }
            else if (ln != 4) {
                //Se recuerda al usuario que el número debe ser de 4 cifras
                cout << endl
                     << "Recuerde que el número debe ser de 4 cifras" << endl;
            }
        }

		//Se compara cada cifra del numero secreto comparado con cada cifra del numero digitado por el usuario
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (nusuario[i] == numero[j] && i != j) {
                    p++;
                }
                if (nusuario[i] == numero[j] && i == j) {
                    f++;
                }
            }
        }

        fijas = f;
        oportunidades++;
        cout << "Usted tiene " << f << " fijas y " << p << " picas" << endl;
        f = 0;
        p = 0;
    };

    if (fijas == 4) {
        cout << endl;
        cout << "Usted ganó con " << oportunidades << " intentos." << endl
             << endl;
    }

    if (oportunidades >= 10) {
        cout << endl;
        cout << "Usted perdió" << endl;
        cout << "El numero oculto era: " << numero << endl
             << endl;
    }

    system("pause");
    return 0;
}

Comentarios