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))
如果你对这个例子感兴趣,可以到这里下载完整源码
https://download.csdn.net/download/xiaoshun007/87516803