1 ! Copyright (C) 2006 Alex Chapman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel sequences arrays tetris-piece math ;
6 TUPLE: board width height rows ;
8 : make-rows ( width height -- rows )
9 [ drop f <array> ] map-with ;
11 C: board ( width height -- board )
13 [ set-board-rows ] keep
14 [ set-board-height ] keep
15 [ set-board-width ] keep ;
17 #! A block is simply an array of form { x y } where { 0 0 } is the top-left of
18 #! the tetris board, and { 9 19 } is the bottom right on a 10x20 board.
20 : board@block ( board block -- n row )
21 [ second swap board-rows nth ] keep first swap ;
23 : board-set-block ( board block colour -- ) -rot board@block set-nth ;
25 : board-block ( board block -- colour ) board@block nth ;
27 : block-free? ( board block -- ? ) board-block not ;
29 : block-in-bounds? ( board block -- ? )
30 [ first swap board-width bounds-check? ] 2keep
31 second swap board-height bounds-check? and ;
33 : location-valid? ( board block -- ? )
34 2dup block-in-bounds? [ block-free? ] [ 2drop f ] if ;
36 : piece-valid? ( board piece -- ? )
37 piece-blocks [ location-valid? ] all-with? ;
39 : row-not-full? ( row -- ? ) f swap member? ;
41 : add-row ( board -- )
42 dup board-rows over board-width f <array>
43 add* swap set-board-rows ;
45 : top-up-rows ( board -- )
46 dup board-height over board-rows length = [
49 dup add-row top-up-rows
52 : remove-full-rows ( board -- )
53 dup board-rows [ row-not-full? ] subset swap set-board-rows ;
55 : check-rows ( board -- n )
56 #! remove full rows, then add blank ones at the top, returning the number
57 #! of rows removed (and added)
58 dup remove-full-rows dup board-height over board-rows length - >r top-up-rows r> ;