Open In App

Implementation of a Falling Matrix

Last Updated : 16 Apr, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

Since the dawn of computers, Hollywood has greatly demonstrated a Hacker or a Programmer as someone sitting on a computer typing random keys on computer which ultimately compiles to a Falling matrix like simulation. Here, we will try to implement a similar falling matrix simulation on the console using C++.

A Falling-Matrix on command line using C++

The idea here is to print random characters over a defined width, where the two successive characters may or may not have certain amount of gap defined randomly. A certain amount of delay between printing successive lines has to be implemented in order to have a ‘falling effect’.

CPP
// C++ program for implementation of falling matrix.
#include<iostream>
#include<string>
#include<thread>
#include<cstdlib>
#include<ctime>
#include<chrono>

// Width of the matrix line
const int width = 70;

// Defines the number of flips in Boolean Array 'switches'
const int flipsPerLine = 5;

// Delay between two successive line print
const int sleepTime = 100;

using namespace std;

int main()
{
    int i = 0, x = 0;

    // srand initialized with time function
    // to get distinct rand values at runtime
    srand(time(NULL));

    // Used to decide whether to print
    // the character in that particular iteration
    bool switches[width] = {0};

    // Set of characters to print from
    const string ch = "1234567890qwertyuiopasdfghjkl"
                      "zxcvbnm,./';[]!@#$%^&*()-=_+";
    const int l = ch.size();

    // Green font over black console, duh!
    system("Color 0A");

    // Indefinite Loop
    while (true)
    {
        // Loop over the width
        // Increment by 2 gives better effect
        for (i = 0; i < width; i += 2)
        {
            // Print character if switches[i] is 1
            // Else print a blank character
            if (switches[i])
                cout << ch[rand() % l] << " ";
            else
                cout << "  ";
        }

        // Flip the defined amount of Boolean values
        // after each line
        for (i = 0; i != flipsPerLine; ++i)
        {
            x = rand() % width;
            switches[x] = !switches[x];
        }

        // New Line
        cout << endl;

        // Using sleep_for function to delay,
        // chrono milliseconds function to convert to milliseconds
        this_thread::sleep_for(chrono::milliseconds(sleepTime));
    }
    return 0;
}
Java
import java.util.Random;

public class FallingMatrix {
    // Width of the matrix line
    static final int width = 70;

    // Defines the number of flips in Boolean Array 'switches'
    static final int flipsPerLine = 5;

    // Delay between two successive line prints
    static final int sleepTime = 100;

    public static void main(String[] args) {
        // Used to decide whether to print the character in that particular iteration
        boolean[] switches = new boolean[width];

        // Set of characters to print from
        String ch = "1234567890qwertyuiopasdfghjkl"
                  + "zxcvbnm,./';[]!@#$%^&*()-=_+";
        int l = ch.length();

        // Green font over black console
        System.out.print("\u001B[32m");

        // Indefinite Loop
        while (true) {
            // Loop over the width
            // Increment by 2 gives a better effect
            for (int i = 0; i < width; i += 2) {
                // Print character if switches[i] is true
                // Else print a blank character
                if (switches[i])
                    System.out.print(ch.charAt(new Random().nextInt(l)) + " ");
                else
                    System.out.print("  ");
            }

            // Flip the defined amount of Boolean values after each line
            for (int i = 0; i < flipsPerLine; ++i) {
                int x = new Random().nextInt(width);
                switches[x] = !switches[x];
            }

            // New Line
            System.out.println();

            // Delay
            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
Python3
# Python program for implementation of falling matrix.
import random
import time

# Width of the matrix line
width = 70

# Defines the number of flips in Boolean Array 'switches'
flipsPerLine = 5

# Delay between two successive line print
sleepTime = 0.1

# Set of characters to print from
ch = "1234567890qwertyuiopasdfghjklzxcvbnm,./';[]!@#$%^&*()-=_+"

# Used to decide whether to print
# the character in that particular iteration
switches = [0]*width

# Indefinite Loop
while True:
    # Loop over the width
    # Increment by 2 gives better effect
    for i in range(0, width, 2):
        # Print character if switches[i] is 1
        # Else print a blank character
        if switches[i]:
            print(ch[random.randint(0, len(ch)-1)], end=" ")
        else:
            print(" ", end=" ")

    # Flip the defined amount of Boolean values
    # after each line
    for _ in range(flipsPerLine):
        x = random.randint(0, width-1)
        switches[x] = not switches[x]

    # New Line
    print()

    # Using sleep function to delay
    time.sleep(sleepTime)
JavaScript
// Importing required modules
const sleep = require('util').promisify(setTimeout);

// Width of the matrix line
let width = 70;

// Defines the number of flips in Boolean Array 'switches'
let flipsPerLine = 5;

// Delay between two successive line print
let sleepTime = 100; // in milliseconds

// Set of characters to print from
let ch = "1234567890qwertyuiopasdfghjklzxcvbnm,./';[]!@#$%^&*()-=_+";

// Used to decide whether to print
// the character in that particular iteration
let switches = Array(width).fill(0);

// Indefinite Loop
async function fallingMatrix() {
    while (true) {
        // Loop over the width
        // Increment by 2 gives better effect
        for (let i = 0; i < width; i += 2) {
            // Print character if switches[i] is 1
            // Else print a blank character
            process.stdout.write(switches[i] ? ch[Math.floor(Math.random() * ch.length)] + " " : "  ");
        }

        // Flip the defined amount of Boolean values
        // after each line
        for (let _ = 0; _ < flipsPerLine; _++) {
            let x = Math.floor(Math.random() * width);
            switches[x] = !switches[x];
        }

        // New Line
        console.log();

        // Using sleep function to delay
        await sleep(sleepTime);
    }
}

fallingMatrix();

This prints the amazing Falling-Matrix simulation on the console. Note :

  • This program would not run using Run on IDE button because system is disabled.
  • If you get compiler error while compiling this program. Compile it using below command on GCC.
    $ g++ -std=c++11 abc.cpp -o falling.o
    $ falling.o


Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads