Lluvia de texto (película Matrix)

Arnold Balasescu

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

#define FILAS 12        //al cambiar estos valores
#define COLUMNAS 75     //tambien hay que cambiar en la linea 14.
#define FILAS_GRANDE 500
#define ESPACIOS 1337 //es un valor arbitrario.
#define ESP_MAX 15    //las columnas tienen entre 5 y ESP_MAX huecos.

int main()
{
  int i,j,k,posicion,caracter,matriz[FILAS_GRANDE+ESP_MAX][COLUMNAS];
  system("color A");
  system("mode 76,12");  // <<dimensiones de la ventana
  srand (time (NULL));
  /*-----------------------------------------------------------------------------
   *  A continuacion se genera la matriz con caracteres aleatoros + la constante
   *  ESPACIOS
   *----------------------------------------------------------------------------*/
  for (i=0;i<FILAS_GRANDE;i++)
    {
      for (j=0;j<COLUMNAS;j++)
	{
      caracter=34+(rand()%180);
      if (caracter > 175) matriz[i][j] = ESPACIOS;  //hasta ASCII 175
      else matriz[i][j] = caracter;
	}
    }
  /*-----------------------------------------------------------------------------
   *  Se buscan las ocurrencias de ESPACIOS y se modifica la matriz generada
   *  aniadiendo un numero aleatorio de huecos en la misma columna.
   *-----------------------------------------------------------------------------*/
  for (i=0;i<FILAS_GRANDE;i++)
    {
      for (j=0;j<COLUMNAS;j++)
	if (matriz[i][j] == ESPACIOS)
	  {
	    for (k=0; k <= 5 + rand()%(ESP_MAX - 5); k++) //5 espacios como minimo
		matriz[i+k][j] = ' ';
	  }
    }
  /*-----------------------------------------------------------------------------
   *  Se imprime por pantalla la matriz(FILAS x COLUMNAS) al reves.
   *  El bucle que imprime las filas se ejecuta FILAS veces, pero con valores
   *  cada vez mas pequenios (k es mayor)
   *-----------------------------------------------------------------------------*/
  for (k=0;k<FILAS_GRANDE;k++)
    {
	for (i=FILAS_GRANDE - FILAS - k; i<FILAS_GRANDE - k && i>=0; i++)
	  {
	    for (j=0;j<COLUMNAS;j++)
	      printf("%c", matriz[i][j]);
	    printf("\n");
	  }
	//while(j<5000000)j++;   // si emplean pocas filas hace falta un retraso.
	system("cls");
        }
}

Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

2 respuestas a Lluvia de texto (película Matrix)

  1. Quizás se necesite el header stdlib.h para pasar las órdenes al “system()” y también otro detalle: en el último bucle cuando escribes la matriz, observa que el índice i debe verificar i>=0, de lo contrario estarías internándote en índices negativos y en zonas de memoria fuera de la matriz en cuestión.. fíjate que si no pones eso, el programita al final te produciría sonidos extraños.

    en cualquier caso, muy buena idea y muy lindo programa!.

  2. Mientras estaba programando la parte final, el programa se atascaba (solamente a veces) dado que el algoritmo que genera las columnas llenaba zonas fuera de la matriz.

     for (i=FILAS_GRANDE - FILAS - k; i<FILAS_GRANDE - k && i>=0; i++) 

    La condición adicional es un buen arreglo. A mi se me hubiera ocurrido:

     if (i=0) break; 

    El programa aun se puede mejorar (usar caracteres unicode [japones-katakana de 1/2 grosor] como en la película, eliminar de alguna forma el parpadeo de la pantalla, duración indefinida, etc..) así que si alguien quiere, puede trabajar sobre el programa y/o usar partes en sus programas.

    Un saludo. –Arnold B.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s