Binary Tetris in tweets There was recently (a few years back) some buzz on programming websites about an implementation of Tetris in 140 Bytes.
...

It turns out that although it is small, it is a simplified version of Tetris, and not even a complete implementation. Only the core logic function fits in 140 bytes of Javascript. To actually run it, you need another ~840 characters of HTML.

We can do better!
This challenge is to implement a complete version of "Binary Tetris" in as few tweets as possible.

Binary Tetris Rules:  


The program must display a playing field containing at least 5 columns and 6 rows of cells.


Any method of display may be used, as long as the blocks and the edges of the field are clearly marked.

There must be at least two types of blocks:  # and ##. Additional block support such as ### or angle blocks shaped like an L will get upvoted by me :P and the most complete game of binary tetris (the most blocks like the original and rotation features) will win my happiness and a possible bounty up 50 rep. 
New blocks are added to the field in the top row, and one block cell must occupy the center column. 
Blocks descend towards the bottom row at a fixed rate.  Blocks must descend even without user input.
When blocks touch the bottom of the field or a lower block, they stop falling and are fixed in place.  A new block is added.
When all the columns in the row are filled with blocks, the row is emptied, and all the fixed blocks above drop down one row.
The program must respond to keypresses.  There must be 3 unique keys that perform the following functions


shift current block left 1 column
shift current block right 1 column
shift current block down 1 row

Each tweet may only have 140 characters. Using multi-byte characters that can be put in tweets is allowed.
The rules for what can be in a tweet is simple. If you can tweet it you can use it.  
Interpreted languages follow the same rules. Each section must follow the specs. As long as no run time errors occur (and the rest is valid following the specs) your answer is valid
Golfing Rules:
Because the original implementation was "tweetable", this challenge requires the same.  Entries must be able to be transmitted as a series of tweets (lines of 140 characters or less).
The first tweet must contain the name of the compiler/interpreter, the name of the program, and any command line arguments


it will be saved as file "P0"

The following N tweets must contain the program as a series of lines.


Each tweet will be stored in a file with the name T&lt;n&gt;, where n is 1..N

Each line will be added to the previous lines and compiled or interpreted.  It must produce a valid object file or program.
The program does not need to be functional until the last line is added.
The program will be run in the following manner (pseudo-bash)

interp,prog,args = split P0 /\s/ 
touch $prog
for file in ./T* do
  cat $prog file &gt; $prog
  $interp $prog $args
  die("FAIL") if $? #detect error
done


The interpreter must be a commonly available executable program that does not already implement Tetris.


Scoring:
Fewest Tweets, including P0.  Ties broken by largest number of spare characters (140 * num tweets - total character count).

Example Entries

chrome a.htm
&lt;html&gt;&lt;div id="output"&gt;&lt;/div&gt;&lt;/html&gt;
&lt;script&gt;cool java script here&lt;/script&gt;


Score = 3 (334 spare)

cc a.c ;a.out
main(){/*cool prog here*/}


Score = 2 (241 spare)

tetris


Score = 1 (134 spare)    if it were legal, which it's not

Special thanks

I was allowed to post this by Ashelly's consent here
Python 3, Score of 5 Tweets (242 spare, counting P0)



-19 bytes thanks to Jonathan Allan!

The spare count does not take into account newlines from between tweets.

Tweet 1 (Declaration, 12 bytes)

python3 t.py


Tweet 2 (70 bytes)

import msvcrt as m,os;f=c=s=0;a=34636833;r=range;p=1&lt;&lt;32;t=30
while 1:


Tweet 3 (129 bytes)

 if m.kbhit()and b"\xe0"==m.getch():p=[p&gt;&gt;(not(a|f&lt;&lt;1)&amp;p),p,p&lt;&lt;(not(a&lt;&lt;4|f&gt;&gt;1)&amp;p),p&gt;&gt;5-5*(bool(f&amp;p&gt;&gt;5)or p&lt;t)][ord(m.getch())-77]


Tweet 4 (113 bytes)

 c+=1;print("\n".join("".join(".#"[1&amp;(f|p)&gt;&gt;i*5+j]for j in r(5))for i in r(6))[::-1]);os.system("cls")
 if c%t&lt;1:


Tweet 5 (134 bytes)

  if f&amp;p&gt;&gt;5or p&lt;t:s=~s;f|=p;p=2-s&lt;&lt;26
  else:p&gt;&gt;=5
 for i in r(0,t,5):
  if f|31&lt;&lt;i==f:b=bin(f)[2:].zfill(t);f=int(b[:-i-5]+b[t-i:],2)


Full Program (449 bytes)

import msvcrt as m,os;f=c=s=0;a=34636833;r=range;p=1&lt;&lt;32;t=30
while 1:
 if m.kbhit()and b"\xe0"==m.getch():p=[p&gt;&gt;(not(a|f&lt;&lt;1)&amp;p),p,p&lt;&lt;(not(a&lt;&lt;4|f&gt;&gt;1)&amp;p),p&gt;&gt;5-5*(bool(f&amp;p&gt;&gt;5)or p&lt;t)][ord(m.getch())-77]
 c+=1;print("\n".join("".join(".#"[1&amp;(f|p)&gt;&gt;i*5+j]for j in r(5))for i in r(6))[::-1]);os.system("cls")
 if c%t&lt;1:
  if f&amp;p&gt;&gt;5or p&lt;t:s=~s;f|=p;p=2-s&lt;&lt;26
  else:p&gt;&gt;=5
 for i in r(0,t,5):
  if f|31&lt;&lt;i==f:b=bin(f)[2:].zfill(t);f=int(b[:-i-5]+b[t-i:],2)


Does some evil bit point hacking and stores the field and piece in two integers. I'll try and post an explanation soon.

Note: This only runs on Windows, but it could be switched to Linux through msvcrt → getch and "cls" → "clear". Additionally, character input doesn't work on Python's IDLE, so I'd recommend running it elsewhere.