SHOW:
|
|
- or go back to the newest paste.
1 | from microbit import * | |
2 | from random import choice | |
3 | ||
4 | #Set up the tetris grid | |
5 | grid=[[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,1,1,1,1,1,1]] | |
6 | #Store a list of 4 bricks, each brick is a 2x2 grid | |
7 | bricks = [[9,9],[9,0]],[[9,9],[0,9]],[[9,9],[9,9]],[[9,9],[0,0]] | |
8 | #select a brick randomly and position it at the center/top of the grid (y=0,x=3) | |
9 | brick = choice(bricks) | |
10 | x=3 | |
11 | y=0 | |
12 | frameCount=0 | |
13 | ||
14 | #A function to return the maximum of two values | |
15 | def max(a,b): | |
16 | if a>=b: | |
17 | return a | |
18 | else: | |
19 | return b | |
20 | ||
21 | #A function to hide the 2x2 brick on the LED screen | |
22 | def hideBrick(): | |
23 | if x>0: | |
24 | display.set_pixel(x-1,y,grid[y][x]) | |
25 | if x<5: | |
26 | display.set_pixel(x+1-1,y,grid[y][x+1]) | |
27 | if x>0 and y<4: | |
28 | display.set_pixel(x-1,y+1,grid[y+1][x]) | |
29 | if x<5 and y<4: | |
30 | display.set_pixel(x+1-1,y+1,grid[y+1][x+1]) | |
31 | ||
32 | #A function to show the 2x2 brick on the LED screen | |
33 | def showBrick(): | |
34 | if x>0: | |
35 | display.set_pixel(x-1,y,max(brick[0][0],grid[y][x])) | |
36 | if x<5: | |
37 | display.set_pixel(x+1-1,y,max(brick[0][1],grid[y][x+1])) | |
38 | if x>0 and y<4: | |
39 | display.set_pixel(x-1,y+1,max(brick[1][0],grid[y+1][x])) | |
40 | if x<5 and y<4: | |
41 | display.set_pixel(x+1-1,y+1,max(brick[1][1],grid[y+1][x+1])) | |
42 | ||
43 | #A function to rotate the 2x2 brick | |
44 | def rotateBrick(): | |
45 | pixel00 = brick[0][0] | |
46 | pixel01 = brick[0][1] | |
47 | pixel10 = brick[1][0] | |
48 | pixel11 = brick[1][1] | |
49 | #Check if the rotation is possible | |
50 | if not ((grid[y][x]>0 and pixel00>0) or (grid[y+1][x]>0 and pixel10>0) or (grid[y][x+1]>0 and pixel01>0) or (grid[y+1][x+1]>0 and pixel11>0)): | |
51 | hideBrick() | |
52 | brick[0][0] = pixel10 | |
53 | brick[1][0] = pixel11 | |
54 | brick[1][1] = pixel01 | |
55 | brick[0][1] = pixel00 | |
56 | showBrick() | |
57 | ||
58 | #A function to move/translate the brick | |
59 | def moveBrick(delta_x,delta_y): | |
60 | global x,y | |
61 | move=False | |
62 | #Check if the move if possible: no collision with other blocks or borders of the grid | |
63 | if delta_x==-1 and x>0: | |
64 | if not ((grid[y][x-1]>0 and brick[0][0]>0) or (grid[y][x+1-1]>0 and brick[0][1]>0) or (grid[y+1][x-1]>0 and brick[1][0]>0) or (grid[y+1][x+1-1]>0 and brick[1][1]>0)): | |
65 | move=True | |
66 | elif delta_x==1 and x<5: | |
67 | if not ((grid[y][x+1]>0 and brick[0][0]>0) or (grid[y][x+1+1]>0 and brick[0][1]>0) or (grid[y+1][x+1]>0 and brick[1][0]>0) or (grid[y+1][x+1+1]>0 and brick[1][1]>0)): | |
68 | move=True | |
69 | elif delta_y==1 and y<4: | |
70 | if not ((grid[y+1][x]>0 and brick[0][0]>0) or (grid[y+1][x+1]>0 and brick[0][1]>0) or (grid[y+1+1][x]>0 and brick[1][0]>0) or (grid[y+1+1][x+1]>0 and brick[1][1]>0)): | |
71 | move=True | |
72 | #If the move is possible, update x,y coordinates of the brick | |
73 | if move: | |
74 | hideBrick() | |
75 | x+=delta_x | |
76 | y+=delta_y | |
77 | showBrick() | |
78 | ||
79 | #Return True or False to confirm if the move took place | |
80 | return move | |
81 | ||
82 | #A function to check for and remove completed lines | |
83 | def checkLines(): | |
84 | global score | |
85 | removeLine=False | |
86 | #check each line one at a time | |
87 | for i in range(0, 5): | |
88 | #If 5 blocks are filled in (9) then a line is complete (9*5=45) | |
89 | if (grid[i][1]+grid[i][2]+grid[i][3]+grid[i][4]+grid[i][5])==45: | |
90 | removeLine = True | |
91 | #Increment the score (10 pts per line) | |
92 | score+=10 | |
93 | #Remove the line and make all lines above fall by 1: | |
94 | for j in range(i,0,-1): | |
95 | grid[j] = grid[j-1] | |
96 | grid[0]=[1,0,0,0,0,0,1] | |
97 | if removeLine: | |
98 | #Refresh the LED screen | |
99 | for i in range(0, 5): | |
100 | for j in range(0, 5): | |
101 | display.set_pixel(i,j,grid[j][i+1]) | |
102 | return removeLine | |
103 | ||
104 | gameOn=True | |
105 | score=0 | |
106 | showBrick() | |
107 | #Main Program Loop - iterates every 50ms | |
108 | while gameOn: | |
109 | sleep(50) | |
110 | frameCount+=1 | |
111 | #Capture user inputs | |
112 | if button_a.is_pressed() and button_b.is_pressed(): | |
113 | rotateBrick() | |
114 | elif button_a.is_pressed(): | |
115 | moveBrick(-1,0) | |
116 | elif button_b.is_pressed(): | |
117 | moveBrick(1,0) | |
118 | ||
119 | #Every 15 frames try to move the brick down | |
120 | if frameCount==15 and moveBrick(0,1) == False: | |
121 | frameCount=0 | |
122 | #The move was not possible, the brick stays in position | |
123 | grid[y][x]=max(brick[0][0],grid[y][x]) | |
124 | grid[y][x+1]=max(brick[0][1],grid[y][x+1]) | |
125 | grid[y+1][x]=max(brick[1][0],grid[y+1][x]) | |
126 | grid[y+1][x+1]=max(brick[1][1],grid[y+1][x+1]) | |
127 | ||
128 | if checkLines()==False and y==0: | |
129 | #The brick has reached the top of the grid - Game Over | |
130 | gameOn=False | |
131 | else: | |
132 | #select a new brick randomly | |
133 | x=3 | |
134 | y=0 | |
135 | brick = choice(bricks) | |
136 | showBrick() | |
137 | ||
138 | if frameCount==15: | |
139 | frameCount=0 | |
140 | ||
141 | #End of Game | |
142 | sleep(2000) | |
143 | display.scroll("Game Over: Score: " + str(score)) |