Author Topic: Tetris by _vince  (Read 2868 times)

Offline The Librarian

  • Moderator
Tetris by _vince
« on: September 27, 2018, 10:37:42 PM »
Tetris

Author: _vince
Source: qb64.org Forum
URL: https://www.qb64.org/forum/index.php?topic=626.0
Version: 2018
Tags: [2d], [game], [tetris]

Description:
clean and simple tetris implementation. you can change variables size, sw, and sh for custom board sizes.

20:55 < _vince> ive said it before but i think tetris is the ultimate test of a
                programmer
20:55 < _vince> as it combines all programming concepts but doesnt demand any
                specialized knowledge


controls:
* arrow keys: movement, up: rotate
* shift + left/right/down: hard left/right/drop
* spacebar: hard drop
* +/-: change speed
* p: pause
* Enter: restart
* Esc: quit


Source Code:
Code: QB64 [Select]
  1. DEFLNG a-z
  2.  
  3. DIM SHARED piece(6, 3, 1)
  4. DIM SHARED piece_color(6)
  5. DIM SHARED size, sw, sh
  6.  
  7. size = 35
  8. sw = 10
  9. sh = 20
  10.  
  11. REDIM SHARED board(sw - 1, sh - 1)
  12.  
  13. piece(0,0,0)=0: piece(0,1,0)=1: piece(0,2,0)=1: piece(0,3,0)=0
  14. piece(0,0,1)=0: piece(0,1,1)=1: piece(0,2,1)=1: piece(0,3,1)=0
  15. piece(1,0,0)=1: piece(1,1,0)=1: piece(1,2,0)=1: piece(1,3,0)=1
  16. piece(1,0,1)=0: piece(1,1,1)=0: piece(1,2,1)=0: piece(1,3,1)=0
  17. piece(2,0,0)=0: piece(2,1,0)=0: piece(2,2,0)=1: piece(2,3,0)=1
  18. piece(2,0,1)=0: piece(2,1,1)=1: piece(2,2,1)=1: piece(2,3,1)=0
  19. piece(3,0,0)=0: piece(3,1,0)=1: piece(3,2,0)=1: piece(3,3,0)=0
  20. piece(3,0,1)=0: piece(3,1,1)=0: piece(3,2,1)=1: piece(3,3,1)=1
  21. piece(4,0,0)=0: piece(4,1,0)=1: piece(4,2,0)=1: piece(4,3,0)=1
  22. piece(4,0,1)=0: piece(4,1,1)=0: piece(4,2,1)=1: piece(4,3,1)=0
  23. piece(5,0,0)=0: piece(5,1,0)=1: piece(5,2,0)=1: piece(5,3,0)=1
  24. piece(5,0,1)=0: piece(5,1,1)=1: piece(5,2,1)=0: piece(5,3,1)=0
  25. piece(6,0,0)=0: piece(6,1,0)=1: piece(6,2,0)=1: piece(6,3,0)=1
  26. piece(6,0,1)=0: piece(6,1,1)=0: piece(6,2,1)=0: piece(6,3,1)=1
  27.  
  28. SCREEN _NEWIMAGE(sw*size, sh*size, 32)
  29.  
  30. piece_color(0) = _RGB(0,200,0)
  31. piece_color(1) = _RGB(200,0,0)
  32. piece_color(2) = _RGB(156,85,211)
  33. piece_color(3) = _RGB(219,112,147)
  34. piece_color(4) = _RGB(0,100,250)
  35. piece_color(5) = _RGB(230,197,92)
  36. piece_color(6) = _RGB(0,128,128)
  37.  
  38.  
  39. redraw = -1
  40.  
  41. speed = 10
  42. lines = 0
  43. pause = 0
  44. putpiece = 0
  45. startx = (sw - 4)/2
  46.  
  47. pn = INT(RND*7)
  48. px = startx
  49. py = 1
  50. rot = 0
  51.  
  52. title$ = "lines="+LTRIM$(STR$(lines))+",speed="++LTRIM$(STR$(speed))
  53. _TITLE title$
  54.  
  55. t = TIMER
  56.  
  57.         IF (TIMER - t) > (1/speed) AND NOT pause THEN
  58.                 IF valid(pn, px, py + 1, rot) THEN py = py + 1 ELSE putpiece = -1
  59.  
  60.                 t = TIMER
  61.                 redraw = -1
  62.         END IF
  63.  
  64.         IF putpiece THEN
  65.                 IF valid(pn, px, py, rot) THEN
  66.                         n = place(pn, px, py, rot)
  67.                         IF n THEN
  68.                                 lines = lines + n
  69.                                 title$ = "lines="+LTRIM$(STR$(lines))+",speed="++LTRIM$(STR$(speed))
  70.                                 _TITLE title$
  71.                         END IF
  72.                 END IF
  73.  
  74.                 pn = INT(RND*7)
  75.                 px = startx
  76.                 py = 0
  77.                 rot = 0
  78.  
  79.                 putpiece = 0
  80.                 redraw = -1
  81.  
  82.                 IF NOT valid(pn, px, py, rot) THEN
  83.                         FOR y=0 TO sh-1
  84.                                 FOR x=0 TO sw-1
  85.                                         board(x, y) = 0
  86.                                 NEXT
  87.                         NEXT
  88.                         lines = 0
  89.                         title$ = "lines="+LTRIM$(STR$(lines))+",speed="++LTRIM$(STR$(speed))
  90.                         _TITLE title$
  91.                 END IF
  92.         END IF
  93.  
  94.         IF redraw THEN
  95.                 LINE (0,0)-(sw*size, sh*size),_RGB(0,0,0),bf
  96.                 FOR y=0 TO sh - 1
  97.                         FOR x=0 TO sw - 1
  98.                                 IF board(x, y) <> 0 THEN
  99.                                         LINE (x*size, y*size)-STEP(size-2, size-2), piece_color(board(x, y)-1), bf
  100.                                 ELSE
  101.                                         LINE (x*size, y*size)-STEP(size-2, size-2), _RGB(50,50,50), b
  102.                                 END IF
  103.                         NEXT
  104.                 NEXT
  105.  
  106.                 FOR y=0 TO 1
  107.                         FOR x=0 TO 3
  108.                                 rotate xx, yy, x, y, pn, rot
  109.                                 IF piece(pn, x, y) THEN LINE ((px + xx)*size, (py + yy)*size)-STEP(size-2, size-2), piece_color(pn), bf
  110.                         NEXT
  111.                 NEXT
  112.  
  113.                 _DISPLAY
  114.                 redraw = 0
  115.         END IF
  116.  
  117.         k = _KEYHIT
  118.         IF k THEN
  119.                 shift = _KEYDOWN(100304) OR _KEYDOWN(100303)
  120.                 SELECT CASE k
  121.                 CASE 18432 'up
  122.                         IF valid(pn, px, py, (rot + 1) MOD 4) THEN rot = (rot + 1) MOD 4
  123.                         pause = 0
  124.                 CASE 19200 'left
  125.                         IF shift THEN
  126.                                 FOR xx=0 TO sw-1
  127.                                         IF NOT valid(pn, px - xx, py, rot) THEN EXIT FOR
  128.                                 NEXT
  129.                                 px = px - xx + 1
  130.                         ELSE
  131.                                 IF valid(pn, px - 1, py, rot) THEN px = px - 1
  132.                         END IF
  133.                         pause = 0
  134.                 CASE 19712 'right
  135.                         IF shift THEN
  136.                                 FOR xx=px TO sw-1
  137.                                         IF NOT valid(pn, xx, py, rot) THEN EXIT FOR
  138.                                 NEXT
  139.                                 px = xx - 1
  140.                         ELSE
  141.                                 IF valid(pn, px + 1, py, rot) THEN px = px + 1
  142.                         END IF
  143.                         pause = 0
  144.                 CASE 20480, 32 'down
  145.                         IF shift OR k = 32 THEN
  146.                                 FOR yy=py TO sh-1
  147.                                         IF NOT valid(pn, px, yy, rot) THEN EXIT FOR
  148.                                 NEXT
  149.                                 py = yy - 1
  150.                                 putpiece = -1
  151.                         ELSE
  152.                                 IF valid(pn, px, py + 1, rot) THEN py = py + 1
  153.                         END IF
  154.                         pause = 0
  155.                 CASE 112 'p
  156.                         pause = NOT pause
  157.                 CASE 13 'enter
  158.                         FOR y=0 TO sh-1
  159.                                 FOR x=0 TO sw-1
  160.                                         board(x, y) = 0
  161.                                 NEXT
  162.                         NEXT
  163.                         pn = INT(RND*7)
  164.                         px = startx
  165.                         py = 0
  166.                         rot = 0
  167.                         putpiece = 0
  168.                         lines = 0
  169.                         title$ = "lines="+LTRIM$(STR$(lines))+",speed="++LTRIM$(STR$(speed))
  170.                         _TITLE title$
  171.                 CASE 43, 61 'plus
  172.                         IF speed < 100 THEN
  173.                                 speed = speed + 1
  174.                                 title$ = "lines="+LTRIM$(STR$(lines))+",speed="++LTRIM$(STR$(speed))
  175.                                 _TITLE title$
  176.                         END IF
  177.                 CASE 95, 45
  178.                         IF speed > 1 THEN
  179.                                 speed = speed - 1
  180.                                 title$ = "lines="+LTRIM$(STR$(lines))+",speed="++LTRIM$(STR$(speed))
  181.                                 _TITLE title$
  182.                         END IF
  183.                 CASE 27
  184.                         EXIT DO
  185.                 END SELECT
  186.  
  187.                 redraw = -1
  188.         END IF
  189.  
  190. SUB rotate(xx, yy, x, y, pn, rot)
  191.         SELECT CASE pn
  192.         CASE 0
  193.                 rot_new = 0
  194.         CASE 1 TO 3
  195.                 rot_new = rot MOD 2
  196.         CASE 4 TO 6
  197.                 rot_new = rot
  198.         END SELECT
  199.  
  200.         SELECT CASE rot_new
  201.         CASE 0
  202.                 xx = x
  203.                 yy = y
  204.         CASE 1
  205.                 xx = y + 2
  206.                 yy = 2 - x
  207.         CASE 2
  208.                 xx = 4 - x
  209.                 yy = 1 - y
  210.         CASE 3
  211.                 xx = 2 - y
  212.                 yy = x - 1
  213.         END SELECT
  214.  
  215. FUNCTION valid(pn, px, py, rot)
  216.         FOR y=0 TO 1
  217.                 FOR x=0 TO 3
  218.                         rotate xx, yy, x, y, pn, rot
  219.                         IF py + yy >= 0 THEN
  220.                                 IF piece(pn, x, y) THEN
  221.                                         IF (px + xx >= sw) OR (px + xx < 0) THEN
  222.                                                 valid = 0
  223.                                                 EXIT FUNCTION
  224.                                         END IF
  225.                                         IF (py + yy >= sh) THEN
  226.                                                 valid = 0
  227.                                                 EXIT FUNCTION
  228.                                         END IF
  229.                                         IF (py >= 0) THEN
  230.                                         IF board(px + xx, py + yy) THEN
  231.                                                 valid = 0
  232.                                                 EXIT FUNCTION
  233.                                         END IF
  234.                                         END IF
  235.                                 END IF
  236.                         END IF
  237.                 NEXT
  238.         NEXT
  239.  
  240.         valid = -1
  241.  
  242. FUNCTION place(pn, px, py, rot)
  243.         lines = 0
  244.  
  245.         FOR y=0 TO 1
  246.                 FOR x=0 TO 3
  247.                         rotate xx, yy, x, y, pn, rot
  248.                         IF py + yy >= 0 THEN IF piece(pn, x, y) THEN board(px + xx, py + yy) = pn + 1
  249.                 NEXT
  250.         NEXT
  251.  
  252.         'clear lines
  253.         FOR y=py-1 TO py+2
  254.                 IF y>=0 AND y<sh THEN
  255.                         clr = -1
  256.                         FOR x=0 TO sw - 1
  257.                                 IF board(x, y) = 0 THEN
  258.                                         clr = 0
  259.                                         EXIT FOR
  260.                                 END IF
  261.                         NEXT
  262.  
  263.                         IF clr THEN
  264.                                 lines = lines + 1
  265.                                 FOR yy=y TO 1 STEP -1
  266.                                         FOR x=0 TO sw-1
  267.                                                 board(x, yy) = board(x, yy-1)
  268.                                         NEXT
  269.                                 NEXT
  270.                         END IF
  271.                 END IF
  272.         NEXT
  273.  
  274.         place = lines
  275.  

« Last Edit: February 03, 2019, 10:42:40 PM by The Librarian »