Python+pygame制作小游戏--俄罗斯方块(二)

上接

Python+pygame制作小游戏--俄罗斯方块(一)

五、实现静态的界面展示

定义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()

游戏执行可见:

下回:Python+pygame制作小游戏--俄罗斯方块(三)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值