俄罗斯方块之二——在游戏区域内活动小方格

根据动画的原理,如果要让一个小方格移动起来,就是让背景网格中的小方格按照运动规律以此呈现出来即可。按照这个思路,我们组织本章节的内容。

1、构建保存小方格 Rect 对象的矩阵

按照上一节的定义,我们将游戏区域分解成了 N 个小方格大小的网格,其实就是一个保存有各个小方格左上角坐标的矩阵(或曰二维数组)。

那么根据 Rect 类的特性,为了优化代码,我们将二维数组内保存的小方格左上角坐标,改为保存各个小方格的 Rect 对象。

def matrix():
    ''' 功能:以游戏区域为基础,画出用于呈现小方格的 Rect 对象的矩阵。
    '''
    # 下面一行列表推导的代码用于构造小方格的 Rect 对象的二维列表
    box_coordinate_list = [[pygame.Rect((coordinate[0] + x*edge + 2),
                            (coordinate[1] + y*edge + 2), edge, edge)
                            for x in range(box_col)] for y in range(box_row)]

    return box_coordinate_list

上面的代码就是将列表推导中的 ((coordinate[0] + x*edge + 2), (coordinate[1] + y*edge + 2)) 内容修改为 pygame.Rect((coordinate[0] + x*edge + 2), (coordinate[1] + y*edge + 2), edge, edge),按照 pygame.Rect 类的语法结构,加上小方格的边长。

同时,我们将背景中的网格进行了隐藏处理,相关代码也进行了精简。

2、修改小方格的呈现方法

为了能够适应游戏区域的矩阵所保存的对象,我们需要修改一下 box 函数,将原来的参数由坐标改为 Rect 对象。

def box(rect:"该参数为一个pygame.Rect对象"):
    ''' 功能:画出用于组成图形的单个正方形
    '''
    pygame.Surface.fill(screen, yellow, rect) # 填充方格内的颜色
    pygame.draw.rect(screen, white, rect, 1)  # 画出方格的线条
    return rect

3、让小方格动起来

为了能让事件驱动小方格,我使用向左键和向右键两个键来控制小方格的左右移动。我们可以在主函数中修改为如下代码:

if __name__ == "__main__":
    pygame.init()  # 使用 pygame 之前先进行初始化
    screen = pygame.display.set_mode((s_width, s_height), pygame.RESIZABLE, 32)
    pygame.display.set_caption("俄罗斯方块") # 设置窗体名称

    m = matrix()    # 矩阵在主函数中调用一次即可,没有必要放到 while 循环中。
    row, col = inital_pos # 小方格的初始化位置,inital_pos 需要定义一个全局变量。

    while True:
        pygame.time.delay(100) # 设置动作的延迟时间为 100 毫秒
        screen.fill(bgcolor)  # 表示填充背景颜色。
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # 检测退出动作
                exit()
        area()

        keys = pygame.key.get_pressed()  # 检测键盘动作
        if keys[pygame.K_LEFT]:         # 使用向左键来控制小方格向左移动
            if col > 0:
                col -= 1
        if keys[pygame.K_RIGHT]:        # 使用向左键来控制小方格向右移动
            if col < box_col-1:
                col += 1

        box(m[row][col]) # 将小方格的呈现放到键盘的控制之后,可以及时接受到变量。
        pygame.display.update()

动图演示如下:

运动的小方格

如果想让小方格自动向下,那么只需要在 while 循环的内部,最好是在 box(m[row][col]) 这行代码之上加入这一行代码:

row += 1

该行代码的功能就是在每个循环中让 row 加一,也就是选择当前小方格下一行的方格。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343