Colores random en C

Iniciado por Locura_23, 1 Mayo 2021, 21:38 PM

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

Locura_23

Hola a todos!
Tengo una duda con este programita de C, es muy simple y básico, se genera un número aleatorio del 1 al 10 y lee un valor por carga de usuario. Si el usuario acierta, me gustaría hacer que la consola cambie de colores random diciendo "ACERTASTE"... Pero no se me ocurre cómo, pues la función system("color") está hecha para mantener un color fijo...
Alguna idea? Yo sé que "código compartido es código a ser bastardeado" pero recién empiezo en esto xDD acepto críticas constructivas

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int RandomMin1Max10();
int CargaNum();

int main()
{
   /*llamar a la función random con mínimo  1 y máximo 10*/
   int bing; /**Número entre 1 y 10 generado aleatoriamente**/
   int bong; /**Número del usuario**/

   system("color 0C");

   bing = RandomMin1Max10();

   do
   {
       bong = CargaNum();

   }while (bong != bing);

}

int RandomMin1Max10()
{
   #include <time.h>

   srand(time(NULL));
   int valor;

   valor = (rand()%(10+1-1)+1);

   return valor;
}

int CargaNum()
{
   int num;
   puts("Ingrese su numero!\n");
   scanf("%d",&num);

   return num;
}



MOD: El código debe estar publicado entre etiquetas de Código GeSHi.

Danielㅤ

Hola, en realidad el compartir, utilizar, aprender o  modificar códigos ajenos no es ningún problema, el problema viene cuando se quitan los créditos/copyright  o que la persona que lo publica dice que es suyo cuando esa misma persona sabe que no lo es.

Hace poco aquí en el foro pasó eso mismo que un usuario pedía ayuda diciendo que era su código, lo que él supuestamente llevaba hecho cuando no fue así, era de otro usuario que lo comentó en el tema que éste usuario abrió y por lo tanto se terminó cerrando el tema porque el autor del tema no tuvo ética ni respeto al publicar un código ajeno idéntico al copiado diciendo que era suyo, pero más allá de eso no hay ningún problema con usar códigos ajenos, y si el código no está bien creado o se lo puede mejorar, entonces para eso estamos nosotros para ayudar con nuestros conocimientos y consejos.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

Locura_23

Cita de: [D]aniel en  2 Mayo 2021, 00:29 AM
Hola, en realidad el compartir, utilizar, aprender o  modificar códigos ajenos no es ningún problema, el problema viene cuando se quitan los créditos/copyright  o que la persona que lo publica dice que es suyo cuando esa misma persona sabe que no lo es.

Hace poco aquí en el foro pasó eso mismo que un usuario pedía ayuda diciendo que era su código, lo que él supuestamente llevaba hecho cuando no fue así, era de otro usuario que lo comentó en el tema que éste usuario abrió y por lo tanto se terminó cerrando el tema porque el autor del tema no tuvo ética ni respeto al publicar un código ajeno idéntico al copiado diciendo que era suyo, pero más allá de eso no hay ningún problema con usar códigos ajenos, y si el código no está bien creado o se lo puede mejorar, entonces para eso estamos nosotros para ayudar con nuestros conocimientos y consejos.


Saludos
Mmm pues este programita lo hice yo, pero vi que un mod escribió que tengo que poner etiquetas geshi? Te referís a eso?

K-YreX

Cita de: Locura_23 en  2 Mayo 2021, 02:15 AM
Mmm pues este programita lo hice yo, pero vi que un mod escribió que tengo que poner etiquetas geshi? Te referís a eso?
No, creo que [D]aniel ha sobreentendido, al parecer de forma errónea, el comentario de "código compartido" como que este era un código compartido que has encontrado por ahí.
Lo de las etiquetas de Código GeSHi simplemente es para facilitar la lectura de código al resto de usuarios.


Si con la función system() puedes poner un color a la consola, lo que puedes hacer es llamar varias veces a la función system() con diferentes colores. Si esto se hace de forma seguida no te dará tiempo a ver más que el último color por lo que tendrás que usar la función sleep() entre medias para crear un retardo.

La función sleep(int segundos) para sistemas Unix se encuentra en <unistd.h> mientras que para Windows la función es Sleep(int milisegundos) y se encuentra en <windows.h>. Una forma de que el código funcione en ambos sistemas sería:

#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif

void mySleep(int milliseconds) {
  #ifdef _WIN32
  Sleep(milliseconds);
  #else
  sleep(milliseconds / 1000);
  #endif
}


El problema del código anterior es que ocupa el hilo principal del programa. Si quieres una solución más compleja que vaya cambiando el color de la consola mientras, por ejemplo, esperas que el usuario introduzca una tecla para continuar; podrías utilizar hilos para ejecutar el código del cambio de color y el retardo en un hilo secundario mientras tú sigues ejecutando el código principal en el hilo principal. Pero como digo esto ya sería una solución más avanzada.
Código (cpp) [Seleccionar]

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

Danielㅤ

#4
No compañero, no entendí erróneamente.
Hay una confusión aquí y la aclaro, a lo que yo me referí en mí mensaje anterior es a esto:

Citar"código compartido es código a ser bastardeado"

Más que nada por ese comentario, por eso dije que no es problema que sea compartido, por lo que no tiene porqué ser "bastardeado", como si fuera un código críticado por ser compartido y por eso comente las razones por las que un código si puede ser criticado, pero éste no es el caso, solo fue un comentario.

Cita de: Locura_23 en  2 Mayo 2021, 02:15 AM
Mmm pues este programita lo hice yo, pero vi que un mod escribió que tengo que poner etiquetas geshi? Te referís a eso?

Me alegro que sea tu propio código.

A lo que el compañero K-YreX se refirió con las etiquetas de código GheShi es que cuando insertes código de programación debés ponerlo entre las etiquetas:

[code]Tu código aquí[/code]

Para que tú código sea mejor legible, esté mejor ordenado, se pueda ver la cantidad de líneas que tiene y pueda ser fácilmente copiado.




Con respecto a lo que querés hacer, si es posible y podes usar la función system():

A  continuación la lista de colores que podemos utilizar:

0 = Negro
1= Azul
2= Verde
3= Aguamarina
4= Rojo
5= Púrpura
6= Amarillo
7= Blanco
8= Gris
9= Azul Claro
A= Verde Claro
B= Aguamarina Claro
C= Rojo Claro
D= Púrpura Claro
E= Amarillo Claro
F= Blanco Brillante
Por Ejemplo si queremos que a la hora de ejecutar un código de programa con fondo de color azul y texto de color rojo, ingresamos:

system("color 14");

Donde el 1 sería para el fondo de color azul y el 4 para el texto de color rojo.

Esto es para C++ pero también funciona en C.

Fuente https://tutorialesgeek.wordpress.com/2013/05/24/cambia-el-color-del-texto-y-fondo-en-dev-c/

Aquí te dejo un video cambiando color de texto y fondo de la consola:

[youtube=640,360]https://m.youtube.com/watch?v=Vr-zztgsJa8
[/youtube]


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

Locura_23

#5
Cita de: K-YreX en  2 Mayo 2021, 13:42 PM
No, creo que [D]aniel ha sobreentendido, al parecer de forma errónea, el comentario de "código compartido" como que este era un código compartido que has encontrado por ahí.
Lo de las etiquetas de Código GeSHi simplemente es para facilitar la lectura de código al resto de usuarios.


Si con la función system() puedes poner un color a la consola, lo que puedes hacer es llamar varias veces a la función system() con diferentes colores. Si esto se hace de forma seguida no te dará tiempo a ver más que el último color por lo que tendrás que usar la función sleep() entre medias para crear un retardo.

La función sleep(int segundos) para sistemas Unix se encuentra en <unistd.h> mientras que para Windows la función es Sleep(int milisegundos) y se encuentra en <windows.h>. Una forma de que el código funcione en ambos sistemas sería:

#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif

void mySleep(int milliseconds) {
 #ifdef _WIN32
 Sleep(milliseconds);
 #else
 sleep(milliseconds / 1000);
 #endif
}


El problema del código anterior es que ocupa el hilo principal del programa. Si quieres una solución más compleja que vaya cambiando el color de la consola mientras, por ejemplo, esperas que el usuario introduzca una tecla para continuar; podrías utilizar hilos para ejecutar el código del cambio de color y el retardo en un hilo secundario mientras tú sigues ejecutando el código principal en el hilo principal. Pero como digo esto ya sería una solución más avanzada.
Lo pude solucionar, gracias! Tendré en cuenta lo de las etiquetas. Saludos.


Cita de: [D]aniel en  2 Mayo 2021, 15:04 PM
No compañero, no entendí erróneamente.
Hay una confusión aquí y la aclaro, a lo que yo me referí en mí mensaje anterior es a esto:

Más que nada por ese comentario, por eso dije que no es problema que sea compartido, por lo que no tiene porqué ser "bastardeado", como si fuera un código críticado por ser compartido y por eso comente las razones por las que un código si puede ser criticado, pero éste no es el caso, solo fue un comentario.

Me alegro que sea tu propio código.

A lo que el compañero K-YreX se refirió con las etiquetas de código GheShi es que cuando insertes código de programación debés ponerlo entre las etiquetas:

[code]Tu código aquí[/code]

Para que tú código sea mejor legible, esté mejor ordenado, se pueda ver la cantidad de líneas que tiene y pueda ser fácilmente copiado.




Con respecto a lo que querés hacer, si es posible y podes usar la función system():

A  continuación la lista de colores que podemos utilizar:

0 = Negro
1= Azul
2= Verde
3= Aguamarina
4= Rojo
5= Púrpura
6= Amarillo
7= Blanco
8= Gris
9= Azul Claro
A= Verde Claro
B= Aguamarina Claro
C= Rojo Claro
D= Púrpura Claro
E= Amarillo Claro
F= Blanco Brillante
Por Ejemplo si queremos que a la hora de ejecutar un código de programa con fondo de color azul y texto de color rojo, ingresamos:

system("color 14");

Donde el 1 sería para el fondo de color azul y el 4 para el texto de color rojo.

Esto es para C++ pero también funciona en C.

Fuente https://tutorialesgeek.wordpress.com/2013/05/24/cambia-el-color-del-texto-y-fondo-en-dev-c/

Aquí te dejo un video cambiando color de texto y fondo de la consola:

[youtube=640,360]https://m.youtube.com/watch?v=Vr-zztgsJa8
[/youtube]


Saludos
jaja lo de código bastardeado es de hecho, una frase de un profesor que tengo. En la clase el que es voluntario de mostrar su código, tendrá que explicar por qué hizo tal cosa y no esta otra, y si el código tiene ciclos de procesador demás (osea que puede ser mejorado) entonces se modifica el código en pos de eso.
Gracias por tu comentario! Saludos


MOD: Evitar varias respuestas seguidas. Responder a todos los mensajes en el mismo.
(Para agregar algo cuando nadie más ha respondido, se debe modificar el último mensaje y no crear uno nuevo)

K-YreX

Aunque está el tema solucionado, ya que se ha mencionado... Agrego unos últimos consejos para el código mostrado:
  • Agregar todas las librerías al principio del fichero. Esto facilita verlas todas de un único vistazo y tenerlas disponibles para todo el código.
  • Eliminar la librería <conio.h>. Esta librería no es estándar por lo que algunos compiladores darán error en esa línea. Su uso más visto sobre todo en personas que están empezando es para poder utilizar la función getch(). Esta función se puede sustituir por getchar() que cumple el mismo propósito y pertenece a <stdio.h>.
  • <bing> y <bong> no son los nombres más descriptivos para esas variables. Cuanto más ayude el nombre de una variable a identificar su función, mejor. Aunque hay que reconocer que tiene su gracia decir sus nombres... :xD
  • La semilla de los números aleatorios srand(...) se suele llamar una única vez en el main() aunque luego se utilice la función rand() en otras partes.
  • Las funciones que utilizas no son muy escalables digamos. Lo bueno de una función es declararla una vez y poder utilizarla múltiples veces. Ahora vamos a analizar la función que genera un número aleatorio:

    int RandomMin1Max10() {
        srand(time(NULL));
        int valor;
        valor = (rand()%(10+1-1)+1); // Al ser numero fijos no tiene mucho sentido dejar esas operaciones
        return valor;
    }

    Una función que genera un número aleatorio entre 1 y 10. Está bien, funciona bien pero... ¿no sería mejor poder decidir tú el límite cada vez que la llamas? Así la función será más reutilizable.

    int generarNumeroAleatorio(int minimo, int maximo) {
      return minimo + rand() % (maximo - minimo + 1);
    }


    Esto mismo con la función CargaNum(). ¿Y si puedes pasar el mensaje que quieras en cada ocasión?
    Además puedes dejar el buffer de entrada limpio siempre (lo que te ahorrará muchos quebraderos de cabeza cuando empieces a usar fgets() para pedir cadenas de texto al usuario, espero que os enseñen esta función en vez de gets()  :silbar: :silbar:)

    int pedirEntero(char *mensaje) {
      int numero;
      printf(mensaje);
      scanf("%d", &numero);
      while(getchar() != '\n'); // limpiar el buffer de entrada
      return numero;
    }


    Y con esto ya podemos dar el tema por cerrado para no desviarnos más del tema principal. :-X
Código (cpp) [Seleccionar]

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