Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python turtle 模块可以编写游戏,是真的吗?

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

作者头像
一枚大果壳
发布于 2022-08-23 05:42:25
发布于 2022-08-23 05:42:25
1.6K00
代码可运行
举报
文章被收录于专栏:编程驿站编程驿站
运行总次数:0
代码可运行

1. 前言

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

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

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

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

2. 需求描述

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

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

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

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

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

3. 制作流程

3.1 初始化变量

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import turtle
import random
import math
'''
初始化游戏界面大小
'''
# 游戏区域的宽度
game_wid = 600  
# 游戏区域的高度
game_hei = 400  
# 砖块的大小,以及每一个小球初始大小
cell = 20
# 红球初始大小
red_size = cell
# 红色小球
red_ball = None
# 存储绿色小球的列表
green_balls = []
# 存储蓝色小球的列表
blue_balls = []
# 红色小球的方向 当前方向 0 向右,90 向上 180 向左 -90 向下
dir = 0

上述代码说明:

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

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

3.2 通用函数

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
随机位置计算函数
'''
def rand_pos():
    # 水平有 30 个单元格,垂直有 20 个单元格
    x = random.randint(-14, 14)
    y = random.randint(-9, 9)
    return x * cell, y * cell

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
绘制一个指定填充颜色的正方形
填充颜色可以不指定
'''
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 支。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
自定义画笔形状
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) 注册画笔形状,以后就可以随时使用此形状。 如上代码记录了一个圆的绘制过程,也就是创建了一个圆形的画笔形状。

移动到某个位置函数:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
移到某点
'''
def move_pos(pen, pos):
    pen.penup()
    pen.goto(pos)
    pen.pendown()

参数说明:

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

注册键盘事件函数:

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
改变红色小球 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: 墙体由主画笔绘制。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
绘制四面的墙体
'''
def draw_blocks():
    # 隐藏画笔
    turtle.hideturtle()
    # 上下各30个单元格,左右各 20 个单元格
    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))

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 已经定义好的画笔形状名称。

创建绿色、蓝色小球:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def ran_gb_ball(balls, color):
    # 随机创建蓝色、绿色小球的频率,
    # 也就是说,不是调用此函数就一定会创建小球,概率大概是调用 5 次其中会有一次创建
    ran = random.randint(1, 5)
    # 随机一个角度
    a = random.randint(0, 360)
    # 1/5 的概率
    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 的原因是不希望用户看到新画笔创建过程。

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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())

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
红球是否碰到绿、蓝球
'''
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) 是让小球动起来的核心逻辑,每隔一定时间,重新移动红、蓝、绿外观如圆形状的小球。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

主方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    # 关闭动画效果
    turtle.tracer(False)
    # 注册事件
    register_event()
    # 定制 2 种画笔形状
    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 模块的过程说明了一个道理,没有所谓简单的知识,如果你认为简单,那是因为你对它的认知太浅。只是学到了大家都学到的内容。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python|一男子竟然用python干这事儿
游戏,大家一定不陌生,那么有没有想过游戏是怎么做出来的呢?作为一个与代码打交道的人,都知道是用一行一行代码堆积出来的。今天,大家就跟小编一起来用代码敲出一款属于自己的游戏吧!
算法与编程之美
2020/04/01
1K0
Python|一男子竟然用python干这事儿
【Python】双十一,就用turtle画个单身狗送给自己
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一只小乌龟,在一个横轴为x、纵轴为y的坐标系内,从原点(0,0)位置开始,它根据一组函数指令,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。
黄博的机器学习圈子
2020/11/17
8550
【Python】双十一,就用turtle画个单身狗送给自己
Python来绘画唯美的飘落银杏树
银杏的叶子是心的形状,一柄两叶代表着两颗相爱的心连着一起。银杏树又叫公孙树,千年才能开花结果,虽然说法夸张,但是道出了只有经过漫长的守候,才能守的开花结果,象征着守护爱情的漫长岁月和最终的合二为一。
玖柒的小窝
2021/10/05
6240
Python来绘画唯美的飘落银杏树
Python-turtle库绘图
turtle(海龟)库是turtle绘图体系的Python实现,turtle库是一种标准库,是Python自带的。
wangmcn
2022/07/25
1.8K0
Python-turtle库绘图
最全本地部署 DeepSeek R1 教程(适用于 Mac、Windows、Linux)
欢迎大家在评论区留言评论自己想了解的工具、方向或职业等互联网相关内容,点赞和推荐多的,波哥会优先安排解答!
IT运维技术圈
2025/02/05
40.7K4
最全本地部署 DeepSeek R1 教程(适用于 Mac、Windows、Linux)
C++ 一款纯C实现的打砖块小游戏
一枚大果壳
2024/05/18
2590
C++ 一款纯C实现的打砖块小游戏
Python Turtle帮助文档梳理
Python Turtle帮助文档真的很多,几十屏拉不到头。其中很多部分是重复的。近期进行了梳理,我将其分为全局控制、画布设置、画笔设置、画笔操作、互动等五个部分。
一石匠人
2018/09/12
1.8K0
用Python制作一个简单的球球大作战
大家好,我是查理。今天教大家制作一个简化版球球大作战\ 话不不多说,上代码 # -*- coding: utf-8 -*- # @Time : 2018/7/30 16:19 # @Author : G.Hope # @Email : 1638327522@qq.com # @File : 吃球.py # @Software: PyCharm import pygame import random import math # 生成随机颜色 def random_color():
程序员迪迪
2021/12/25
6670
用Python的turtle模块画国旗
最近在学Python,发现Python的海龟绘图非常有趣,就分享一下!话不多说,先来Python turtle的官方文档链接: Python turtle。这里面有turtle的各类指令。turtle画国旗主要用到两个函数:draw_rentangle和draw_star。
DevinGeng
2019/04/09
3.3K0
用Python的turtle模块画国旗
【python入门系类课程 第三课 神奇的画笔】
本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地方也欢迎指出,在此先行谢过。
叶子陪你玩
2020/03/12
1.2K0
【带着canvas去流浪(8)】碰撞
经过前面章节相对枯燥的练习,相信你已经能够上手canvas的原生API了,那么从这一节开始,我们就开始接触点好玩的东西——动画。
大史不说话
2019/05/07
1.2K0
【带着canvas去流浪(8)】碰撞
【Python贪吃蛇】:编码技巧与游戏设计的完美结合
🚲turtle模块 Python的turtle模块是一个非常基础的绘图库,它允许用户创建一个画布并在上面绘制图形。这个模块通常用于教学目的,特别是适合初学者学习编程和理解基本的图形概念。 turtle的一些关键特性:
爱喝兽奶的熊孩子
2024/05/14
5380
【Python贪吃蛇】:编码技巧与游戏设计的完美结合
Python案例——喝墨水的小乌龟
(本文为前一篇文章《理解编程语言只需四个词-编程知识体系介绍(带python及scratch案例)》的说明案例之一)
一石匠人
2018/12/07
1.7K0
Python案例——喝墨水的小乌龟
Canvas系列(14):实战-小球碰撞
两小球碰撞是Canvas非常经典的案例,他是一个很简单的需求,但做起来却非常复杂。
kai666666
2020/10/19
1.9K0
Canvas系列(14):实战-小球碰撞
啥是佩奇?用Python玩点更高级的
这是一个发生在大山里的故事,但故事的情节所有人都不会陌生。快过年了,在农村爷爷给城里的孙子打电话,孙子说想要“佩奇”,为了满足孩子的心愿,爷爷开始满村子找佩奇…
Python进阶者
2019/04/25
6550
啥是佩奇?用Python玩点更高级的
【Python100天学习笔记】Day10 图形用户界面和游戏开发
GUI是图形用户界面的缩写,图形化的用户界面对使用过计算机的人来说应该都不陌生,在此也无需进行赘述。Python默认的GUI开发模块是tkinter(在Python 3以前的版本中名为Tkinter),从这个名字就可以看出它是基于Tk的,Tk是一个工具包,最初是为Tcl设计的,后来被移植到很多其他的脚本语言中,它提供了跨平台的GUI控件。当然Tk并不是最新和最好的选择,也没有功能特别强大的GUI控件,事实上,开发GUI应用并不是Python最擅长的工作,如果真的需要使用Python开发GUI应用,wxPython、PyQt、PyGTK等模块都是不错的选择。
天道Vax的时间宝藏
2021/12/02
2.8K0
用python绘制皮卡丘
科普:皮卡丘是日本任天堂公司开发的掌机游戏系列《口袋妖怪》中登场精灵中的一种,为口袋妖怪里代表性的角色。
阿黎逸阳
2020/09/08
1.6K0
Python 【绘制图及turtle库的使用】
前言 最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,整理了一下,挑了一些觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~赶快去试一下吧) one
IT茂茂
2020/03/19
1.8K0
呕心沥血解析用python画一个表白树(详解每一行代码),初学者也能看懂,授人以鱼不如授人以渔
代码的话,在CSDN只要搜一下就可以看到一大堆的同样的代码,但是我没有看到有人讲解代码,所以我要讲解一下代码,授人以鱼不如授人以渔,就拿到代码让你跑一下什么都没学到。
川川菜鸟
2021/10/18
8930
python小游戏,猫抓老鼠
在学习树莓派python编程指南。有一个猫抓老鼠的游戏,实现出来复习复习。 import turtle #coding:utf-8 import turtle import time boxsize = 200 caught = False score = 0 #盒子大小,游戏终止条件,成绩 def up(): mouse.forward(10) checkbound() def left(): mouse.left(45) def right(): mouse.
十四君
2019/11/27
1.6K0
相关推荐
Python|一男子竟然用python干这事儿
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档