书接上回:
源码下载:Python+pygame制作小游戏--俄罗斯方块 源码
到此为止,基本上完成了俄罗斯方块的游戏开发。剩下的问题是:
1、消除的行数,分数的计算,保存,显示
2、关数的计算及自动满级升关,显示
3、下一个方块的提示
4、能双打吗?
下面一个个来解决这些问题:
十二、解决下述问题
1、消除的行数,分数的计算,保存,显示
2、关数的计算及自动满级升关,显示
解决步骤:
1、class Tetris中新增score(得分),lines(消除的行数),level(关卡)三个属性
2、stop_move中增加score的计算
3、del_full_row中增加score,lines和level的计算
4、增加一个空间来显示score,lines和level
class Tetris():
def __init__(self,x0,y0):
...
self.score = 0 #新增
self.lines = 0 #新增
self.level = 0 #新增
self.creat_new_block()
def stop_move(self):
#方块停止移动,停落区域赋值1和相应的颜色
self.score += 3 #新增,每有一方块停止移动,加3分
...
def del_full_row(self):
#删除满载的行,记录成绩
lines = 0
for row in range(rows):
if sum(self.display_arrs[row]) == cols: #满载行判断
lines += 1 #记录一次连续删除的行数,实现多消多奖
self.lines += 1
if self.lines % 5 == 0: #每消5行等级升1,速度加快
self.level = self.lines / 5
self.speed = int(self.speed * 0.9) #越小越快
self.score += (self.level + cols * lines) * 5
del self.display_arrs[row]
self.display_arrs.insert(0,[0 for i in range(cols)])
def display(self):
...
self.display_score() #新增
def display_score(self):
#显示得分等信息
text = "得分:%d " % self.score
self.img = pygame.font.SysFont("kaiti",25).render(text, True, (0,0,255))
self.img_rect = self.img.get_rect()
self.img_rect.topleft = ((cols + 2) * cell_size ,self.y0 + cell_size) # (self.x0, rows* cell_size)
screen.blit(self.img, self.img_rect)
text = "行数:%d " % self.lines
self.img = pygame.font.SysFont("kaiti",25).render(text, True, (0,0,255))
self.img_rect.topleft = ((cols + 2) * cell_size ,self.y0 + 2 * cell_size ) # (self.x0, rows* cell_size)
screen.blit(self.img, self.img_rect)
text = "等级:%d " % self.level
self.img = pygame.font.SysFont("kaiti",25).render(text, True, (0,0,255))
self.img_rect.topleft = ((cols + 2) * cell_size ,self.y0 + 3 * cell_size )
screen.blit(self.img, self.img_rect)
希望在游戏界面的右边显示这些信息,故将代码
win_width = cols * cell_size
改成:
win_width = cols * cell_size + 6 * cell_size
即游戏宽度增加了6格宽度来显示得分等信息。
20240618_171144
十三、怎样增加下一个方块的提示呢?
其实只需要显示next_key并在游戏区的右边“画上去”就可以了。
class Tetris():
...
def display(self):
self.display_stop_blocks()
self.display_next_blocks() #新增
self.display_move_blocks()
self.display_score()
#每刷一次缓冲计数减1,缓冲计数=0,或按住了向下键则下落一格
self.fall_buffer -= 1
if self.fall_buffer == 0 or self.fall_speed_up:
self.fall_buffer = self.speed
self.move(0,1)
def display_next_blocks(self): #新增
#显示下一个方块
for (x,y) in blocks[self.next_key][0]:
self.rect.topleft = (cols + 2) * cell_size + x * cell_size ,self.y0 + 4*cell_size + (y - 1) * cell_size #x * cell_size , (y - 1) * cell_size
self.draw_block(self.next_key, 1)
基本的功能已经实现了。请看视频演示。关于双打,有空再更新。
20240618_172417