1、随机生成俄罗斯方块
这里需要导入python自带的随机库random
使用其中的choice方法,从俄罗斯方块形状列表中随机选出一个。
该方法源码说明如图
首先我们需要删除原来的位于game_loop方法上面的a_block = ...和draw_block_move(canvas, a_block)这2行代码(这两行代码俄罗斯方块是在固定位置,按照指定形状生成的,需要删掉这部分代码)
然后再在原来的这2行代码所在位置,添加一个随机生成俄罗斯方块的方法generate_new_block
再将游戏运行方法game_loop修改成如下,其中,将当前的俄罗斯方块对象通过全局变量来存储,
并在game_loop方法下面设置初始的俄罗斯方块为空(None)
此时每次运行代码都会发现生成了随机的俄罗斯方块
当然,此时还有问题没有解决,就是俄罗斯方块生成后,会一直往下移动,就算出了可视范围还是会往下移动(只是这时再也看不到了)。
所以接下来我们要实现的是:当俄罗斯方块落地的时候,将它固定住,然后再去生成新的。
2、固定失效俄罗斯方块
判断俄罗斯方块落地的原则是,该方块是否可以继续向下移动
这里我们首先需要的是一个方法check_move需要判断俄罗斯方块是否可以向指定位置移动
该generate_new_block方法的下面,添加check_move方法代码如下
再将游戏运行方法game_loop修改成如下,便可以每次俄罗斯方块落地后都会生成新的
此时运行效果如下图
此时仍然有个问题就是老的俄罗斯方块会被新的落地的俄罗斯方块,这个需要处理
当俄罗斯方块发现下面有已固定的俄罗斯方块时,也不能移动
首先,我们需要添加一个变量block_list来记录已固定的俄罗斯方块
在原代码draw_blank_board(canvas)的位置的下面,应该是80行上下的地方,添加如下代码
然后再在固定俄罗斯方块的时候记录进去,所以
一要添加一个save_block_to_list方法,将无法移动的俄罗斯方块记录进去
二要修改game_loop
具体如下
然后还要再修改原来的check_move方法,就是发现下面有已固定的俄罗斯方块时,也不能移动,具体如下
此时运行效果如下
3、左右移动俄罗斯方块
首先,我们需要新建一个左右移动俄罗斯方块的方法horizontal_move_block,其中的参数event对应键鼠事件
在save_block_to_list方法下面添加horizontal_move_block方法的代码如下
然后把键盘上的左右键绑定(bind)这个方法,代码如下
此时运行,就可以按左右方向键来移动俄罗斯方块了
4、变换俄罗斯方块
左右键是移动俄罗斯方块,
上下键我们则实现变换俄罗斯方块按上键俄罗斯方块会进行顺时针九十度旋转
按下键俄罗斯方块会进行顺时针九十度旋转
这里我们需要添加
旋转俄罗斯方块的方法rotate_block
以及让俄罗斯方块着陆的方法land
在horizontal_move_block方法下面添加rotate_block方法的代码如下
然后再在上一步绑定左右方向键的地方添加下面这行代码,让上下键绑定(bind)这个方法