View difference between Paste ID: sWeYSVaf and GLb5aXxS
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))