美文网首页会Python就够了
俄罗斯方块之三——构建四格拼板

俄罗斯方块之三——构建四格拼板

作者: 藕丝空间 | 来源:发表于2019-08-13 17:29 被阅读0次

四格拼板是俄罗斯方块游戏中所对应的字母图形。每个字母由四个小方格组成。组成的图像一般有有七种:'I', 'J', 'L', 'O', 'S', 'T', 'Z',而这七种图形当中,除了 "O" 之外,其它的图像转动都会改变。这是我们在设计四格拼板的时候要注意的地方。

1、设计四格拼板

转动图形的时候必须要有一个中心点,不然转动时就会出现奇怪的现象。我们将那个中心点的位置记为(0, 0),第一个零表示行,第二个零表示列,没向左一个那么列减一,没向下一行行加一,具体的意思大家看下图一看便知。

T型拼版

这样我们将一种拼版的转动后的形状记为一个元组列表,如我们记上图为[(0, -1), (0, 0), (0, 1), (-1, 0)],七种的坐标正好对应着背景网格中的行列数,这样上面的 T 型拼版一共可以有四种形状,就用四个这样的列表表示:

T = [[(0, -1), (0, 0), (0, 1), (-1, 0)],
     [(-1, 0), (0, 0), (1, 0), (0, 1)],
     [(0, -1), (0, 0), (0, 1), (1, 0)],
     [(-1, 0), (0, 0), (1, 0), (0, -1)]]

这四个列表是按照图形顺时针转动的方向顺序进行排列的

七种图形对应的代码如下:

I = [[(0, -1), (0, 0), (0, 1), (0, 2)],
     [(-1, 0), (0, 0), (1, 0), (2, 0)]]
J = [[(-2, 0), (-1, 0), (0, 0), (0, -1)],
     [(-1, 0), (0, 0), (0, 1), (0, 2)],
     [(0, 1), (0, 0), (1, 0), (2, 0)],
     [(0, -2), (0, -1), (0, 0), (1, 0)]]
L = [[(-2, 0), (-1, 0), (0, 0), (0, 1)],
     [(1, 0), (0, 0), (0, 1), (0, 2)],
     [(0, -1), (0, 0), (1, 0), (2, 0)],
     [(0, -2), (0, -1), (0, 0), (-1, 0)]]
O = [[(0, 0), (0, 1), (1, 0), (1, 1)]]
S = [[(-1, 0), (0, 0), (0, 1), (1, 1)],
     [(1, -1), (1, 0), (0, 0), (0, 1)]]
T = [[(0, -1), (0, 0), (0, 1), (-1, 0)],
     [(-1, 0), (0, 0), (1, 0), (0, 1)],
     [(0, -1), (0, 0), (0, 1), (1, 0)],
     [(-1, 0), (0, 0), (1, 0), (0, -1)]]
Z = [[(0, -1), (0, 0), (1, 0), (1, 1)],
     [(-1, 0), (0, 0), (0, -1), (1, -1)]]
# 定义拼版元组
shapes = (I, J, L, O, S, T, Z)

这样我们每次更新拼版位置的时候,只需要更新拼版的中心就可以了,而形状只需要根据上面列表中的相对位置,再加上拼版中心的实际位置(相对位置为(0, 0))画出拼版的实际形状。

拼版的生成有以下几点需要注意:

  1. 为了好看,我们在游戏的最前面定义了好多颜色,每次我们就随机选择一种颜色。
  2. 生成拼版的时候,我们随机选择一个拼版类型。
  3. 初始化时,我们将拼版中心的坐标置于屏幕的中上方。
  4. 每次生成拼版我们都随机选择一种形状。

2、实现随机颜色

我们只需要简单改变一下实现小方格的函数 box() 即可。

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

3、随机选择一个拼版类型,随机选择一种形状,将中心置于游戏区域中上方

既然是随机选择,那么就使用随机库 random 来实现我们的需求。

    #定义游戏区域中的小方格的开始位置
    inital_pos = (0, int(box_col//2))  # 定义初始化位置为游戏区域中上方
    ......
    row, col = inital_pos
    color = random.choice(colors)
    shapes = random.choice(shapes_tuple)
    shape =  random.choice(shapes)
    shape_num = shapes.index(shape)  # 获取四格拼板的形状列表的下标

4、显示一个四格拼板

我们已经确定了每个四格拼板的中心位置,以及其它小方格相对于中心位置的坐标,那么我们可以将组成四格拼板的小方格对照其在游戏区域中的二维数组中的位置,将对应的小方格一一显示出来,代码如下:

def show_shape(rect_matrix, row, col, shape, color):
    '''功能:显示游戏区域内的四格拼版。
        参数:matrix: 游戏区域的网格的坐标
             row:拼版的中心点相对背景网格的横坐标
             col:拼版的中心点相对背景网格的纵坐标
             shape: 四格拼版的小方格相对于中心点的坐标
             color:拼版的颜色
    '''
    for x in shape:
        if row//edge+x[0] >= 0: # 舍弃中心点以上部分,防止从最底部出现
            box(rect_matrix[row+x[0]*edge][col+x[1]], color)

5、四格拼板的变形

这个使用 Python 实现起来比较简单,只要根据列表的下标来以此选择不同的拼版的样式即可。

相关文章

  • 俄罗斯方块之三——构建四格拼板

    四格拼板是俄罗斯方块游戏中所对应的字母图形。每个字母由四个小方格组成。组成的图像一般有有七种:'I', 'J', ...

  • 俄罗斯方块之四——四格拼板的冲突和限制

    四格拼版是有自己的活动区域限制的,而且还有和其它的四格拼板的冲突问题。这其实就是我们所玩的俄罗斯方块游戏的规则问题...

  • 2019-06-12

    DXP中拼板方式 如今一款PCB打样越来越便宜了,但是当做小板子的时候,还是希望使用拼板。使用拼板的时候不免要使用...

  • DXP中拼板方式

    DXP中拼板方式 如今一款PCB打样越来越便宜了,但是当做小板子的时候,还是希望使用拼板。使用拼板的时候不免要使用...

  • 读后感:《阅读的方法》——快意 仰天大笑出门去

    玩过俄罗斯方块这个游戏的人,都体验过这种情形:方块一个一个往下掉,越堆越高,你越来越焦灼,突然掉下了一个四格长条,...

  • (美)理查德·德威特‖《世界观》

    作者把世界观比喻成拼图。 在一幅拼图中,核心拼板和外围拼板存在一些不同点。由于拼板之间相互联结,一块位于中心位置的...

  • PCB板拼板的优点跟方式

    PCB线路板分为单片出货和拼板出货,这里主要讲下拼板,所谓拼板顾名思义就是把几块板子拼在一起,那为什么要拼在一起出...

  • 四格漫画《尾巴》创作过程

    阶段一:脚本构思及分镜。 四格漫画的基本叙事结构是“起、承、转、合”,如果按照这个模板来构建剧情,一般不会出错。 ...

  • 2020-09-17

    PCB拼板设计对SMT生产效率到底有多大的影响? 作者:王辉刚,王辉东(一博科技高速先生自媒体团队成员) 拼板是一...

  • 让家具更美好的胶——兔宝宝拼板胶

    如何利用有限的木材,提高木材的出材率,相信是很多家具人关注的问题,今天,小编为大家介绍有关拼板这些事。 什么是拼板...

网友评论

    本文标题:俄罗斯方块之三——构建四格拼板

    本文链接:https://www.haomeiwen.com/subject/ajbbjctx.html