Ooops
November 28, 2020, 01:33:03 PM

Author Topic: [bb] Binary Tetris by Vic 3 Babes [ 1+ years ago ]  (Read 418 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] Binary Tetris by Vic 3 Babes [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
Title : Binary Tetris
Author : Vic 3 Babes
Posted : 1+ years ago

Description : You'll have to hum the tune I'm afraid - however, it's much better if you have some progressively nicer wavs to play depending on the number of lines that the player got - bit of a parp for one line, and something cute for 4 etc.  Plus a land sound.

I've commented-out the loadsound, playsound commands where you should put them - just do a search for playsound - but they're all in the move_down() function.  Loadsound is at the top natch.

line1.wav - 1 line
line2.wav - 2 lines
line3.wav - 3 lines
line4.wav - 4 lines

land.wav - sound of brick landing

I removed the error-checking for loading sounds from the init() function though.


Code :
Code: BlitzBasic
  1. ;3FF - Harlequin Software 2002 - 2007
  2. ;Updated version 30 January 2007
  3. AppTitle "3FF - Harlequin Software"
  4. Graphics 320,360,0,2
  5. Const ESCAPE=1, ENTER=28, SPACEBAR=57
  6. Const UPARROW=200, DOWNARROW=208, LEFTARROW=203, RIGHTARROW=205, LEFTCONTROL=29
  7. ;bit values for action
  8. Const PLAY=$1, QUITTED=$2, REDRAW=$4, LANDED=$8, GAMEOVER=$10, ESCAPED=$20
  9. Const BITSUSED=$3F
  10. Const DRAWN=BITSUSED Xor REDRAW, NOTLANDED=BITSUSED Xor LANDED
  11. Const GAMEOVER_OR_ESCAPED=GAMEOVER Or ESCAPED
  12. ;
  13. Const EMPTYROW=$801, FULLROW=$FFF, FULLVISIBLE=$7FE, HIDDENROW=$7FE
  14. Const EAST=-1: WEST=1: CLOCKWISE=1: ANTICLOCKWISE=-1
  15. ;East and West are inverted because - erm - read the guide :)
  16. Global currentrow, shifter, rotation, numlines, startrow
  17. Global speed, time, action
  18.  
  19. Global tiles=CreateImage(16,16,4)
  20.  
  21. ;Global line1snd=LoadSound("soundline1.wav")
  22. ;Global line2snd=LoadSound("soundline2.wav")
  23. ;Global line3snd=LoadSound("soundline3.wav")
  24. ;Global line4snd=LoadSound("soundline4.wav")
  25. ;Global landsnd=LoadSound("soundland.wav")
  26.  
  27. Dim leveldata(23)
  28. Dim levelpaused(21)
  29. Dim currentbrick(3,3)
  30. Dim nextbrick(3,3)
  31. Dim lines(3)
  32.  
  33. SeedRnd MilliSecs()
  34. init()
  35. ;################################ M A I N   L O O P #############################
  36. Repeat
  37.         draw_title()
  38.         draw_next_brick()
  39.         draw_score()
  40.         Flip False
  41.         action=0
  42.         Repeat
  43.                 Delay 1
  44.                 If KeyHit(ENTER) Then action=PLAY
  45.                 If KeyHit(ESCAPE) Then action=QUITTED
  46.         Until action
  47.         If action=PLAY
  48.                 FlushKeys()
  49.                 action=REDRAW
  50.                 speed=1000
  51.                 clear_arrays(True)
  52.                 get_a_brick()
  53.                 get_a_brick() ;to get "next brick" as well
  54.                 numlines=0
  55.                 draw_score()
  56.                 time=MilliSecs()
  57.                 Repeat
  58.                         If action And LANDED
  59.                                 get_a_brick()
  60.                         Else
  61.                                 If MilliSecs()-time > speed
  62.                                         move_down()
  63.                                         time=MilliSecs()
  64.                                 Else
  65.                                         If KeyDown(DOWNARROW) And (MilliSecs()-time > 40)
  66.                                                 move_down()
  67.                                                 time=MilliSecs()
  68.                                         Else
  69.                                                 If KeyHit(LEFTARROW)
  70.                                                         move_brick(WEST)
  71.                                                 Else
  72.                                                         If KeyHit(RIGHTARROW)
  73.                                                                 move_brick(EAST)
  74.                                                         Else
  75.                                                                 If KeyHit(UPARROW)
  76.                                                                         rotate_brick(CLOCKWISE)
  77.                                                                 Else
  78.                                                                         If KeyHit(LEFTCONTROL)
  79.                                                                                 rotate_brick(ANTICLOCKWISE)
  80.                                                                         EndIf
  81.                                                                 EndIf
  82.                                                         EndIf
  83.                                                 EndIf
  84.                                         EndIf
  85.                                 EndIf
  86.                         EndIf
  87.                         If action And REDRAW
  88.                                 If Not(action And LANDED) Then xor_brick()
  89.                                 draw_play_area()
  90.                                 Flip False
  91.                                 action=action And DRAWN
  92.                         Else
  93.                                 Delay 1 ;keep cpu usage down
  94.                         EndIf
  95.                         If KeyHit(SPACEBAR) Then pause()
  96.                         If KeyHit(ESCAPE) Then action=action Or ESCAPED
  97.                 Until action And GAMEOVER_OR_ESCAPED
  98.                 If action And GAMEOVER Then game_over_man()
  99.                 clear_arrays(False)
  100.         EndIf
  101. Until action = QUITTED
  102. End
  103. ;#############################################################
  104. Function clear_arrays(clearlevel)
  105. Local rownumber
  106.         If clearlevel
  107.                 For rownumber=0 To 21
  108.                         leveldata(rownumber)=EMPTYROW
  109.                 Next
  110.                 leveldata(22)=HIDDENROW
  111.         EndIf
  112.         For rotation=0 To 3
  113.                 For rownumber=0 To 3
  114.                         nextbrick(rotation,rownumber)=0
  115.                 Next
  116.         Next
  117. Return
  118. End Function
  119. ;-----------------------------------
  120. Function collided(xadd)
  121. Local x, y, collision=False
  122.         shifter=shifter + xadd
  123.         If shifter>-1           ;shifting left or right?
  124.                 For y=currentrow To currentrow+3
  125.                         If (currentbrick(rotation,y-currentrow) Shl shifter) And leveldata(y) Then collision=True
  126.                 Next
  127.         Else
  128.                 For y=currentrow To currentrow+3
  129.                         If (currentbrick(rotation,y-currentrow) Shr (shifter*-1)) And leveldata(y) Then collision=True 
  130.                 Next
  131.         EndIf
  132.         If collision Then shifter=shifter + (xadd * -1)
  133. Return collision
  134. End Function
  135. ;-----------------------------------
  136. Function draw_next_brick()
  137. Local x, y
  138.         For y=0 To 3
  139.                 For x=0 To 3
  140.                         DrawBlock tiles,284-(x Shl 4),20+(y Shl 4),((nextbrick(0,y) Shr (x+4)) And 1)+2
  141.                 Next
  142.         Next
  143.         action=action Or REDRAW
  144. Return
  145. End Function
  146. ;-----------------------------------
  147. Function draw_play_area()
  148. Local row, column
  149.         For row=2 To 21
  150.                 For column=1 To 10
  151.                         DrawBlock tiles,192-(column Shl 4),(row-2) Shl 4,(leveldata(row) Shr column) And 1
  152.                 Next
  153.         Next
  154. Return
  155. End Function
  156. ;-----------------------------------
  157. Function draw_score()
  158. Local x
  159.         ;this function assumes no one will ever score more than 255 lines
  160.         For x=0 To 7
  161.                 DrawBlock tiles, 176-(x Shl 4), 340, ((numlines Shr x) And 1) + 2
  162.         Next
  163. Return
  164. End Function
  165. ;-----------------------------------
  166. Function draw_title()
  167. Local rownumber
  168.         Restore title3ff
  169.         For rownumber=2 To 21
  170.                 Read leveldata(rownumber)
  171.         Next
  172.         draw_play_area()
  173. Return
  174. End Function
  175. ;-----------------------------------
  176. Function game_over_man()
  177.         Color 0,0,0
  178.         Rect 48,136,128,32,True
  179.         Color 255,255,255
  180.         Text 112,146,"GAME OVER!",True
  181.         Rect 47,135,130,34,False
  182.         Flip False
  183.         Repeat
  184.                 Delay 1
  185.         Until KeyHit(ENTER) Or KeyHit(ESCAPE)
  186.         FlushKeys()
  187. Return
  188. End Function
  189. ;-----------------------------------
  190. Function get_a_brick()
  191. Local randbrick, rownumber
  192.         currentrow=startrow     ;startrow is next brick's start row
  193.         randbrick=Rand(0,6)
  194.         Select randbrick
  195.                 Case 0 Restore column
  196.                 Case 1 Restore L
  197.                 Case 2 Restore r
  198.                 Case 3 Restore cube
  199.                 Case 4 Restore T
  200.                 Case 5 Restore Z
  201.                 Case 6 Restore S
  202.         End Select
  203.         startrow=(randbrick > 2)
  204.         ;startrow depends on height of brick
  205.         For rownumber=0 To 3
  206.                 For rotation=0 To 3
  207.                         currentbrick(rotation,rownumber)=nextbrick(rotation,rownumber)
  208.                         Read nextbrick(rotation,rownumber)
  209.                 Next
  210.         Next
  211.         rotation=0
  212.         action=action And NOTLANDED
  213.         shifter=0
  214.         If collided(0) Then action=action Or GAMEOVER Else draw_next_brick()
  215. Return
  216. End Function
  217. ;-----------------------------------
  218. Function init()
  219. Local tilenumber, y, help$, error, r, g, b
  220.         Restore initdata
  221.         For tilenumber=0 To 3
  222.                 Read r,g,b
  223.                 SetBuffer ImageBuffer(tiles,tilenumber)
  224.                 ClsColor r,g,b
  225.                 Cls
  226.                 Color r Shl 1, g Shl 1, b Shl 1
  227.                 Text 4,1,tilenumber And 1
  228.         Next
  229.         SetBuffer BackBuffer()
  230.         Color 192,164,0
  231.         Text 16,342,"Lines:"
  232.         For y=0 To 5
  233.                 Read help$
  234.                 Text 210,100+(26 * y),help$
  235.         Next
  236.         Color 128,96,0
  237.         For y=0 To 5
  238.                 Read help$
  239.                 Text 220,113+(26 * y),help$
  240.         Next
  241. Return
  242. End Function
  243. ;-----------------------------------
  244. Function move_brick(xadd)
  245.         xor_brick()
  246.         If collided(xadd)
  247.                 xor_brick()
  248.         Else
  249.                 action=action Or REDRAW
  250.         EndIf
  251. Return
  252. End Function
  253. ;-----------------------------------
  254. Function move_down()
  255. Local newlines, rownumber, scrolloff, emptyrows, n
  256.         xor_brick()
  257.         currentrow=currentrow+1
  258.         If collided(0)
  259.                 newlines=0
  260.                 action=action Or LANDED
  261.                 currentrow=currentrow-1
  262.                 xor_brick()
  263.                 For rownumber=currentrow To currentrow+3
  264.                         If leveldata(rownumber)=FULLROW
  265.                                 newlines=newlines+1
  266.                                 lines(rownumber-currentrow)=rownumber
  267.                                 currentbrick(rotation,rownumber-currentrow)=0
  268.                                 leveldata(rownumber)=FULLVISIBLE        ;ready to scroll off
  269.                         EndIf
  270.                 Next
  271.                 If newlines
  272. ;                       Select newlines
  273. ;                               Case 1 PlaySound(line1snd)
  274. ;                               Case 2 PlaySound(line2snd)
  275. ;                               Case 3 PlaySound(line3snd)
  276. ;                               Case 4 PlaySound(line4snd)
  277. ;                       End Select
  278.                         For scrolloff=0 To 9
  279.                                 For rownumber=0 To 3
  280.                                         If lines(rownumber)
  281.                                                 If (rownumber And 1)
  282.                                                         leveldata(lines(rownumber))=leveldata(lines(rownumber)) Shr 1
  283.                                                 Else
  284.                                                         leveldata(lines(rownumber))=leveldata(lines(rownumber)) Shl 1
  285.                                                 EndIf
  286.                                         EndIf
  287.                                 Next
  288.                                 draw_play_area()
  289.                                 Delay 30: Flip False
  290.                         Next
  291.                         Delay 50
  292.                         For rownumber=0 To 3
  293.                                 If lines(rownumber) Then leveldata(lines(rownumber))=EMPTYROW
  294.                                 lines(rownumber)=0
  295.                         Next
  296.                         For emptyrows=0 To newlines
  297.                                 For rownumber=currentrow+3 To 1 Step-1
  298.                                         If leveldata(rownumber)=EMPTYROW And leveldata(rownumber-1)>EMPTYROW
  299.                                                 leveldata(rownumber)=leveldata(rownumber-1)
  300.                                                 leveldata(rownumber-1)=EMPTYROW
  301.                                         EndIf
  302.                                 Next
  303.                                 draw_play_area()
  304.                                 Delay 30: Flip False
  305.                         Next
  306.                         n=numlines+newlines
  307.                         If (n -(n Mod 10)) > (numlines-(numlines Mod 10)) Then speed=speed-(speed * 0.1)
  308.                         ;speed + 10% every 10 lines
  309.                         numlines=numlines+newlines
  310.                         draw_score()
  311. ;               Else
  312. ;                       PlaySound(landsnd)
  313.                 EndIf
  314.         Else
  315.                 action=action Or REDRAW
  316.         EndIf
  317. Return
  318. End Function
  319. ;-----------------------------------
  320. Function pause()
  321. Local oldtime, rownumber
  322.         oldtime=MilliSecs()-time
  323.         Restore pauseddata
  324.         For rownumber=2 To 21
  325.                 levelpaused(rownumber)=leveldata(rownumber)
  326.                 Read leveldata(rownumber)
  327.         Next
  328.         draw_play_area()
  329.         Flip False
  330.         Repeat
  331.                 Delay 1
  332.                 If KeyHit(ESCAPE) Then action=action Or ESCAPED
  333.         Until KeyHit(SPACEBAR) Or (action And ESCAPED)
  334.         FlushKeys()
  335.         If Not(action And ESCAPED)
  336.                 For rownumber=2 To 21
  337.                         leveldata(rownumber)=levelpaused(rownumber)
  338.                 Next
  339.                 draw_play_area()
  340.                 Flip False
  341.                 time=MilliSecs()-oldtime
  342.         EndIf
  343. Return
  344. End Function
  345. ;-----------------------------------
  346. Function rotate_brick(modifier)
  347. Local oldrotation
  348.         xor_brick()
  349.         oldrotation=rotation
  350.         rotation=rotation + modifier
  351.         If rotation > 3 Then rotation=0 ElseIf rotation < 0 Then rotation=3
  352.         If collided(0)
  353.                 If shift_collided()
  354.                         rotation=oldrotation
  355.                         xor_brick()
  356.                 Else
  357.                         action=action Or REDRAW
  358.                 EndIf
  359.         Else
  360.                 action=action Or REDRAW
  361.         EndIf
  362. Return
  363. End Function
  364. ;-----------------------------------
  365. Function shift_collided()
  366. ;rotation caused a collision - can we shift brick sideways?
  367.         If collided(-1)
  368.                 If collided(1)
  369.                         If collided(-2)
  370.                                 Return collided(2)
  371.                         EndIf
  372.                 EndIf
  373.         EndIf
  374. Return False
  375. End Function
  376. ;-----------------------------------
  377. Function xor_brick()
  378. Local y
  379.         If shifter>-1
  380.                 For y=currentrow To currentrow+3
  381.                         leveldata(y) = (leveldata(y)) Xor currentbrick(rotation,y-currentrow) Shl shifter
  382.                 Next
  383.         Else
  384.                 For y=currentrow To currentrow+3
  385.                         leveldata(y) = (leveldata(y)) Xor currentbrick(rotation,y-currentrow) Shr (shifter*-1)
  386.                 Next
  387.         EndIf
  388. Return
  389. End Function
  390. ;-----------------------------------
  391. .initdata
  392. Data 32,32,32           ;Grey 0
  393. Data 127,127,127        ;Grey 1
  394. Data 48,32,64           ;Purple 0
  395. Data 96,64,127          ;Purple 1
  396. Data "Play:","Move:","Rotate right:","Rotate left:","Pause:","Quit:"
  397. Data "Enter","Cursor keys","Up-arrow","L-Ctrl","Spacebar","Escape"
  398. .title3ff
  399. Data 0,0,0,0,$7FE,0,$36C,$148,$36C,$148,$348,0,$7FE,0,0,0,0,0,0,0,0,$7FE
  400. ;brickpatterns
  401. .column
  402. Data $40,$00,$40,$00, $40,$00,$40,$00, $40,$F0,$40,$F0, $40,$00,$40,$00
  403. .T
  404. Data $00,$00,$00,$00, $40,$40,$00,$40, $E0,$60,$E0,$C0, $00,$40,$40,$40
  405. .cube
  406. Data $00,$00,$00,$00, $60,$60,$60,$60, $60,$60,$60,$60, $00,$00,$00,$00
  407. .r
  408. Data $00,$00,$00,$00,$20,$40,$30,$00,$20,$70,$20,$70,$60,$00,$20,$10
  409. .L
  410. Data $00,$00,$00,$00,$40,$00,$C0,$20,$40,$E0,$40,$E0,$60,$80,$40,$00
  411. .Z
  412. Data $00,$00,$00,$00, $C0,$20,$C0,$20, $60,$60,$60,$60, $00,$40,$00,$40
  413. .S
  414. Data $00,$00,$00,$00, $60,$40,$60,$40, $C0,$60,$C0,$60, $00,$20,$00,$20
  415.  
  416. .pauseddata
  417. Data $FFE,$FFE,$FFE,$60E,$666,$666,$666,$666,$666,$60E,$67E,$67E,$67E,$67E
  418. Data $67E,$67E,$67E,$FFE,$FFE,$FFE


Comments :


Vic 3 Babes(Posted 1+ years ago)

 Note - due to the discovery of a bug in BlitzPlus's Random Number Generator after posting the above code, you should add a Default to the Select clause that picks a random brick - something along the lines of:RunTimeError "Random number generated outside specified range"Problem current as of 07 February 2007I suppose that good programming practice demands that you should always have a default clause to trap errors, but who knew.


VP(Posted 1+ years ago)

 If..EndIf's nested 7 deep?You're doing it wrong ;)


Jesse(Posted 1+ years ago)

 I don't think it's that bad.I woud do it like this though:
Code: [Select]
If action And LANDED
get_a_brick()
ElseIf MilliSecs()-time > speed
move_down()
time=MilliSecs()
ElseIf KeyDown(DOWNARROW) And (MilliSecs()-time > 40)
move_down()
time=MilliSecs()
ElseIf KeyHit(LEFTARROW)
move_brick(WEST)
ElseIf KeyHit(RIGHTARROW)
move_brick(EAST)
ElseIf KeyHit(UPARROW)
rotate_brick(CLOCKWISE)
ElseIf KeyHit(LEFTCONTROL)
rotate_brick(ANTICLOCKWISE)
EndIf


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal