从零开始学Python(7) -----在游戏中学习Python编程-打砖块游戏制作

在这几次学习中,我们一直在尝试用Tkinter来开发游戏。今天,就让我们来做一个稍微复杂一点的游戏“打砖块”吧。

实现效果如下:

从零开始学Python(7) -----在游戏中学习Python编程-打砖块游戏制作_第1张图片

什么是打砖块游戏?

打砖块游戏是一种动作电子游戏的名称。玩家操作一根萤幕上水平的“棒子”,让一颗不断弹来弹去的“球”在撞击作为过关目标消去的“砖块”的途中不会落到萤幕底下。

让我们从制作弹球开始

虽然这个游戏规则不复杂,但是如果我们一下子把所有功能都实现了得化,有的人可能不知道从哪里下手。所以我们先从游戏的核心部分的弹球部分开始吧!

效果如下:

从零开始学Python(7) -----在游戏中学习Python编程-打砖块游戏制作_第2张图片

下面是一个仅移动球的程序。将以下程序另存为“ 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的基本语法已经有所了解,那么大家就尝试一下游戏开发吧。推荐大家从开发小游戏开始。因为小游戏一般不需要复杂的画面和逻辑处理。

你可能感兴趣的:(Python开发实践)