You're right octo, updated version below:
Controls:
Arrow left/right = move shape left/right.
Z = Spin counter-clockwise.
X = Spin clockwise.
Space or arrow down = fast drop.
Esc = quit.
New features:
o) Colours! Woo!
o) Shapes can now land in the playarea.
Doesn't work:
x) Array bound checking (you can move too far left or right).
x) Rotation validity.
x) Line filling (i.e., the idea of the game!).
Controls:
Arrow left/right = move shape left/right.
Z = Spin counter-clockwise.
X = Spin clockwise.
Space or arrow down = fast drop.
Esc = quit.
New features:
o) Colours! Woo!
o) Shapes can now land in the playarea.
Doesn't work:
x) Array bound checking (you can move too far left or right).
x) Rotation validity.
x) Line filling (i.e., the idea of the game!).
Include "keyboard.bb" Graphics 640,480,32 SetBuffer BackBuffer() SeedRnd MilliSecs() Dim colors%(6,2) Dim shapedata%(5,3,3,3) ; 6 shapes, 4 rotations, 4x4 grid. Dim playarea%(4,9,17) ; 5 predefined areas, 10x18 grid. Restore colordata For c%=0 To 6 For rgb%=0 To 2 Read colors%(c%,rgb%) Next Next Restore shapedata For shape%=0 To 5 For angle%=0 To 3 For y%=0 To 3 For x%=0 To 3 Read shapedata%(shape%,angle%,x%,y%) Next Next Next Next Restore playareadata For area%=0 To 4 For y%=0 To 17 Read temp$ For x%=0 To 9 playarea%(area%,x%,y%)=Mid$(temp$,x%+1,1) Next Next Next ; Init + main loop. playing=True level%=2 shape%=Rand(0,5) shape_x%=3 shape_y%=0 shape_color%=Rand(0,5)+1 angle%=0 dropspeed%=5 : timer%=dropspeed% dx%=0 fastdrop=False While playing If KeyHit(KEY_ESC) Then playing = False ; Check if left/right is down or was hit. If KeyDown(KEY_LEFT) Or KeyHit(KEY_LEFT) shape_x%=shape_x%-1 EndIf If KeyDown(KEY_RIGHT) Or KeyHit(KEY_RIGHT) shape_x%=shape_x%+1 EndIf If KeyHit(KEY_Z) angle%=(angle% - 1) And 3 EndIf If KeyHit(KEY_X) angle%=(angle% + 1) And 3 EndIf If KeyDown(KEY_SPACE) Or KeyDown(KEY_DOWN) ; User fast-dropping piece. fastdrop=True Else fastdrop=False EndIf Gosub drawscreen Delay 75 ; This is why, above, we have to check if a key was hit ; and not just that it happened to be down at the time. timer%=timer%-1 If timer%=0 Or fastdrop landed=False ; This is where we check to see if the shape landed. For y%=0 To 3 For x%=0 To 3 If shapedata%(shape%,angle%,x%,y%) = 1 below% = shape_y% + y% + 1 If below% = 18 ; Did we hit the bottom of the playarea? landed = True Else If playarea%(level%,shape_x%+x%,below%) > 0 landed = True ; We landed on an old shape. EndIf EndIf EndIf Next Next If landed ; 'set' the shape into the playarea. For y%=0 To 3 For x%=0 To 3 If shapedata%(shape%,angle%,x%,y%) = 1 playarea%(level%,shape_x%+x%,shape_y%+y%) = shape_color% EndIf Next Next ; New shape shape%=Rand(0,5) shape_x%=3 shape_y%=-1 ; Because it gets incremented almost immediately. ; A nasty kludge. Don't try this at home, kids. shape_color%=Rand(0,5)+1 angle%=0 fastdrop=False EndIf shape_y%=shape_y%+1 timer%=dropspeed% EndIf Wend .drawscreen ;Cls ; Draw the playing area 'container' Color $aa,$aa,$aa Rect 240-4,64,(16*10)+8,(16*18)+4,True Color 0,0,0 For y%=0 To 17 For x%=0 To 9 Color colors%(playarea%(level%,x%,y%),0),colors%(playarea%(level%,x%,y%),1),colors%(playarea%(level%,x%,y%),2) Rect 240+(x%*16),64+(y%*16),16,16 Next Next ; Draw shape. Color colors%(shape_color%,0),colors%(shape_color%,1),colors%(shape_color%,2) For y%=0 To 3 For x%=0 To 3 If shapedata%(shape%,angle%,x%,y%)=1 Rect 240+(shape_x%*16)+(x%*16),64+(shape_y%*16)+(y%*16),16,16 EndIf Next Next Flip False Return .shapedata ; I Data 0,0,1,0 Data 0,0,1,0 Data 0,0,1,0 Data 0,0,1,0 Data 0,0,0,0 Data 1,1,1,1 Data 0,0,0,0 Data 0,0,0,0 Data 0,0,1,0 Data 0,0,1,0 Data 0,0,1,0 Data 0,0,1,0 Data 0,0,0,0 Data 1,1,1,1 Data 0,0,0,0 Data 0,0,0,0 ; Z Data 0,0,0,1 Data 0,0,1,1 Data 0,0,1,0 Data 0,0,0,0 Data 0,1,1,0 Data 0,0,1,1 Data 0,0,0,0 Data 0,0,0,0 Data 0,0,0,1 Data 0,0,1,1 Data 0,0,1,0 Data 0,0,0,0 Data 0,1,1,0 Data 0,0,1,1 Data 0,0,0,0 Data 0,0,0,0 ; S Data 0,0,1,0 Data 0,0,1,1 Data 0,0,0,1 Data 0,0,0,0 Data 0,0,1,1 Data 0,1,1,0 Data 0,0,0,0 Data 0,0,0,0 Data 0,0,1,0 Data 0,0,1,1 Data 0,0,0,1 Data 0,0,0,0 Data 0,0,1,1 Data 0,1,1,0 Data 0,0,0,0 Data 0,0,0,0 ; T Data 0,0,1,0 Data 0,1,1,1 Data 0,0,0,0 Data 0,0,0,0 Data 0,0,1,0 Data 0,0,1,1 Data 0,0,1,0 Data 0,0,0,0 Data 0,0,0,0 Data 0,1,1,1 Data 0,0,1,0 Data 0,0,0,0 Data 0,0,1,0 Data 0,1,1,0 Data 0,0,1,0 Data 0,0,0,0 ; L Data 0,0,1,0 Data 0,0,1,0 Data 0,0,1,1 Data 0,0,0,0 Data 0,0,0,0 Data 0,1,1,1 Data 0,1,0,0 Data 0,0,0,0 Data 0,1,1,0 Data 0,0,1,0 Data 0,0,1,0 Data 0,0,0,0 Data 0,0,0,1 Data 0,1,1,1 Data 0,0,0,0 Data 0,0,0,0 ; J Data 0,0,1,0 Data 0,0,1,0 Data 0,1,1,0 Data 0,0,0,0 Data 0,1,0,0 Data 0,1,1,1 Data 0,0,0,0 Data 0,0,0,0 Data 0,0,1,1 Data 0,0,1,0 Data 0,0,1,0 Data 0,0,0,0 Data 0,0,0,0 Data 0,1,1,1 Data 0,0,0,1 Data 0,0,0,0 .playareadata Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " 1 1 1 " Data " 1 1 1 " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data "23 4 4 32" Data " " Data " 43 34 " Data " 5 5 " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " 22 22 " Data " 11 " Data " 33333333 " Data " 44 " Data " 12 21 " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " " Data " 3234 " Data " 53 23 " Data " 4234 " Data " 22 12 " Data " 3314 " Data " " Data " 3143 " Data " 53 15 " Data " 3243 " Data " 22 22 " Data " 1231 " Data " " .colordata Data $00,$00,$22 ; Playarea background colour. Data $00,$00,$ff Data $00,$ff,$00 Data $00,$ff,$ff Data $ff,$00,$00 Data $ff,$00,$ff Data $ff,$ff,$00