Posted: Mon Feb 11, 2008 7:04 pm Post subject: Re: Shortest Tetris Challenge
Alright, here's my code.. Only marginally better than fishtastic's at 73 lines I used a lot of bit manipulation to make it short. I think my main game loop can be shortened a bit but I'm too lazy now
Turing:
View.Set("graphics:220;220,nobuttonbar,offscreenonly") color(0) colorback(7) var p :array1.. 7, 1.. 4ofint:=init(1632, 1632, 1632, 1632, 3840, 17476, 3840, 17476, 3168, 19584, 3168,
19584, 1728, 35904, 1728, 35904, 3616, 17600, 36352, 25664, 3712, 50240, 11776, 17504, 3648, 19520, 19968, 17984) var b :array0.. 24ofint:=init(0, 0, 0, 32760, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 16392, 32760) var pnn := Rand.Int (1, 7) var pn, pr, px, py, t :int var lines :=0 var down :=false var k :arraycharofboolean proc xorp
for i :0.. 3
b (py - i + 1)xor= ((p (pn, pr) & (15shl(4*(3 - i))))shr(4*(3 - i)))shl(px + 1) endfor end xorp
fcn overlap (i :int):boolean result i <= 3 & ((b (py - i + 1) & (((p (pn, pr) & (15shl(4*(3 - i))))shr(4*(3 - i)))shl(px + 1))) > 0| overlap (i + 1)) end overlap
fcn makeMove (var v :int, vo, d, m :int):boolean
v := v mod m + d
if overlap (0)then
v := vo
endif resultfalse end makeMove
loop
pn := pnn
pnn := Rand.Int (1, 7)
pr :=1
py :=23
px :=6 cls exitwhen overlap (0) put"\n\n\n\n\n\n\n\n\n\t\tLINES:\n\t\t======\n\t\t", lines :6 Draw.FillBox(130, 150, 190, 190, 0) for i :0.. 11 Draw.FillBox((i div3)*10 + 140, (i mod3)*10 + 150, (i div3)*10 + 150, (i mod3)*10 + 160, sign(p (pnn, 1) & (1shl((i mod3)*4 + (i div3))))*7) endfor loop
py -=1 exitwhen overlap (0)
t :=Time.Elapsed loop exitwhenTime.Elapsed - t >= 500 - min(450, (lines div10)*50) Input.KeyDown(k) if ~down & (k (KEY_DOWN_ARROW)| ((k (KEY_UP_ARROW) & makeMove (pr, pr, 1, 4)| k (KEY_LEFT_ARROW) & makeMove (px, px, -1, 99)| k (KEY_RIGHT_ARROW) & makeMove (px, px, 1, 99)) & false))then loop
py -=1 exitwhen overlap (0)
t :=Time.Elapsed endloop
py +=1 endif
down := k (KEY_DOWN_ARROW)| k (KEY_UP_ARROW)| k (KEY_LEFT_ARROW)| k (KEY_RIGHT_ARROW)
xorp
for i :0.. 231 Draw.FillBox((i mod11)*10, (i div11)*10, (i mod11)*10 + 10, (i div11)*10 + 10, sign(b (i div11 + 3) & (1shl(i mod11 + 3)))*7) endfor View.Update
xorp
endloop endloop
py +=1
xorp
for decreasing i :23.. 4
lines += b (i)div32760 for j : i .. (b (i)div32760)*20
b (j):= b (j + 1) endfor endfor endloop put"\n\n\n\n\n\n\tGAME OVER"