适合初学者超详细Python制作俄罗斯方块教程
背景
我刚学Python三天,但不想一直看书,于是在网上学习了一些用Python制作俄罗斯方块的代码,有的代码没有注释,并且比较难理解,这里我找到了一个博主的代码,思路很清晰,游戏运行后也很顺畅,但代码没有注释,所以我就自己拿来学习并做了一定的修改。为了方便和我一样想拿小游戏练习巩固基础知识的小伙伴,我将自己的学习收获分享给大家,希望大家学习代码中能快速理解!
实现过程
过程主要分为以下几部分:
- 窗口设计
- 画布设计
- 方块定义与设置
- 方块功能方法设计
- 控件功能方法设计
大致过程就分为这几部分,具体的流程见下面详细分析,原理啥的都会放在具体的部分中讲解
绘制窗口
在Python中,我们可以用tkinter模块进行窗口设计。为了使用此模块,我们首先需要import它:
from tkinter import *
import time
import random
import math
from tkinter import messagebox
from PIL import ImageTk, Image
在这里,我一下子把所有要导入的库块全贴出来了,下面对其解释:
from tkinter import * :导入tkinter库中所有的类、变量、函数等信息。
import time : 导入时间库(因为在代码中用到了sleep函数)
import random :导入随机数生成库
from tkinter import messagebox : 导入messagebox弹窗库
from PIL import ImageTk, Image :从PIL导入ImageTk、Image库,用于添加背景图片
前四个都是Python自带的库,不需要我们自己安装,但是最后一个需要我们安装PIL库(PIL是Python处理图像的库),安装方法在这里也给出:
(1)找到pip.exe所在的文件夹,我的是在D:\Python37\Scripts (一般pip.exe都在Python安装目录中Scripts文件夹里)
(2)运行cmd,将路径跳转到pip.exe所在的文件夹(我的是Scripts),输入pip install pillow , 电脑将会自动搜索pillow并进行安装,安装成功将会看到Successfully字样:
此时,Pillow就安装成功了。
之后,我们进行窗口绘制,代码如下:
self.win = Tk() #创建窗口
self.win.title("俄罗斯方块_by ZSQ")
self.win.geometry('450x610+400+100')
#self.win.geometry('w×h+x+y'),w:窗口宽度,h:窗口长度,x,y是窗口在屏幕上的位置
self.win.resizable(0, 0) #窗口的长宽不可改变
self.win.mainloop() #让窗口运行起来
这样我们一个制作了一个窗口,效果如下:
添加控件与文本
下面我们添加四个按钮,分别是开始、暂停、重新开始、退出。多个文本,比如:等级、分数,对应代码如下:
self.pauseBut = Button(self.win, text="暂停", bg='#7B8E9C', height=1, width=10, font=(10), command=self.pause)
self.pauseBut.place(x=338, y=473)
self.startBut = Button(self.win, text="开始",bg = '#DEC8B0', height=1, width=10, font=(10), command=self.startgame)
self.startBut.place(x=338, y=430)
self.restartBut = Button(self.win, text="重新开始",bg = '#EBB78C',height=1, width=10, font=(10), command=self.restart)
self.restartBut.place(x=338, y=516)
self.quitBut = Button(self.win, text="退出", height=1,bg = '#CA4F53' ,width=10, font=(10), command=self.quitgame)
self.quitBut.place(x=338, y=559)
self.lab_score = Label(self.win, text="分数:0", font=("宋体",16,"normal"))
self.lab_score.place(x=335, y=50)
self.lab_scoreEx = Label(self.win, text = "每200升级一次", font = ("宋体",8,"normal"))
self.lab_scoreEx.place(x=335,y=80)
self.lab_grade = Label(self.win, text="等级:1", font=("宋体",16,"normal"))
self.lab_grade.place(x=335, y=115)
self.lab_next = Label(self.win, text = "下一个:",font=("宋体",16,"normal"))
self.lab_next.place(x=335,y=180)
这里Button、Label都是控件,括号里是设置他们的参数,不懂的小伙伴可以自行百度(其实很好理解的),其中四个Button中的command是触发,即点击了按钮就触发相应方法(后面讲述)。添加控件后的效果如下:
添加画布
绘制好窗口,我们利用Canvas组件添加画布,我们这里添加两个画布,分别是下落画布(huabu)和下一块显示画布(huabu_right),对应代码如下:
self.huabu = Canvas(self.win ,bg ='#DEF6FF' ,height=600, width=COLUMN * (BIANCHANG+1), takefocus=True) #方块下落画布
self.huabu.place(x=2, y=2) #画布的位置
self.huabu_right = Canvas(self.win,bg = '#DEF6FF',height=100, width=100) #下一个方块预览画布
self.huabu_right.place(x=335,y=210)
因为其中涉及到了一些变量的使用(例如COLUMN, BIANCHANG等),这些都是事先声明好的全局变量,在这里贴出声明代码:
BIANCHANG = 19 #一小方块边长
COLOR = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', '#00C5CD', '#00EE76', '#388E8E', '#556B2F', '#6B8E23',
'#8B2252', '#8B6969', '#A0522D', '#BC8F8F', '#BC8F3F', 'black'] #颜色
COLUMN = 16 #列数
ROW = 30 #行数
imgpath = 'menglong_.gif' #背景图片
img = Image.open(imgpath) #获取背景图片
回到画布上,刚刚添加完画布后,整体效果如下:
至此,窗口、画布的添加到此完毕,其中细节我没有过多讲解(比如Canvas里的参数含义,这些都可以自行搜索,讲的都很详细),接下来就是设计方块以及实现各种功能。
绘制一小方块
我们定义一个类(fangk)来在画布上具体位置上画一小块,代码如下:
class fangk:
def __init__(self, huabu, col, row): #属于对象的数据成员,
#self参数必须是第一个形参,它代表对象本身,在类的实例方法中访问实例属性时,需要以self为前缀
self.huabu = huabu
self.col, self.row = col, row #col-->第几行的行,row-->第几列的列
self.color = COLOR[self.row % 16