Python turtle 模块可以编写游戏,是真的吗?

  1. 前言

turtle (小海龟) 是 Python 内置的一个绘图模块,其实它不仅可以用来绘图,还可以制作简单的小游戏,甚至可以当成简易的 GUI 模块,编写简单的 GUI 程序。

本文使用 turtle 模块编写一个简单的小游戏,通过此程序的编写过程聊一聊对 turtle 模块的感悟。

编写游戏,如果要做专业的、趣味性高的,还是请找 pygame,本文用 turtle 编写游戏的目的是为了深度理解 turtle 的功能。

turtle 模块的使用相对而言较简单,对于基础方法不做讲解。只聊 turtle 模块中稍难或大家忽视的地方。

2. 需求描述

程序运行时,画布上会出现 一个红色的小球 很多绿色、蓝色的小球

刚开始红色的小球会朝某一个方向移动,使用者可以通过按下上、下、左、右方向键控制红色小球的运动方向。

绿色、蓝色小球以初始的默认方向在画布上移动。

当红色的小球碰到绿色小球时,红色小球球体会变大,当红色小球碰到蓝色小球时,红色球体会变小。

当红色小球球体缩小到某一个阈值时,游戏结束。

Python turtle 模块可以编写游戏,是真的吗?

; 3. 制作流程

3.1 初始化变量

本程序需要使用到 turtlerandommath 模块,使用之前,先导入。

import turtle
import random
import math
'''
初始化游戏界面大小
'''

game_wid = 600

game_hei = 400

cell = 20

red_size = cell

red_ball = None

green_balls = []

blue_balls = []

dir = 0

上述代码说明:

红色小球只有一个,由变量 red_ball 保存,红色小球在运动过程中可以改大小, red_size 保存其大小。

绿色和蓝色小球会有很多,这里使用 green_ballsblue_balls 2 个列表存储。

3.2 通用函数

随机位置计算函数: 为小球们随机生成刚开始出现的位置。

'''
随机位置计算函数
'''
def rand_pos():

    x = random.randint(-14, 14)
    y = random.randint(-9, 9)
    return x * cell, y * cell

绘制指定填充颜色的小正方形: 在游戏里有一个虚拟区域,四周使用很多小正方形围起来。

'''
绘制一个指定填充颜色的正方形
填充颜色可以不指定
'''
def draw_square(color):
    if color is not None:

        turtle.fillcolor(color)
        turtle.begin_fill()
    for i in range(4):
        turtle.fd(cell)
        turtle.left(90)
    if color is not None:
        turtle.end_fill()

自定义画笔形状:

使用 turtle 制作游戏的底层思想:

当我们导入 turtle 模块时,意味着我们有了一支可以在画布上画画的画笔,画笔的默认形状是一个小海龟。

本文称这支默认画笔叫 主画笔,可以使用 turtle 模块中的 turtle.Turtle() 类创建更多画笔 ,并且可以使用 `turtle模块提供的turtle.register_shape(name, shape) 方法为每一支画笔定制画笔形状。

如上所述,是使用 turtle 设计游戏的关键。

强调一下:

通过主画笔创建更多的画笔,以及为每一支画笔设置不同的形状。是编写游戏的关键,游戏中的每一个角色,其本质是一支支画笔,我们只是在控制画笔在画布上按我们设计好的轨迹移动。

本游戏中红、绿、蓝 3 种颜色的小球就是形状为圆形的画笔。

画笔清单:
红色小球画笔一支。
绿色小球画笔 n 支。
蓝色小球画笔 n 支。

'''
自定义画笔形状
name:画笔名称
color:可选项
'''
def custom_shape(name, size):
    turtle.begin_poly()
    turtle.penup()
    turtle.circle(size)
    turtle.end_poly()
    cs = turtle.get_poly()
    turtle.register_shape(name, cs)

turtle.register_shape(name, shape) 方法参数说明:

  • name: 自定义形状的名称。
  • shape: 由开发者绘制的形状。

    开发者绘制的哪一部分图形用来充当画笔形状? turtle.begin_poly() 记录的第一点到由 turtle.end_poly() 记录的最后一点之间的图形作为画笔形状。 cs = turtle.get_poly() 可以理解为获取到刚绘制的图形,然后使用 turtle.register_shape(name, cs) 注册画笔形状,以后就可以随时使用此形状。 *如上代码记录了一个圆的绘制过程,也就是创建了一个圆形的画笔形状。

移动到某个位置函数:

此函数用来让某一支画笔移到指定位置,不留下移动过程中的轨迹。

'''
移到某点
'''
def move_pos(pen, pos):
    pen.penup()
    pen.goto(pos)
    pen.pendown()

参数说明:

  • pen : 画笔对象。
  • pos:要移到的目标地。

注册键盘事件函数:

使用者可以通过键盘上的方向键更改红色小球的方向。

turtle 模块提供有很多事件,可以以交互式的方式使用 turtleturtle 模块中主要有 2 类事件:键盘事件、点击事件。因 turtle 的工作重点还是绘制静态图案上,其动画绘制比较弱,所以它的事件少而简单。

'''
改变红色小球 4 方向的函数,
这些函数只有当使用者触发按键后方可调用,故这些函数也称为回调函数。
'''
def dir_right():
    global dir
    dir = 0
def dir_left():
    global dir
    dir = 180
def dir_up():
    global dir
    dir = 90
def dir_down():
    global dir
    dir = -90

'''
注册键盘响应事件,用来改变红球的方向
'''
def register_event():
    for key, f in {"Up": dir_up, "Down": dir_down, "Left": dir_left, "Right": dir_right}.items():
        turtle.onkey(f, key)
    turtle.listen()
'''
当红色小球遇到墙体后,也要修改方向
'''
def is_meet_qt():
    global dir
    if red_ball.xcor() < -220:
        dir = 0
    if red_ball.xcor() > 240:
        dir = 180
    if red_ball.ycor() > 140:
        dir = -90
    if red_ball.ycor() < -120:
        dir = 90

红色的小球在 2 个时间点需要改变方向,一是使用者按下了方向键,一是碰到了墙体。

3.3 游戏角色函数

绘制墙体函数:

墙体是游戏中的虚拟区域,用来限制小球的活动范围。

Tips: 墙体由主画笔绘制。

'''
绘制四面的墙体
'''
def draw_blocks():

    turtle.hideturtle()

    for j in [30, 20, 30, 20]:
        for i in range(j):

            draw_square('gray')
            turtle.fd(cell)
        turtle.right(90)
        turtle.fd(-cell)

    move_pos(turtle, (0, 0))

创建小球画笔: 此函数用来创建新画笔。本程序中的红色、蓝色、绿色小球都是由此函数创建的画笔,且外观形状是圆。

def init_ball(pos, color, shape):

    ball = turtle.Turtle()
    ball.color(color)

    ball.shape(shape)

    move_pos(ball, pos)

    ball.penup()
    return ball

参数说明:

  • pos 创建画笔后画笔移动的位置。
  • color指定画笔和填充颜色。
  • shape 已经定义好的画笔形状名称。

创建绿色、蓝色小球:

def ran_gb_ball(balls, color):

    ran = random.randint(1, 5)

    a = random.randint(0, 360)

    if ran == 5:
        turtle.tracer(False)

        ball = init_ball(rand_pos(), color, 'ball')
        ball.seth(a)

        balls.append(ball)
        turtle.tracer(True)

为什么要设置一个概率值?

适当控制蓝色、绿色小球的数量。

turtle.tracer(False) 方法的作用:是否显示画笔绘制过程中的动画。 False 关闭动画效果, True 打开动画效果。

这里设置为 False 的原因是不希望用户看到新画笔创建过程。

蓝色、绿色小球的移动函数:

蓝色、绿色小球被创建后会移到一个随机位置,然后按默认方向移动。

def gb_ball_m(balls):
    s = 20
    a = random.randint(0, 360)
    r = random.randint(0, 10)
    for b in balls:
        b.fd(s)
        if b.xcor() < -220 or b.xcor() > 240 or b.ycor() > 140 or b.ycor() < -120:
            b.goto(rand_pos())

当小球碰到墙体后让其再随机移到墙体内部(简单粗粗暴!!)。

红色球是否碰到了蓝色或绿色小球:

此函数逻辑不复杂,计算小球相互之间的坐标,判断坐标是否重叠。

'''
红球是否碰到绿、蓝球
'''
def r_g_b_meet():
    global red_size

    s_x, s_y = red_ball.pos()

    for bs in [green_balls, blue_balls]:
        for b in bs:

            f_x, f_y = b.pos()

            x_ = math.fabs(s_x - f_x)
            y_ = math.fabs(s_y - f_y)

            h = cell + red_size
            if 0  x_  h and y_ >= 0 and y_  h:
                if b in green_balls:

                    red_size += 2
                if b in blue_balls:

                    red_size -= 2

                custom_shape('red', red_size)
                return True
    return False

上述代码整体逻辑不复杂。而 custom_shape('red', red_size) 是关键代码,因红色小球的半径发生了变化,所以需要重新定制红色小球的外观形状,这样才能在画布上看到半径变化的红色小球。

3.4 让小球动起来

怎样让小球动起来?

每隔一定时间,让小球重新移动。 turtle.ontimer(ball_move, 100) 是让小球动起来的核心逻辑,每隔一定时间,重新移动红、蓝、绿外观如圆形状的小球。

def ball_move():
    red_ball.seth(dir)
    red_ball.fd(40)

    is_meet_qt()

    ran_gb_ball(green_balls, 'green')

    ran_gb_ball(blue_balls, 'blue')

    gb_ball_m(green_balls)

    gb_ball_m(blue_balls)

    r_g_b_meet()

    turtle.ontimer(ball_move, 100)

主方法:

if __name__ == "__main__":

    turtle.tracer(False)

    register_event()

    for name in ['red', 'ball']:
        custom_shape(name, cell)

    move_pos(turtle, (-300, 200))

    draw_blocks()
    red_ball = init_ball(rand_pos(), 'red', 'red')
    turtle.tracer(True)

    ball_move()

    turtle.done()

以上为此游戏程序中的每一个函数讲解。

运行后,可以控制红色小球,当遇到绿色球和蓝色球时,红色球体会变大或变小。

4. 总结

使用 turtle 模块的过程说明了一个道理,没有所谓简单的知识,如果你认为简单,那是因为你对它的认知太浅。只是学到了大家都学到的内容。

如果要真正悟透知识点的内核,需要多查阅官方文档,把所有内容吃透,并试着把这些知识向更高层面拔高。

Original: https://blog.csdn.net/y6123236/article/details/123858005
Author: 一枚大果壳
Title: Python turtle 模块可以编写游戏,是真的吗?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/779504/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球