Facebook Google+


Juego de Quién quiere ser Millonario en Borland C/C++
#1
Hola, miren este es el programa q estoy haciendo es como "Quien quiere ser millonario ?" ayudenme a mejorarlo si se le puede poner sonido o algo mas way.

Lo hice en Borland 5.02
 
Reply
#2
Hola, mide como 1 Km de largo Tongue
 
Reply
#3
Se ve muy bueno tu juego, que es lo que necesitas, agregarle sonido ?
 
Reply
#4
Es un poco lineal, ¿no?
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#5
@MAFUS como que si hay funciones pero el hecho de no separar la logica de las vistas (todos esos cprintf + gotoxy) hace el codigo muy largo, larguisimo. Podria todo eso estar en un arreglo o incluso sacarse a un archivo.
 
Reply
#6
hola todos yo soy el dueño del programa si como podria mejorarlo?

@"Master" como podria reducirlo como tu dices
 
Reply
#7
Lo primero es separar un poco las funciones y demas estructuras de control para que sea mas legible.
 
Reply
#8
(08-24-2016, 09:15 PM)Master escribió:
(08-24-2016, 09:08 PM)Don Ayo EL Angel Negro escribió: hola todos yo soy el dueño del programa  si como podria mejorarlo?

@"Master"  como podria reducirlo como tu dices

Hola, es como tarde en mi pais pero mañana y no uso Borland pero mañana te muestro, básicamente tu programa necesita un solo gotoxy() y un solo cprintf()

Además podrias formatear tu codigo con espacios (identación) y separar un poco las funciones y demas estructuras de control para que sea mas legible.


Mañana te muestro! puedes regresar en horas de la tarde si te parece Smile

Ya gracias mi pana soy de ecuador te lo agradeceria mucho. Bueno en q programa lo harias?
 
Reply
#9
Voy a tratar de usar Borland (Embarcadero) para no tener que modificar tanto tu programa, por suerte hace poco me baje una copia gratuita que ofrecian como promoción. Ahora Embarcadero está ofreciendo gratis un IDE para Pascal

Conozco Guayaquil, tiene cosas muy bonitas como El Malecon.

Mañana lo vemos Smile
 
Reply
#10
Lo que yo veo y comento en forma constructiva es que usas la función cout() y cin() pero son propias de C++ y tu programa a juzgar por las biliotecas o librerias que incluyes se me hace que es en lenguaje C y no C++, eso solo ya genera problemas de portabilidad porque no va a compilar facilmente: deberia compilarse con un compilador de C o de C++ ?  otro detalle: la función gotoxy() no es portable.

Una funcion main() debe tener unas pocas lineas ya que solo son llamadas a funciones (podría tener 5 lineas o menos seguramente), en este juego tiene 2059 lineas! el programa completo tiene 2232 lineas de código y con menos lineas se ha hecho un emulador de 8086 por ejemplo.
 
Reply
#11
Bueno, estube mirando el código.... es TAN largo..... y están mezclada la lógica con todo lo que se imprime que me demoraría horas en arreglarlo.

Habia pensado en crear varios archivos de texto con los distintos dibujos en modo texto que se muestran y hacer un tipo de cache para no estar leyendo esos archivos a cada rato. Cada archivo de texto seria una pequeña "vista", logrando de una vez separar la representación de la "lógica de negocio".

Como ya  veo que me va a llevar mucho tiempo ...... voy a dar otra opción para re-factorizar el código..... ya luego se podria llevar a la forma que digo antes:

Código:
void mostrarMillonario(){
//...
}

void mostrarBanner(){
        clrscr();
        system("color 9A");
        gotoxy(15,1);printf("nn================================================================================nn");
        system("color 9A");
        textbackground( 1 );
        textcolor( 11 );
        gotoxy(15,5); cprintf("     ....Q U I E N  Q U I E R E  S E R....    ");
        gotoxy(15,6); cprintf("                                              ");
        mostrarMillonario();
}

void mostrar1000(){
}

void mostrar2500(){
}

void mostrar4500(){
}

Notar que los gotoxy() tambien se pueden refactorizar porque comienzan de una posicion (f0,c0) y luego solo van incrementando la fila .
 
Reply
#12
He refactorizado el programa y portado a Linux. Se ha optimizado para una consola de 80x24 y el control de ésta se realiza mediante secuencias de escape para terminales ANSI VT100/VT52.

Edición: Archivo actualizado. Corrección menor de errores y eliminación Sleep(50); innecesarios.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#13
UFFFFFFFF que trabajo @MAFUS !!! 

Ahora el compañero autor del programa podria intentar re-factorizar todos esos cuadros con preguntas, si vamos al caso son solo rectangulos donde en determinadas posiciones (fijas) coloca 4 preguntas.
 
Reply
#14
Esta muy bien logrado MAFUS, sobre todo por compatibilidad con Linux y con todo mide menos de la mitad de número de lineas de código de programa!
 
Reply
#15
Todavía se pude estructurar más haciendo que exista una función que dibuje el recuadro de las preguntas y otra que se encargue de rellenar los textos según la pregunta en que se encuentra.

Por otra parte se hace uso de funciones callback para la funcion banner_blink, ésta se encarga de llamar a la funcion que le pasemos; ésta última será la encargada de dibujar el valor del premio obtenido, mientras banner_blink solo se encarga de efectuar el efecto de parpadeo.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#16
Se me habia pasado por alto lo de la función banner_blink() pero sin duda es una de las cosas más interesantes de tu refactorización y a la vez un buen ejemplo de uso de punteros a función Big Grin
 
Reply
#17
Se me ocurrió una forma de re-factorizar todos esos pares de cprintf() con gotoxy() creando una función fusión de ambas:

Código:
typedef struct Point {
    int x;
    int y;
} Pt;

Pt cursor;

void gprintf(char* str, int x=-1, int y=-1){
    if (x!=-1 && y!=-1){
       cursor.x = x;
       cursor.y = y;         
    }

    gotoxy(cursor.x ,cursor.y);
    cprintf(str);
    cursor.y++;
}

La idea es reemplazar la llamada al  par gotoxy / cprintf con una llamada a gprintf()

Si se llama a gprintf() con solo el "string" pues luego hará sola el salto de linea pero manteniendose encolumnada.

EDIT: la he probado (despues de revisar el código alertado por MAFUS de un error) y funciona perfectamente en C++ pero para lenguaje C deberia cambiarse por el tema de no soportar directamente parámetros opcionales.
 
Reply
#18
Necesitarías de variables estáticas, pues cuando llames a la función con solo la cadena x e y se reiniciarán a -1. El resultado seria un cprintf normal, escribiendo a partir de donde se ha quedado la última vez el cursor.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#19
Tienes razón, la idea creo no estaba mal.... pero fallé al codearla, estoy he editando la respuesta y ya funciona como esperaba.
 
Reply
#20
(08-26-2016, 04:31 PM)Master escribió: Tienes razón, la idea creo no estaba mal.... pero fallé al codearla, estoy he editando la respuesta para que la revises si quieres .... pero debería funcionar.

Me disculpo, ando sin ganas de compilar.

Hola buenas Master veo q han discutido bien mi tema y te lo agradezco pero no entiendo mucho sobre las funcionea de las q hablan xq yo se C++ basico

Pero si les has podido compilar con lo que dices?
 
Reply
#21
Si aún no has aprendido a usar punteros a funciones puedes usar el código de Master y una tabla, una por cada banner, para hacer los destellos.
Aunque si todavía no has llegado a los punteros puedes continuar con el código lineal.

Por otra parte revisa la lógica de tu aplicación. Tuve que rehacerla porqué en caso de fallo caía en cascada por las demás preguntas y al final había un montón de ifs anidados. A diferencia de lo que se suele decir, la sentencia goto es útil, por ejemplo en casos como este.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#22
ayayay  ose a que haria esos baners y  llamarlos en el progrma cada vez q los necesite o algo asi?
 
Reply
#23
Sí, eso es.

La idea es ver lo que se repite en tu programa (un cálculo, una imagen, un proceso). Como siempre van a ser las mismas órdenes las metes en una función, y llamas a esa función cada vez que la necesites; así te quitas mucho código de encima.

Si esa función varía en los datos que debe tratar, por ejemplo mostrar 'hola' por pantalla  o mostrar 'adiós' por pantalla, está claro que la función hace lo mismo, mostrar cosas por la pantalla, pero esas cosas son diferentes, pues en ese caso haces que tu fución acepte argumentos que serán los datos a tratar. En el ejemplo anterior printf("hola") printf("adios") respectivamente.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#24
Por lo general cuando tengo que hacer un cuestionario si puedo lo hago con clases, aglo así:

Código:
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
#include <ctime>
#include <algorithm>
#include <cstdlib>
using namespace std;

static const size_t ResuestasMax = 4;

class Pregunta
{
    int indice;
    string pregunta;
    string respuestas[ResuestasMax];
    int respuestaCorrecta;

    public:
    Pregunta (string _pregunta)
    {
        pregunta = _pregunta;
        indice = 0;
    }

    // posible respuesta; admite solo una como correcta
    void AgregarRespuesta(string rta, bool correcta=false){
        respuestas[indice] = rta;
        if (correcta)
            respuestaCorrecta = indice;
        indice++;
    }

    // solo para testeos
    string MostrarRespuestas(){
        int i;
        string out="";
        for (i=0;i<ResuestasMax;i++)
            out += respuestas[i] + "\n";

        return out;
    }

    void Mezclar(){
        int k;
        for (k = 0; k < ResuestasMax; k++) {
            int r = k + rand() % (ResuestasMax - k); // careful here!
            swap(respuestas[k], respuestas[r]);
        }
    }

    // toString()
    // http://stackoverflow.com/questions/5171739/tostring-override-in-c
    friend std::ostream & operator<<(std::ostream & _stream, Pregunta & mc) {
        _stream << mc.MostrarRespuestas() << std::endl;
    }
};


class Quiz
{
    vector <Pregunta> preguntas;

    public:
    void AgregarPregunta(Pregunta p){
        preguntas.push_back(p);
    }

    void Mezclar(){
        random_shuffle ( preguntas.begin(), preguntas.end() );
    }

    // solo para testeos
    string MostrarPreguntas(){
        unsigned int i;
        string out="";

        for (i=0;i<preguntas.size();i++){
            out += preguntas.at(i).MostrarRespuestas()+ "\n";
        }

        return out;
    }

    // ToString()
    friend std::ostream & operator<<(std::ostream & _stream, Quiz & mc) {
        _stream << mc.MostrarPreguntas() << std::endl;
    }
};

 int main(int argc, _TCHAR* argv[])
{
    Quiz q;

    Pregunta p1("Quién inventó la dinamita");
    p1.AgregarRespuesta("Nobel",true);
    p1.AgregarRespuesta("Pascal");
    p1.AgregarRespuesta("Angstrom");
    p1.AgregarRespuesta("Nadal");
    p1.Mezclar();
    q.AgregarPregunta(p1);  // la agrego al Quiz

    Pregunta p2("Quién descubrió América");
    p2.AgregarRespuesta("Americo Vespuscio");
    p2.AgregarRespuesta("Cristobal Colón",true);
    p2.AgregarRespuesta("Los vikingos");
    p2.AgregarRespuesta("No fue aun descubierta");
    p2.Mezclar();
    q.AgregarPregunta(p2);  // la agrego al Quiz

    // por ultimo mezclo las preguntas
    q.Mezclar();

    // imprimo (es para verificar el funcionamiento)
    cout << q;

    getchar();
    return 0;
}

Obviamente falta implementar métodos (funciones) pero es un "esbozo" y la única falla que tiene es que en cada ejecución produce el mismo orden de preguntas y orden de respuestas posibles (ni idea porque)

Con eso haces la "lógica de la aplicación", ahora si quieres ver una implementación 100% funcional la tengo hecha en PHP

Clase Cuestionario en PHP
 
Reply
#25
Genial Master solo ten cuidado con usar demasiado las funciones inline 
Saludos....
 
Reply
#26
Gracias.

Si, no he usado funciones "inline" -me estresan porque a veces me dan problemas con los parámetros opcionales- así que solo usé "member functions" al estilo tradicional.
 
Reply
#27
Realmente estas usando funciones inline, si la implimentacion esta dentro de la clase en automatico es inline no se tiene que especificar el keyword inline.
Si realmente quieres definir funciones miembro tienes que hacerlo de la manera lagara especficado a que clase pertenece y tiene que estar fuera de la clase.

Para mayor informacion puedes ver el siguiente enlace:
http://northstar-www.dartmouth.edu/doc/i...imfunc.htm
Saluldos...
 
Reply
#28
Cierto amigo, me quedé pensando que la habia embarrado con lo de funciones inline ........ y llego para ver que asi era Big Grin
 
Reply
#29
Bueno cielos me han dejado anonado con sua conocimientos .
Les agradeeceria si al doc q subi me le pudieran hacer la parte q dice el compañero @Mafus para hacer esos baner de puntos
Y lo del sonido no se puede?
 
Reply
#30
@iiJokeer, un Moderador te había dejado este mensaje por el chat:

Cita:Seguramente puedas usar una api para reproducir tu sonido de background amigo, se llama mciSendStringA, y hay varios ejemplos en multiples lenguajes para que puedas utilizarla.
 
Reply
#31
Bueno, he escrito otra función gprintf() que no utiliza ningun struct como cursor ni tampoco variables estáticas Smile ahora con esa función y unas pocas lineas más de código he hecho un "módulo" para imprimir banners para usar en este programa:





La idea es usar esa clase para imprimir "Millonario", o los puntos ganados {"1000", "2500", etc} en un buen tamaño y solo usando una función tipo print()

Más aquí:
http://hardforo.com/thread-1097.html
 
Reply
  


Salto de foro:


Browsing: 1 invitado(s)