Ramdomización o Aleatorización! en C

Ahh (satisfacción) valores random, valores random! (8) un tema que nos sera de mucha ayuda en muchos tipos de problemas, haz pensado en como funcionaria una maquina de casino en la computadora? ¿te gustaría crear un juego?
Bueno pues este sera el momento de nuestro primer juego! que tal un juego de dados? o un traga monedas?
Tal vez puedas hacer los dos, o tal vez mas! usa tu imaginación y tu lógica, También puedes comentar tus aplicaciones en la sección de preguntas y respuestas comentarios, después yo las pasare el nuevo blog (próximamente) de aplicaciones y scenery.

y bueno ahora, ya que estamos animados, comencemos con el tuto.

Que ocuparemos para poder llegar a nuestro objetivo: Random.

Libreria: stdlib.h
Contiene prototipos de la funcion para la convercion de numero a texto y texto aa numeros, asignacion de memoria, numeros aleatorios entre otras funciones.
 Funcion: rand    Intrucción: i = rand ();
rand genera un numero entero sin signo entre 0 y RAND_MAX (definida en el encabezado <stdlib.h>)
el valor debe ser menor que 32767, siendo eso todos los numero tienen la misma oportunidad de salir, sera solo cuestión de suerte.
Valor de escalamiento rand() % x

(x equibale a cualquier numero que queramos poner) si cambiamos ese x por un 6, cualquier numero ubicado entre 0 y 6 (RAND_MAX) podrá salir con la posibilidad de 1/7 % cada uno. para poder iniciar el rango en 1 necesitamos ponerlo asi:
1 + (rand () % 6) ahora si el rango sera de entre 1 y 6 y tendrá 1/6 % de posibilidad de salir cada numero ubicado entre esos 2 
con código seria algo así:


# include <stdio.h>
# include <stdlib.h>
int main ()
{
  int i;
  for(i = 1; i <= 5; i++){
      printf("%10d", 1 + (rand() % 6);
  }
  return 0;
}
el código anterior genera esto en pantalla(supongamos):

                    5 6 2 4 3
5 numero aleatorios de entre 1 y 6, pero en realidad no es random, estos valores se volverán a poner cada vez que se abra el programa, nada es lo que parece. solo parecen random pero ya vimos que no es así.

¿como hacer random en realidad?
una forma es mediante la entrada de daros por el usuario, esto se llama semilla.
para esto ocuparemos unsigned int. que aunque finito es un numero muy extenso, de 0 a 4294967295, para poder hacer la randomización mas extensa. el tipo de dato de representacion es "%u" como el "%d" en el entero común.
pero en realidad de esta forma no seria random en realidad, tampoco, como fue en el anterior.


Ya deja de jugar conmigo me tienes levantado de los pelos... ¿como hago un random verdadero?!
Ok, dejare tus pelos en paz, explicar lo anterior era necesario para comprender el porque de esta forma siguiente.

Ahora ocuparemos otras cosas, aparte de las anteriores.

Libreria: <time.h>
Todo lo referente al tiempo: Fecha y hora
Funcion: time () ---> time (NULL)
time () pone la hora del día en formato de Horas:Minutos:Segundos, al poner el NULL entre el parentesis lo que estamos haciendo es romper el formato dejándolo solo en Segundos. dividiendo las horas entre 60, los minutos entre 60 y dejando la cantidad de segundos.

_______________ESO SERA TODO LO NECESARIO_______________ 

Ahora vamos a programar nuestro juego! Esta ves sera un traga monedas en linea recta de 3 filas y de 6 figuras. recordemos las reglas del juego: para poder sacar un premio (dependiendo la figura que se saque) tiene que ser en linea recta de 3 valores iguales:
  1. A-A-A              (premio maximo! gana 1,000,000 y 10 fichas mas!)
  2. B-B-B              (gana 100,000 puntos!)
  3. X-X-X           (gana 50,000 puntos!)
  4. G- - -              ( ganaran 1,000 puntos, solo si uno de los 3 es G)
  5. Z-Z-Z             (gana 2 fichas mas!)
  6. F-F-F             (gana 1 ficha,(otra oportunidad))


Ya se establecieron los valores, cabe mencionar que el juego es de mi autoría, ahora vamos a empezar el codigo.
 se empieza el juego con 20 fichas, al final del juego (cuando se acaben las fichas) se dice cuantos puntos se acumularon
  1. /* Programa 4.0: juego traga monedas de casino*/
  2. # include <stdio.h>
  3. # include <stdlib.h>
  4. # include <time.h>

  5. int main ()
  6. { /*Declarando variables */
  7. int fichas; 
  8. int jt;
  9. int cas1;
  10. int cas2;
  11. int cas3;
  12. int puntos;
  13. int A = 'A', B = 'B', X = 'X', G = 'G', Z = 'Z', F = 'F';
  14. /* fin de declaracion */
  15. fichas = 20;
  16. puntos = 0;
  17. /* utilizando el segundos del día para randomizar */
  18. srand (time(NULL));
  19. printf (" Tu estatus actual es Fichas: %d, Puntos: %d\n", fichas, puntos);
  20. while (fichas > 0) {
  21. printf("Para jalar la palanca del traga monedas escriba: 1");
  22. scanf("%d\n",&jt);
  23. if(jt != 1) {
  24. printf("Error 001: no se introdujo 1, usted itrodujo:%d", jt);
  25. }
  26. else {
  27. --fichas; /* resta una ficha y abajo ramdomiza */
  28. cas1 = 1 + (rand () % 6);
  29. cas2 = 1 + (rand () % 6);
  30. cas3 = 1 + (rand () % 6);
  31. /* lanza a pantalla las letras */
  32. /* casilla 1 */
  33. if (cas1 == 1) {
  34. printf("%c", A);
  35. }
  36. else
  37. if (cas1 == 2) {
  38. printf("%c", B);
  39. }
  40. else
  41. if (cas1 == 3) {
  42. printf("%c", X);
  43. }
  44. else
  45. if (cas1 == 4) {
  46. printf("%c", G);
  47. }
  48. else
  49. if (cas1 == 5) {
  50. printf("%c", Z);
  51. }
  52. else
  53. if (cas1 == 6) {
  54. printf("%c", F);
  55. }
  56. /* casilla 2 */
  57. if (cas2 == 1) {
  58. printf("-%c", A);
  59. }
  60. else
  61. if (cas2 == 2) {
  62. printf("-%c", B);
  63. }
  64. else
  65. if (cas2 == 3) {
  66. printf("-%c", X);
  67. }
  68. else
  69. if (cas2 == 4) {
  70. printf("-%c", G);
  71. }
  72. else
  73. if (cas2 == 5) {
  74. printf("-%c", Z);
  75. }
  76. else
  77. if (cas2 == 6) {
  78. printf("-%c", F);
  79. }
  80. /* casilla 3 */
  81. if (cas3 == 1) {
  82. printf("-%c\n", A);
  83. }
  84. else
  85. if (cas3 == 2) {
  86. printf("-%c\n", B);
  87. }
  88. else
  89. if (cas3 == 3) {
  90. printf("-%c\n", X);
  91. }
  92. else
  93. if (cas3 == 4) {
  94. printf("-%c\n", G);
  95. }
  96. else
  97. if (cas3 == 5) {
  98. printf("-%c\n", Z);
  99. }
  100. else
  101. if (cas3 == 6) {
  102. printf("-%c\n", F);
  103. }
  104. /* calcula los premios */
  105. if (cas1 == 1 && cas2 == 1 && cas3 == 1) {
  106. printf("Premio Mayor! Ganaste 1millon de puntos y 10 fichas\n");
  107. fichas = fichas + 10;
  108. puntos = puntos + 1000000;
  109. }
  110. else
  111. if (cas1 == 2 && cas2 == 2 && cas3 == 2) {
  112. printf("Ganaste 100,000 puntos!\n");
  113. puntos = puntos + 100000;
  114. }
  115. else
  116. if (cas1 == 3 && cas2 == 3 && cas3 == 3) {
  117. printf("Ganaste 50,000 puntos!\n");
  118. puntos = puntos + 50000;
  119. }
  120. else
  121. if (cas1 == 4 || cas2 == 4 || cas3 == 4) {
  122. printf("Ganaste 1,000 puntos!\n");
  123. puntos = puntos + 1000;
  124. }
  125. else
  126. if (cas1 == 5 && cas2 == 5 && cas3 == 5) {
  127. printf("Ganaste 2 fichas!\n");
  128. fichas = fichas + 2;
  129. }
  130. else
  131. if (cas1 == 6 && cas2 == 6 && cas3 == 6) {
  132. printf("Ganaste 1 ficha!\n");
  133. fichas = fichas + 1;
  134. }
  135. else
  136. printf("Lo siento, vuelve a intentarlo\n");
  137. }
  138. printf(" Tu estado actual del juego es: Fichas: %d - Puntos: %d\n", fichas, puntos);
  139. }
  140. if (fichas == 0){
  141. printf("FIN DEL JUEGO!\n"); /* finaliza el juego */
  142. return 0;
  143. } /* fin main */

Resultado del juego: 
fichas: 20, puntos: 0 
Para jalar la palanca escriba 1 [_7_] 
Error 001: no se introdujo 1, usted introdujo: 7 
Para jalar la palanca escriba 1 [_1_] 
A-B-Z  
Lo siento, vuelve a intentarlo 
Tu estado actual del juego es: fichas: 19, puntos: 0 
Para jalar la palanca escriba 1 [_1_]  
A-A-A 
Premio Mayor! Ganaste 1millon de puntos y 10 fichas 
Tu estado actual del juego es: fichas: 28, puntos: 1 000 000  
Para jalar la palanca escriba 1 [_1_]  
B-G-Z 
Ganaste 1,000 puntos! 
Tu estado actual del juego es: fichas: 27, puntos: 1 001 000
... (27 y un poco mas fichas despues)
Para jalar la palanca escriba 1 [_1_]  
Z-Z-B 
Lo siento, vuelve a intentarlo 
Tu estado actual del juego es: fichas: 0, puntos: 7 553 000 
FIN DEL JUEGO!

y así termina el programa, tiene una simple función, demasiado largo no? tal vez aya formas de optimizarlo, de forma que se ocupen menos funciones. y no esta para menos que 1:30 horas haciéndolo, de hecho eso me tarde. espero que lo puedan comprender, me rompí la cabeza haciéndolo y un buen juego que tengo en mente sera una suite casino para ipod, android, ubuntu y windows. lo publicare en mis proyectos en un blog en el que estoy trabajando.

y bueno este es el final de la entrada mas extensa que eh hecho, pero disfrute haciéndola, espero que sientas lo mismo estudiándola y comprendiéndola. 

Saludos!
____________________EDITO POR OPTIMIZACIÓN!____________________

Una mejor forma de resolver el problema es usando la sentencia switch para optimizar el programa, osea hacerlo mas estable, y que ocupe menos ram al ejecutarse.



  1. /* Programa 4.0: juego traga monedas de casino con switch*/
  2. # include <stdio.h>
  3. # include <stdlib.h>
  4. # include <time.h>

  5. int main ()
  6. { /*Declarando variables */
  7. int fichas; 
  8. int jt;
  9. int cas1;
  10. int cas2;
  11. int cas3;
  12. int puntos;
  13. int A = 'A', B = 'B', X = 'X', G = 'G', Z = 'Z', F = 'F';
  14. /* fin de declaracion */
  15. fichas = 20;
  16. puntos = 0;
  17. /* utilizando el segundos del día para randomizar */
  18. srand (time(NULL));
  19. printf (" Tu estatus actual es Fichas: %d, Puntos: %d\n", fichas, puntos);
  20. while (fichas > 0) {
  21. printf("Para jalar la palanca del traga monedas escriba en numero 1:\n");
  22. scanf("%d\n",&jt);
  23. if(jt != 1) {
  24. printf("Error 001: no se introdujo 1, usted itrodujo:%d", jt);
  25. }
  26. else {
  27. --fichas; /* resta una ficha y abajo ramdomiza */
  28. cas1 = 1 + (rand () % 6);
  29. cas2 = 1 + (rand () % 6);
  30. cas3 = 1 + (rand () % 6);
  31. /* lanza a pantalla las letras */
  32. /* casilla 1 */
  33. switch (cas1) {
  34.    case 1: 
  35. printf("%c", A);
  36. break;
  37.    case 2:
  38. printf("%c", B);
  39.    break;
  40.    case 3:
  41. printf("%c", X);
  42.    break;
  43.    case 4:
  44. printf("%c", G);
  45.    break;
  46.    case 5:
  47. printf("%c", Z);
  48.    break;
  49.    case 6:
  50. printf("%c", F);
  51. break;
  52. }
  53. /* casilla 2 */
  54. switch (cas2) {
  55. case 1:
  56. printf("-%c", A);
  57. break;
  58. case 2:
  59. printf("-%c", B);
  60. break;
  61. case 3:
  62. printf("-%c", X);
  63. break;
  64. case 4:
  65. printf("-%c", G);
  66. break;
  67. case 5:
  68. printf("-%c", Z);
  69. break;
  70. case 6:
  71. printf("-%c", F);
  72. break;
  73. }
  74. /* casilla 3 */
  75. switch (cas3 ) {
  76. case 1:
  77. printf("-%c\n", A);
  78. break;
  79. case 2:
  80. printf("-%c\n", B);
  81. break;
  82. case 3:
  83. printf("-%c\n", X);
  84. break;
  85. case 4:
  86. printf("-%c\n", G);
  87. break;
  88. case 5:
  89. printf("-%c\n", Z);
  90. break;
  91. case 6:
  92. printf("-%c\n", F);
  93. break;
  94. }
  95. /* calcula los premios */
  96. if (cas1 == 1 && cas2 == 1 && cas3 == 1) {
  97. printf("Premio Mayor! Ganaste 1millon de puntos y 10 fichas\n");
  98. fichas = fichas + 10;
  99. puntos = puntos + 1000000;
  100. }
  101. else
  102. if (cas1 == 2 && cas2 == 2 && cas3 == 2) {
  103. printf("Ganaste 100,000 puntos!\n");
  104. puntos = puntos + 100000;
  105. }
  106. else
  107. if (cas1 == 3 && cas2 == 3 && cas3 == 3) {
  108. printf("Ganaste 50,000 puntos!\n");
  109. puntos = puntos + 50000;
  110. }
  111. else
  112. if (cas1 == 4 || cas2 == 4 || cas3 == 4) {
  113. printf("Ganaste 1,000 puntos!\n");
  114. puntos = puntos + 1000;
  115. }
  116. else
  117. if (cas1 == 5 && cas2 == 5 && cas3 == 5) {
  118. printf("Ganaste 2 fichas!\n");
  119. fichas = fichas + 2;
  120. }
  121. else
  122. if (cas1 == 6 && cas2 == 6 && cas3 == 6) {
  123. printf("Ganaste 1 ficha!\n");
  124. fichas = fichas + 1;
  125. }
  126. else
  127. printf("Lo siento, vuelve a intentarlo\n");
  128. }
  129. printf(" Tu estado actual del juego es: Fichas: %d - Puntos: %d\n", fichas, puntos);
  130. }
  131. if (fichas == 0){
  132. printf("FIN DEL JUEGO!\n"); /* finaliza el juego */
  133. return 0;
  134. } /* fin main */


5 comentarios:

  1. Ayuda amigos con este programa!
    código en C con la que el usuario pueda adivinar en un máximo de 7 oportunidades un número entero comprendido entre 1 y 100.En cada ciclo la computadora le dirá que el número que capturo el usuario es mayor o menor que el número que tiene la computadora.Utilice la función rand y srand para calcular el número a adivinar (recordar que el mismo tiene que ser entre 1 y 100). Utilice además la repetitiva Hacer-mientras.
    Gracias por su ayuda!

    ResponderEliminar
    Respuestas
    1. http://programing-street.blogspot.mx/2012/05/resolviendo-problema-de-usuario-anonimo.html

      Ahi esta tu respuesta bro, ojala la puedas ver!

      Saludos!

      Eliminar
  2. Hey, nice site

    btw, this program would much simple you use switch instead of a chain (if and else)

    switch(cas3){
    case 3: method1();break;
    case 2: method2();break;
    default:method3();break;
    }

    ResponderEliminar
  3. Amigo ocupo este programa! Agradeceria mucho tu ayuda! Gracias!

    Declare una estructura, que tendrá como elementos los datos siguientes: Nombre, Departamento, Sueldo diario, Días trabajados, Horas extras. Realice una función CAPTURAR en la que solicite los datos. Se deben almacenar al menos 40 registros.

    Debe existir una función llamada Calcular, donde se realizarán las siguientes operaciones:

    Sueldo bruto = salario diario * días trabajados

    Pago de horas extras = (salario diario/8)*2*horas extras

    Percepciones = Sueldo bruto + pago de horas extras

    Cuota del IMSS =percepciones * 3%

    Cuota del ISPT = Percepciones *7%

    Deducciones = Cuota de IMSS +Cuota de ISPT

    Sueldo Total = Percepciones -Deducciones

    Y la función MOSTAR que despliegue la información del trabajador y el desglose de su sueldo

    ResponderEliminar