> 文档中心 > micro bit python_python教程之micro:bit俄罗斯方块游戏

micro bit python_python教程之micro:bit俄罗斯方块游戏

我们正在创建一个俄罗斯方块游戏,并在BBC micro:bit上运行。

游戏中落下的俄罗斯方块将基于以下四种形状:

游戏规则如下:按钮A:将当前方块移动到左侧

按钮B:将当前方块移动到右侧

按钮A和B同时:顺时针旋转当前方块

视频演示

游戏将使用mico:bit的LED屏幕,其由5*5的25个LED组成。

每个LED可以打开(值:9表示最大亮度)或关闭(值:0)

并显示边界部分(未落下的方块)

Python代码将使用二维数组(Python中的列表)来存储主屏幕显示(7×5)和当前方块(2×2)

下载此代码,您可以使用micro:bit网站上的Python编辑器。

Python代码

from microbit import *

from random import choice

#Set up the tetris grid

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]]

#Store a list of 4 bricks, each brick is a 2x2 grid

bricks = [[9,9],[9,0]],[[9,9],[0,9]],[[9,9],[9,9]],[[9,9],[0,0]]

#select a brick randomly and position it at the center/top of the grid (y=0,x=3)

brick = choice(bricks)

x=3

y=0

frameCount=0

#A function to return the maximum of two values

def max(a,b):

if a>=b:

return a

else:

return b

#A function to hide the 2x2 brick on the LED screen

def hideBrick():

if x>0:

display.set_pixel(x-1,y,grid[y][x])

if x0 and y<4:

display.set_pixel(x-1,y+1,grid[y+1][x])

if x<5 and y0:

display.set_pixel(x-1,y,max(brick[0][0],grid[y][x]))

if x0 and y<4:

display.set_pixel(x-1,y+1,max(brick[1][0],grid[y+1][x]))

if x0) 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)):

hideBrick()

brick[0][0] = pixel10

brick[1][0] = pixel11

brick[1][1] = pixel01

brick[0][1] = pixel00

showBrick()

#A function to move/translate the brick

def moveBrick(delta_x,delta_y):

global x,y

move=False

#Check if the move if possible: no collision with other blocks or borders of the grid

if delta_x==-1 and x>0:

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)):

move=True

elif delta_x==1 and x0 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)):

move=True

elif delta_y==1 and y0 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)):

move=True

#If the move is possible, update x,y coordinates of the brick

if move:

hideBrick()

x+=delta_x

y+=delta_y

showBrick()

#Return True or False to confirm if the move took place

return move

#A function to check for and remove completed lines

def checkLines():

global score

removeLine=False

#check each line one at a time

for i in range(0, 5):

#If 5 blocks are filled in (9) then a line is complete (9*5=45)

if (grid[i][1]+grid[i][2]+grid[i][3]+grid[i][4]+grid[i][5])==45:

removeLine = True

#Increment the score (10 pts per line)

score+=10

#Remove the line and make all lines above fall by 1:

for j in range(i,0,-1):

grid[j] = grid[j-1]

grid[0]=[1,0,0,0,0,0,1]

if removeLine:

#Refresh the LED screen

for i in range(0, 5):

for j in range(0, 5):

display.set_pixel(i,j,grid[j][i+1])

return removeLine

gameOn=True

score=0

showBrick()

#Main Program Loop - iterates every 50ms

while gameOn:

sleep(50)

frameCount+=1

#Capture user inputs

if button_a.is_pressed() and button_b.is_pressed():

rotateBrick()

elif button_a.is_pressed():

moveBrick(-1,0)

elif button_b.is_pressed():

moveBrick(1,0)

#Every 15 frames try to move the brick down

if frameCount==15 and moveBrick(0,1) == False:

frameCount=0

#The move was not possible, the brick stays in position

grid[y][x]=max(brick[0][0],grid[y][x])

grid[y][x+1]=max(brick[0][1],grid[y][x+1])

grid[y+1][x]=max(brick[1][0],grid[y+1][x])

grid[y+1][x+1]=max(brick[1][1],grid[y+1][x+1])

if checkLines()==False and y==0:

#The brick has reached the top of the grid - Game Over

gameOn=False

else:

#select a new brick randomly

x=3

y=0

brick = choice(bricks)

showBrick()

if frameCount==15:

frameCount=0

#End of Game

sleep(2000)

display.scroll("Game Over: Score: " + str(score))

注意:测试此代码时,您可能希望删除一些#注释,尤其是当您的micro:bit返回“内存已满”错误时。