Miquel_Fuster

Game of Life

Dec 4th, 2021
1,028
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. GAME-OF-LIFE.
  3. DATA DIVISION.
  4. WORKING-STORAGE SECTION.
  5. 01 TABLERO-PRINCIPAL.
  6.     02 FILA-PRINCIPAL OCCURS 25 INDEXED BY I-FILA-PRINCIPAL.
  7.         03 COLUMNA-PRINCIPAL PIC 9(1) OCCURS 25 INDEXED BY I-COLUMNA-PRINCIPAL.
  8.  
  9. 01 TABLERO-TRABAJO.
  10.     02 FILA-TRABAJO OCCURS 25 INDEXED BY I-FILA-TRABAJO.
  11.         03 COLUMNA-TRABAJO PIC 9(1) OCCURS 25 INDEXED BY I-COLUMNA-TRABAJO.
  12.        
  13. 01 LIMITE-FILA.
  14.     02 FILA-INICIAL     PIC 99.
  15.     02 FILA-FINAL       PIC 99.
  16.  
  17. 01 LIMITE-COLUMNA.
  18.     02 COLUMNA-INICIAL  PIC 99.
  19.     02 COLUMNA-FINAL    PIC 99.
  20.  
  21. 01 POSICION-ACTUAL.
  22.     02 X                PIC 99.
  23.     02 Y                PIC 99.
  24.    
  25. 77 VALOR-ALEATORIO      PIC 9.
  26. 77 CANT-VECINOS         PIC 9.
  27. 77 I-PRINCIPAL          PIC 99.
  28.  
  29. PROCEDURE DIVISION.
  30. MAIN-PROCEDURE.
  31.     PERFORM RELLENAR-TABLERO-PRINCIPAL.
  32.     PERFORM VARYING I-PRINCIPAL FROM 1 BY 1 UNTIL I-PRINCIPAL = 99
  33.         PERFORM VISUALIZAR-TABLERO-PRINCIPAL
  34.         PERFORM GENERAR-SIGUIENTE-GENERACION
  35.         PERFORM COPIA-TABLERO
  36.         CONTINUE AFTER 0.3 SECONDS
  37.     END-PERFORM.
  38.     PERFORM VISUALIZAR-TABLERO-PRINCIPAL.
  39.     GOBACK.
  40.    
  41. *> RELLENA EL TABLERO DE FORMA ALEATORIA
  42. RELLENAR-TABLERO-PRINCIPAL.
  43.     COMPUTE VALOR-ALEATORIO = FUNCTION RANDOM(FUNCTION SECONDS-PAST-MIDNIGHT).
  44.     PERFORM VARYING I-FILA-PRINCIPAL FROM 1 BY 1 UNTIL I-FILA-PRINCIPAL > 25
  45.         PERFORM VARYING I-COLUMNA-PRINCIPAL FROM 1 BY 1 UNTIL I-COLUMNA-PRINCIPAL > 25
  46.             COMPUTE VALOR-ALEATORIO = FUNCTION RANDOM * 2
  47.             MOVE VALOR-ALEATORIO TO COLUMNA-PRINCIPAL(I-FILA-PRINCIPAL, I-COLUMNA-PRINCIPAL)
  48.         END-PERFORM
  49.     END-PERFORM.
  50.  
  51. *> GENERA LAS FORMAS DE VIDA DE LA SIGUIENTE GENERACIÓN
  52. GENERAR-SIGUIENTE-GENERACION.
  53.     PERFORM VARYING I-FILA-TRABAJO FROM 1 BY 1 UNTIL I-FILA-TRABAJO > 25
  54.         PERFORM GENERAR-CASILLA-TRABAJO VARYING I-COLUMNA-TRABAJO FROM 1 BY 1 UNTIL I-COLUMNA-TRABAJO > 25
  55.     END-PERFORM.
  56.  
  57. *> GENERA LA FORMA DE VIDA EN LA CASILLA M-SIMA DE LA FILA N-SIMA.
  58. GENERAR-CASILLA-TRABAJO.
  59.     *> CALCULA CUANTAS CELULAS VECINAS HAY VIVAS EN UN CUADRADO DE 3X3, RESPETANDO LOS LÍMITES
  60.     *> CALCULA CUAL ES LA FINAL INICIAL PARA NO SALIRSE DEL TABLERO
  61.     IF I-FILA-TRABAJO = 1 THEN
  62.         MOVE 1 TO FILA-INICIAL
  63.     ELSE
  64.         SUBTRACT 1 FROM I-FILA-TRABAJO GIVING FILA-INICIAL
  65.     END-IF.
  66.    
  67.     *> CALCULA CUAL ES LA FILA FINAL PARA NO SALIRSE DEL TABLERO
  68.     IF I-FILA-TRABAJO = 25 THEN
  69.         MOVE 25 TO FILA-FINAL
  70.     ELSE
  71.         ADD 1 TO I-FILA-TRABAJO GIVING FILA-FINAL
  72.     END-IF.
  73.        
  74.     *> CALCULA CUAL ES LA COLUMNA INICIAL PARA NO SALIRSE DEL TABLERO
  75.     IF I-COLUMNA-TRABAJO = 1 THEN
  76.         MOVE 1 TO COLUMNA-INICIAL
  77.     ELSE
  78.         SUBTRACT 1 FROM I-COLUMNA-TRABAJO GIVING COLUMNA-INICIAL
  79.     END-IF.
  80.    
  81.     *> CALCULA CUAL ES LA COLUMNA FINAL PARA NO SALIRSE DEL TABLERO
  82.     IF I-COLUMNA-TRABAJO = 25 THEN
  83.         MOVE 25 TO COLUMNA-FINAL
  84.     ELSE
  85.         ADD 1 TO I-COLUMNA-TRABAJO GIVING COLUMNA-FINAL
  86.     END-IF.
  87.    
  88.     *> CALCULA LA CANTIDAD DE VECINOS
  89.     MOVE 0 TO CANT-VECINOS.
  90.    
  91.     PERFORM VARYING Y FROM FILA-INICIAL BY 1 UNTIL Y > FILA-FINAL
  92.         PERFORM VARYING X FROM COLUMNA-INICIAL BY 1 UNTIL X > COLUMNA-FINAL
  93.             IF NOT (Y = I-FILA-TRABAJO AND X = I-COLUMNA-TRABAJO) THEN
  94.                 IF COLUMNA-PRINCIPAL(Y, X) = 1 THEN
  95.                     ADD 1 TO CANT-VECINOS
  96.                 END-IF
  97.             END-IF
  98.         END-PERFORM
  99.     END-PERFORM.
  100.    
  101.     *> SI LA CANTIDAD DE VECINOS = 3 LA CELULA NACE O SIGUE VIVA
  102.     IF CANT-VECINOS = 3
  103.         MOVE 1 TO COLUMNA-TRABAJO(I-FILA-TRABAJO, I-COLUMNA-TRABAJO)
  104.     *> POR EL CONTRARIO, SI LA CANTIDAD DE VECINOS ES DIFERENTE A 2 LA CELULA MUERE
  105.     ELSE IF CANT-VECINOS NOT = 2
  106.         MOVE 0 TO COLUMNA-TRABAJO(I-FILA-TRABAJO, I-COLUMNA-TRABAJO)
  107.     END-IF.
  108.    
  109. *> SE COPIA EL TABLERO DE TRABAJO AL TABLERO PRINCIPAL
  110. COPIA-TABLERO.
  111.     MOVE TABLERO-TRABAJO TO TABLERO-PRINCIPAL.
  112.  
  113. *> MUESTRA POR CONSOLA EL TABLERO
  114. VISUALIZAR-TABLERO-PRINCIPAL.
  115.     PERFORM VARYING I-FILA-PRINCIPAL FROM 1 BY 1 UNTIL I-FILA-PRINCIPAL > 25
  116.         PERFORM VARYING I-COLUMNA-PRINCIPAL FROM 1 BY 1 UNTIL I-COLUMNA-PRINCIPAL > 25
  117.             IF COLUMNA-PRINCIPAL(I-FILA-PRINCIPAL, I-COLUMNA-PRINCIPAL) = 1 THEN
  118.                 DISPLAY 'O' LINE I-FILA-PRINCIPAL COL I-COLUMNA-PRINCIPAL
  119.             ELSE
  120.                 DISPLAY ' ' LINE I-FILA-PRINCIPAL COL I-COLUMNA-PRINCIPAL
  121.             END-IF
  122.         END-PERFORM
  123.     END-PERFORM.
  124.        
  125. END PROGRAM GAME-OF-LIFE.
  126.  
RAW Paste Data