1. // Nombre: El juego de la vida
  2. // Versión: 0.2-unix
  3. // Autor: user170294
  4. #include <cstdlib> // rand() y srand()
  5. #include <ctime> // time()
  6. #include <iostream>
  7. using namespace std;
  8. #define ALTO 80 // Alto del tablero
  9. #define ANCHO 200 // Ancho del tablero
  10. #define VIVA 'O' // Celula VIVA
  11. #define MUERTA ' ' // Celula MUERTA
  12. #define PROBABILIDAD 10 // De cada X celulas 1 estará viva.
  13. void EntornoVaciar(char entorno[ALTO][ANCHO]); // Llena el entorno de celulas muertas
  14. void EntornoImprimir(char entorno[ALTO][ANCHO]); // Imprime el entorno en pantalla
  15. void EntornoEscribir(char entorno[ALTO][ANCHO]); // Escribe un entorno a mano
  16. void EntornoAleatorio(char entorno[ALTO][ANCHO], int probabilidad); // Genera una población aleatoria
  17. void EntornoEvolucionar(char entorno1[ALTO][ANCHO], char entorno2[ALTO][ANCHO]); // Evoluciona una población a la siguiente generación
  18. int main(void)
  19. {
  20. char entorno1[ALTO][ANCHO]; // Son necesarios dos tablas, una para mostrar y otra para evolucionar
  21. char entorno2[ALTO][ANCHO];
  22. bool scrFlip = false; // Variable de la que dependerá mostrar un entorno u otro.
  23. int generacion = 0; // Variable que almacena la generación actual
  24. srand(time(NULL)); // Inicializamos el generador de números aleatorios
  25. system("clear"); // Limpiamos la pantalla antes de imprimir nada
  26. cout << "###########################" << endl;
  27. cout << "# El juego de la vida #" << endl;
  28. cout << "###########################" << endl;
  29. cout << "\t[>] Versión: 0.2-unix\n\t[>] Autor: user170294\n\t[>] E-mail: [email protected]\n\n";
  30. cout << "*** Pulsa Enter para generar una población aleatoria ***";
  31. cin.get();
  32. EntornoVaciar(entorno1); // Vaciamos el entorno1
  33. EntornoAleatorio(entorno1, PROBABILIDAD); // Generamos una poblacion aleatoria en entorno1
  34. while(true) {
  35. system("clear");
  36. cout << "[ Generación: " << generacion << " ]" << endl;
  37. if(!scrFlip) { // Es necesario utilizar este efecto para el correcto funcionamiento de las reglas
  38. EntornoImprimir(entorno1);
  39. EntornoVaciar(entorno2);
  40. EntornoEvolucionar(entorno1, entorno2);
  41. scrFlip = true;
  42. } else {
  43. EntornoImprimir(entorno2);
  44. EntornoVaciar(entorno1);
  45. EntornoEvolucionar(entorno2, entorno1);
  46. scrFlip = false;
  47. }
  48. system("sleep 0.1"); // Hacer una pausa de 0.1s para que no valla demasiado rápido
  49. generacion++;
  50. }
  51. }
  52. void EntornoVaciar(char entorno[ALTO][ANCHO]) {
  53. for(int i=0;i<ALTO;i++)
  54. for(int j=0;j<ANCHO;j++)
  55. entorno[i][j]=MUERTA;
  56. }
  57. void EntornoImprimir(char entorno[ALTO][ANCHO]) {
  58. for(int i=0;i<ALTO;i++){
  59. for(int j=0;j<ANCHO;j++)
  60. cout<<entorno[i][j];
  61. cout<<endl;
  62. }
  63. }
  64. void EntornoEscribir(char entorno[ALTO][ANCHO]) {
  65. int aux;
  66. for(int i=0;i<ALTO;i++)
  67. for(int j=0;j<ANCHO;j++){
  68. aux=0;
  69. cout<<"celda["<<i<<"|"<<j<<"]: ";
  70. cin>>aux;
  71. entorno[i][j]=(aux==0)?MUERTA:VIVA;
  72. }
  73. }
  74. void EntornoAleatorio(char entorno[ALTO][ANCHO], int probabilidad) {
  75. int aux;
  76. for(int i=0;i<ALTO;i++)
  77. for(int j=0;j<ANCHO;j++){
  78. aux=rand()%probabilidad;
  79. entorno[i][j]=(aux==0)?VIVA:MUERTA;
  80. }
  81. }
  82. void EntornoEvolucionar(char entorno1[ALTO][ANCHO], char entorno2[ALTO][ANCHO]) {
  83. int n; //numero de celdas alrededor
  84. for(int i=0;i<ALTO;i++){
  85. for(int j=0;j<ANCHO;j++){
  86. n=0;
  87. ((i-1)<0||(j-1)<0)?:(MUERTA==entorno1[i-1][j-1])?:n++; //arriba-izquierda
  88. ((i-1)<0)?:(MUERTA==entorno1[i-1][j])?:n++; //arriba
  89. ((i-1)<0||(j+1)>=ANCHO)?:(MUERTA==entorno1[i-1][j+1])?:n++; //arriba-derecha
  90. ((j-1)<0)?:(MUERTA==entorno1[i][j-1])?:n++; //izquierda
  91. ((j+1)>=ANCHO)?:(MUERTA==entorno1[i][j+1])?:n++; //derecha
  92. ((i+1)>=ALTO||(j-1)<0)?:(MUERTA==entorno1[i+1][j-1])?:n++; //abajo-izquierda
  93. ((i+1)>=ALTO)?:(MUERTA==entorno1[i+1][j])?:n++; //abajo
  94. ((i+1)>=ALTO||(j+1)>=ANCHO)?:(MUERTA==entorno1[i+1][j+1])?:n++; //abajo-derecha
  95. if(VIVA==entorno1[i][j]){
  96. if(n<2)
  97. entorno2[i][j]=MUERTA;
  98. if(n==2||n==3)
  99. entorno2[i][j]=VIVA;
  100. if(n>3)
  101. entorno2[i][j]=MUERTA;
  102. }
  103. if(MUERTA==entorno1[i][j])
  104. if(n==3)
  105. entorno2[i][j]=VIVA;
  106. }
  107. }
  108. }

JuegoDeLaVida_2.0-unix_by-user170294