Implementation of a Falling Matrix
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++.
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’.
// 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;
}
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();
}
}
}
}
# 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)
// 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
Contact Us