在这几次学习中,我们一直在尝试用Tkinter来开发游戏。今天,就让我们来做一个稍微复杂一点的游戏“打砖块”吧。
实现效果如下:
打砖块游戏是一种动作电子游戏的名称。玩家操作一根萤幕上水平的“棒子”,让一颗不断弹来弹去的“球”在撞击作为过关目标消去的“砖块”的途中不会落到萤幕底下。
虽然这个游戏规则不复杂,但是如果我们一下子把所有功能都实现了得化,有的人可能不知道从哪里下手。所以我们先从游戏的核心部分的弹球部分开始吧!
效果如下:
下面是一个仅移动球的程序。将以下程序另存为“ ball-move.py”
# 打砖块
from tkinter import *
# 记录小球信息 --- (*1)
ball = {
"dirx": 15, # X方向のボールの速さ
"diry": -15, # Y方向のボールの速さ
"x": 350, # ボールの位置
"y": 300,
"w": 10, # ボールの幅
}
# 生成主窗口 --- (*2)
win = Tk()
cv = Canvas(win, width = 600, height = 400)
cv.pack()
# 绘制画面 --- (*3)
def draw_objects():
cv.delete('all') # 原有画面的清除
# 绘制小球
cv.create_oval(
ball["x"] - ball["w"], ball["y"] - ball["w"],
ball["x"] + ball["w"], ball["y"] + ball["w"],
fill="green")
# 移动小球 --- (*4)
def move_ball():
# 在中间变量中保存小球移动后的坐标
bx = ball["x"] + ball["dirx"]
by = ball["y"] + ball["diry"]
# 判断小球又没有撞到墙上?
if bx < 0 or bx > 600: ball["dirx"] *= -1
if by < 0 or by > 400: ball["diry"] *= -1
# 如果没有撞墙,移动小球
if 0 <= bx <= 600: ball["x"] = bx
if 0 <= by <= 400: ball["y"] = by
# 游戏循环 --- (*5)
def game_loop():
draw_objects()
move_ball()
win.after(50, game_loop)
game_loop()
win.mainloop() # 显示游戏主窗口
在控制台执行以下命令:
# Windows
python ball-move.py
让我们看一下具体的程序代码。
代码的(* 1)部分,定义了代表球的字典类型(dict类型)数据。使用字典类型变量的好处是,一个变量可以存放多个值。这里,我们在变量中保存了球的位置(x,y),宽度(w),以及速度和方向(dirx,diry)。
由于游戏中使用了各种变量,因此通过使用字典变量,可以更轻松地管理用于特定目的的变量。
代码(* 2)部分,创建一个窗口。在这里,我们创建了宽度为600像素,高度为400像素的窗口。
代码(* 3)部分是绘制游戏画面的部分。绘制画面是,每次都是先清除所有现有的画面内容,并在其中写入新的画面内容。其中,cv.delete('all')命令的功能是清除所有画面内容。然后,使用create_oval()方法绘制了大小为(x1,y1,x2,y2)的椭圆。其中(x1,y1)是椭圆的左上角坐标,(x2,y2)是椭圆的右下角坐标。
代码(* 4)部分,实现了球的坐标移动。在这里,确认X坐标和Y坐标,如果发现其撞到上,下,左,右的墙壁,则对它的行进方向得坐标-1以实现反射球的处理。
最后,在代码的(* 5)部分中,反复执行游戏画面绘制和移动球的动作。
接下来,让我们在刚才的游戏基础上,加上砖块和"移动棒"。并且实现"移动棒"跟随鼠标移动功能。
首先让我们介绍砖块的实现方法。我们准备了一个称为块的数组变量,该变量管理着每个块的坐标和颜色。在下面代码中,我们生成了5x8大小,总共40个的砖块。
blocks = [] # 保存砖块数据
# ... 省略 ...
# 生成状块数据
for iy in range(0, 5):
for ix in range(0, 8):
color = "red"
if (iy + ix) % 2 == 1: color = "blue"
x1 = 4 + ix * block_size["x"]
x2 = x1 + block_size["x"]
y1 = 4 + iy * block_size["y"]
y2 = y1 + block_size["y"]
blocks.append([x1, y1, x2, y2, color])
让后用create_rectangle()方法绘制矩形(砖块),如下所示:通过for循环,我们就可以用上面做成的砖块数据绘制多行砖块了。
# 一块块的绘制砖块
for w in blocks:
x1, y1, x2, y2, c = w
cv.create_rectangle(x1, y1, x2, y2, fill=c, width=0)
最后,我们在代码中加入小球击中障碍物以及球是否落在屏幕底部的功能,整个游戏就完成了。具体的实现方法留给大家去考虑。
如上所述,今天,我们制作了一个稍微复杂一定得游戏。相比,通过这个游戏,大家的编程能力也有了比较大的提高了吧。游戏开发是提高编程能力的很好的一个手段。如果大家对Python的基本语法已经有所了解,那么大家就尝试一下游戏开发吧。推荐大家从开发小游戏开始。因为小游戏一般不需要复杂的画面和逻辑处理。