python趣味编程-如何实现俄罗斯方块

python趣味编程-如何实现俄罗斯方块_第1张图片

Pygame

Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows、Linux、Mac OS 等操作系统,具有良好的跨平台性。Pygame 由 Pete Shinners 于 2000 年开发而成,是一款免费、开源的的软件包,因此您可以放心地使用它来开发游戏,不用担心有任何费用产生。

Pygame 在 SDL(Simple DirectMedia Layer,使用 C语言编写的多媒体开发库) 的基础上开发而成,它提供了诸多操作模块,比如图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模块等。相比于开发 3D 游戏而言,Pygame 更擅长开发 2D 游戏,比如于飞机大战、贪吃蛇、扫雷等游戏。

原理

要想实现一个俄罗斯方块游戏,我们需要解决以下问题:

1、显示方块
2、实现方块的移动(左右)
3、方块旋转
4、对层满的方块消行
5、提示下一个方块的形状

显示方块


每个方块由四个box组成,从游戏框的中心位置掉落。7种基本形状(TSZJLIO)如下图:

由于方块最大的长度是长条形的,为4格,所以统一用4*4的方格来定义。 以一个二维数组来定义方块,0表示空,1表示实心。

每种方块都能够旋转,所谓旋转,即是把方块顺时针旋转90°。我们创建数组来存储这些方块,像下面这样,“.”表示空白,“O”表示小方格。 例如:
['.....',
'.....',
'..00.',
'.00..',
'.....']
上面就是绘制的一个如下图的S型方块

S = [['.....',
      '.....',
      '..00.',
      '.00..',
      '.....'],
     ['.....',
      '..0..',
      '..00.',
      '...0.',
      '.....']]

Z = [['.....',
      '.....',
      '.00..',
      '..00.',
      '.....'],
     ['.....',
      '..0..',
      '.00..',
      '.0...',
      '.....']]

I = [['.....',
      '..0..',
      '..0..',
      '..0..',
      '..0..'],
     ['.....',
      '0000.',
      '.....',
      '.....',
      '.....']]

O = [['.....',
      '.....',
      '.00..',
      '.00..',
      '.....']]

J = [['.....',
      '.0...',
      '.000.',
      '.....',
      '.....'],
     ['.....',
      '..00.',
      '..0..',
      '..0..',
      '.....'],
     ['.....',
      '.....',
      '.000.',
      '...0.',
      '.....'],
     ['.....',
      '..0..',
      '..0..',
      '.00..',
      '.....']]

L = [['.....',
      '...0.',
      '.000.',
      '.....',
      '.....'],
     ['.....',
      '..0..',
      '..0..',
      '..00.',
      '.....'],
     ['.....',
      '.....',
      '.000.',
      '.0...',
      '.....'],
     ['.....',
      '.00..',
      '..0..',
      '..0..',
      '.....']]

T = [['.....',
      '..0..',
      '.000.',
      '.....',
      '.....'],
     ['.....',
      '..0..',
      '..00.',
      '..0..',
      '.....'],
     ['.....',
      '.....',
      '.000.',
      '..0..',
      '.....'],
     ['.....',
      '..0..',
      '.00..',
      '..0..',
      '.....']]

实现

对层满的方块消行

def clear_rows(grid, locked):
   
    increment = 0
    for i in range(len(grid) - 1, -1, -1):      
        grid_row = grid[i]                     
        if (0, 0, 0) not in grid_row:           
            increment += 1
            
            index = i                          
            for j in range(len(grid_row)):
                try:
                    del locked[(j, i)]          
                except ValueError:
                    continue

  
    if increment > 0:
        for key in sorted(list(locked), key=lambda a: a[1])[::-1]:
            x, y = key
            if y < index:                      
                new_key = (x, y + increment)    
                locked[new_key] = locked.pop(key)

    return increment

提示下一个方块的形状

def draw_next_shape(piece, surface):
    font = pygame.font.Font(fontpath, 30)
    label = font.render('Next shape', 1, (255, 255, 255))

    start_x = top_left_x + play_width + 50
    start_y = top_left_y + (play_height / 2 - 100)

    shape_format = piece.shape[piece.rotation % len(piece.shape)]

    for i, line in enumerate(shape_format):
        row = list(line)
        for j, column in enumerate(row):
            if column == '0':
                pygame.draw.rect(surface, piece.color, (start_x + j*block_size, start_y + i*block_size, block_size, block_size), 0)

    surface.blit(label, (start_x, start_y - 30))

运行截图:

python趣味编程-如何实现俄罗斯方块_第2张图片

python趣味编程-如何实现俄罗斯方块_第3张图片

python趣味编程-如何实现俄罗斯方块_第4张图片

下载

如果你对这个例子感兴趣,可以到这里下载完整源码

https://download.csdn.net/download/xiaoshun007/87516803

你可能感兴趣的:(Python,pygame,python,开发语言)