制作坊python教程之micro:bit俄罗斯方块游戏 专区

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

binglingdang2018-12-10 3137人围观
简介micro:bit挑战经典游戏之俄罗斯方块!重温经典图游戏,你小时候还玩过哪些游戏呢?

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

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

microbit  - 俄罗斯方块形状


游戏规则如下:

  • 按钮A:将当前方块移动到左侧

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

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


视频演示


游戏将使用mico:bit的LED屏幕,其由5*5的25个LED组成。
每个LED可以打开(值:9表示最大亮度)或关闭(值:0)
并显示边界部分(未落下的方块)

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

image.png

image.png

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

image.png


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返回“内存已满”错误时。

俄罗斯方块.zip


9+1

评论

这个好玩(=・ω・=)

#12019-01-11 20:510回复

嘻嘻嘻 看来大家都是喜欢游戏

2019-01-13 09:080

第28行代码少了一个左括号,还有pixel00,pixel01,pixel10,pixel11分别是什么变量,没有定义过

#22018-12-17 09:200回复

的确是的,放代码的时候没有认真看,谢谢提醒,我会将源代码一起放上去

2018-12-17 09:390

已修改,感谢您的指正@daydreaming

#32018-12-17 10:050回复

成功了~很好玩!

2018-12-17 16:130

感觉玩这种休息的话,还是有点费劲,毕竟点阵太小了……哈哈……不过想法是很不错……

#42019-01-08 09:030回复

好玩有意思

#52019-01-15 12:280回复

嘻嘻嘻,后面我再找找有没有其他游戏

2019-01-24 09:110

内存太大(●¯(エ)¯●)

#62019-01-23 18:380回复

需要删除里面的注释再进行下载!就是#和后面的部分

2019-01-24 09:110