上接
五、实现静态的界面展示
定义class Tetris
注意:由于游戏开始需要一个随机生成一个方块,故在类中添加一个随机数生成的方法。randkey_gen
class Tetris():
def __init__(self,x0,y0):
self.x0, self.y0 = x0, y0 #记录游戏区(0,0)点在屏幕的坐标
self.rect = pygame.Rect(0,0,block_size, block_size) #方块矩形大小
self.display_arrs = [[0 for i in range(cols)] for j in range(rows)] #游戏区每格初始值设为0,为1时表示有障碍物,不能通过
self.color_arrs = [[0 for i in range(cols)] for j in range(rows)] #游戏区每格的颜色app_colors的索引值
self.x, self.y = 0, 0 #记录移动方块(0,0)点在游戏网格的(col,row)位置
self.key = 0 #记录移动方块在blocks的键,是哪种方块
self.index_ = 0 #记录移动方块形态的索引
self.next_key = self.randkey_gen() #记录下一个方块在blocks的键
self.creat_new_block()
def randkey_gen(self):
keys = [1,1,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,7,7] #决定每种方块出现的频率
return keys[random.randint(0,len(keys)-1)]
def creat_new_block(self):
#产生新的移动方块和下一个方块,
self.key = self.next_key
self.next_key = self.randkey_gen()
self.index = 0
self.x = 4 #初始列设在第4列
self.y = -1 #初始高度设为-1,保证方块在最顶部位置出现
def display(self):
self.display_move_blocks()
def display_move_blocks(self):
#显示移动的方块
for (x,y) in blocks[self.key][self.index]:
self.rect.topleft = (self.x + x) * cell_size, (self.y + y) * cell_size
self.draw_block(self.key, 1)
def draw_block(self, color_index, draw_edge):
#在指定位置画方块
(r,g,b) = app_colors[color_index]
self.rect.centerx = self.rect.left + self.x0 + int(cell_size / 2)
self.rect.centery = self.rect.top + self.y0 + int(cell_size / 2)
if draw_edge:
#为增加立体感,画方块立体边,x0~x4是方块四角和中心的坐标。
x0 = self.rect.center
x1 = self.rect.topleft
x2 = self.rect.topright
x3 = self.rect.bottomright
x4 = self.rect.bottomleft
pygame.draw.polygon(screen, (r+50, g+50, b+50), (x0,x1,x2), 0)
pygame.draw.polygon(screen, (r+20, g+20, b+20), (x0,x2,x3), 0)
pygame.draw.polygon(screen, (r-50, g-50, b-50), (x0,x3,x4), 0)
pygame.draw.polygon(screen, (r-20, g-20, b-20), (x0,x4,x1), 0)
pygame.draw.rect(screen, (r,g,b), self.rect.inflate(-block_edge, -block_edge), 0)
else:
pygame.draw.rect(screen, (r,g,b), self.rect, 0)
def game_over(self):
#数据重新初始化后立即重新开始
self.__init__(self.x0, self.y0)
player = Tetris(0, 0) #初始化游戏
while True:
screen.fill((166,138,88))
player.display()
pygame.display.update()
游戏执行可见: