美文网首页会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 实现起来比较简单,只要根据列表的下标来以此选择不同的拼版的样式即可。

    相关文章

      网友评论

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

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