Skip to content

Instantly share code, notes, and snippets.

@msimpson
Created July 21, 2011 10:51
Show Gist options
  • Save msimpson/1096950 to your computer and use it in GitHub Desktop.
Save msimpson/1096950 to your computer and use it in GitHub Desktop.
Curses based ASCII art fire animation.
#!/usr/bin/python
import curses, random
screen = curses.initscr()
width = screen.getmaxyx()[1]
height = screen.getmaxyx()[0]
size = width*height
char = [" ", ".", ":", "^", "*", "x", "s", "S", "#", "$"]
b = []
curses.curs_set(0)
curses.start_color()
curses.init_pair(1,0,0)
curses.init_pair(2,1,0)
curses.init_pair(3,3,0)
curses.init_pair(4,4,0)
screen.clear
for i in range(size+width+1): b.append(0)
while 1:
for i in range(int(width/9)): b[int((random.random()*width)+width*(height-1))]=65
for i in range(size):
b[i]=int((b[i]+b[i+1]+b[i+width]+b[i+width+1])/4)
color=(4 if b[i]>15 else (3 if b[i]>9 else (2 if b[i]>4 else 1)))
if(i<size-1): screen.addstr( int(i/width),
i%width,
char[(9 if b[i]>9 else b[i])],
curses.color_pair(color) | curses.A_BOLD )
screen.refresh()
screen.timeout(30)
if (screen.getch()!=-1): break
curses.endwin()
@chrissimpkins
Copy link

👍

cfire

@j4cobgarby
Copy link

how does this work?

@msimpson
Copy link
Author

@j4cobgarby

how does this work?

A board (integer array) is created to reflect the size (width * height) of the screen. Then, each frame the board is translated upward (top row removed) and decayed (each integer is decremented) before a new, randomly seeded row is inserted at the bottom.

The visual result is simply each integer value being interpreted as a character (from the char array) and color.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment