python小程序之飘落的银杏


Posted in Python onApril 17, 2021

前言

之前学python时在网上找了好多小程序,由于年代久远,已经忘记出自哪里了,给代码加了点注释,再稍微修改了一下,让代码的可读性更好,如有侵权立刻就删~

一、飘落的银杏

引用本科老师的一句话:“樱花最美的时候有两个,一个是樱花一半在空中,一半在树上的时候,空间上的最美;另一个是你们这个年纪可以牵着喜欢的人一起去看的时候,意境上的最美。”

所以,我们接下来就要用python的turtle库来完成一半空中,一半树上的银杏的绘画~

二、代码部分

1.导入所需的库

import turtle
import random
from math import *

2.生成斐波那契数列

斐波那契数列是指前两项的和加起来等于后一项的一个数列,例如[0 1 1 2 4 6 10],这里使用了两个函数来生成斐波契那数列。

def Fibonacci_Recursion_tool(n):  #斐波那契数列方法
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return Fibonacci_Recursion_tool(n - 1) + Fibonacci_Recursion_tool(n - 2)
def Fibonacci_Recursion(n):     #生成斐波那契数列,并存入列表
    result_list = []
    for i in range(1, n + 3):
        result_list.append(Fibonacci_Recursion_tool(i))
    return result_list

调用函数生成一个数列如下:

yu = Fibonacci_Recursion(top)  #生成斐波契那数列
print(yu)

运行结果如下:

python小程序之飘落的银杏

3.定义生成叶子的方法

def leaf(x, y, node):#定义画叶子的方法
    til = turtle.heading()
    i = random.random()
    an = random.randint(10, 180)
    ye = random.randint(6, 9)/10
    turtle.color(ye, ye*0.9, 0)
    turtle.fillcolor(ye+0.1, ye+0.05, 0)
    turtle.pensize(1)
    turtle.pendown()
    turtle.setheading(an + 90)
    turtle.forward(8*i)
    px = turtle.xcor()
    py = turtle.ycor()
    turtle.begin_fill()
    turtle.circle(7.5*i, 120)  # 画一段120度的弧线
    turtle.penup()  # 抬起笔来
    turtle.goto(px, py)  # 回到圆点位置
    turtle.setheading(an + 90)  # 向上画
    turtle.pendown()  # 落笔,开始画
    turtle.circle(-7.5*i, 120)  # 画一段120度的弧线
    turtle.setheading(an + 100)
    turtle.circle(10.5*i, 150)
    turtle.end_fill()  # 画一段150度的弧线
    turtle.penup()
    turtle.goto(x, y)
    turtle.setheading(til)
    turtle.pensize(node / 2 + 1)

4.定义生成树的方法

这里用x生成随机数,用if条件进行判断来决定要不要继续画分支,要不要画叶子,使树更加自然,无规律性,更好看一点,这样会导致你每次运行时,画出来的树都是不一样的。具体的细节,我已经加上了注释。如果想调整空中叶子的比例,树的分叉程度,修改if判断语句中的x取值范围,以增加概率或减小概率即可。至于如何达到你心中完美的效果就要慢慢去尝试了。

def draw(node, length, level, yu, button):  #定义画树的方法
    turtle.pendown()
    t = cos(radians(turtle.heading()+5)) / 8 + 0.25
    turtle.pencolor(t*1.6, t*1.2, t*1.4) #(r, g, b)颜色对应的RGB值
    turtle.pensize(node/1.2)  #画笔的尺寸
    x = random.randint(0, 10)  #生成随机数决定要画树枝还是画飘落的叶子
    if level == top and x > 6:  #此时画飘落的叶子,x范围太大会导致树太秃
        turtle.forward(length)  # 画树枝
        yu[level] = yu[level] - 1
        c = random.randint(2, 10)
        for i in range(1, c):
            leaf(turtle.xcor(), turtle.ycor(), node)
           # 添加0.3倍的飘落叶子
            if random.random() > 0.3:
                turtle.penup()
               # 飘落
                t1 = turtle.heading()
                an1 = -40 + random.random() * 40
                turtle.setheading(an1)
                dis = int(800 * random.random() * 0.5 + 400 * random.random() * 0.3 + 200 * random.random() * 0.2)
                turtle.forward(dis)
                turtle.setheading(t1)
                turtle.right(90)
               # 画叶子
                leaf(turtle.xcor(), turtle.ycor(), node)
                turtle.left(90)
               # 返回
                t2 = turtle.heading()
                turtle.setheading(an1)
                turtle.backward(dis)
                turtle.setheading(t2)
    elif level==top and x < 7 : #此时画枝叶,x范围太大会导致飘落的叶子太少
        turtle.penup()
        turtle.forward(length)
    elif level>3 and (x>6) :#三级树枝以上,有40%的概率执行以下策略
        turtle.pendown()
        turtle.forward(length)
        c = random.randint(4, 6)
        for i in range(3, c):
            leaf(turtle.xcor(), turtle.ycor(),node)
        leaf(turtle.xcor(), turtle.ycor(),node)
        button=1# jump"""
    else:
        turtle.forward(length)  # 画树枝
        yu[level] = yu[level] -1
    if node > 0 and button == 0:
        # 计算右侧分支偏转角度,在固定角度偏转增加一个随机的偏移量
        right = random.random() * 5 + 17
        # 计算左侧分支偏转角度,在固定角度偏转增加一个随机的偏移量
        left = random.random() * 20 + 19
        # 计算下一级分支的长度
        child_length = length * (random.random() * 0.25 + 0.7)
        # 右转一定角度,画右分支
        r=random.randint(0, 1)
        if r==1:
          turtle.right(right)
          level = level + 1
          #print("level", level)
        else:
          turtle.left(right)
          level = level + 1
          #print("level", level)
        draw(node - 1, child_length,level,yu,button)
        yu[level] = yu[level] +1
        if yu[level] > 1:
            # 左转一定角度,画左分支
            if r==1:
               turtle.left(right + left)
               draw(node - 1, child_length, level, yu,button)
               # 将偏转的角度,转回
               turtle.right(left)
               yu[level] = yu[level] - 1
            else:
                turtle.right(right + left)
                draw(node - 1, child_length, level, yu,button)
                # 将偏转的角度,转回
                turtle.left(left)
                yu[level] = yu[level] - 1
        else:
            if r==1:
              turtle.left(right + left)
              turtle.right(left)
            else:
                turtle.right(right + left)
                turtle.left(left)
    turtle.penup()
    #退回到上一级节点顶部位置
    turtle.backward(length)

5.主函数部分

主函数中直接调用上述函数就行,top控制树的高度,turtle.speed控制画的速度,最后的turtle.write()用来书写最下方的签名。

if __name__ == '__main__':
    turtle.setup(width=1.0, height=1.0) #设置全屏显示
    turtle.hideturtle()  # 隐藏turtle
    turtle.speed(0)  # 设置画笔移动的速度,0-10 值越小速度越快
    # turtle.tracer(0,0)      #设置动画的开关和延迟,均为0
    turtle.penup()  # 抬起画笔
    turtle.left(90)  # 默认方向为朝x轴的正方向,左转90度则朝上
    turtle.backward(300)  # 设置turtle的位置,朝下移动300
    top = 9  #树高
    yu = Fibonacci_Recursion(top)  #生成斐波契那数列
    yu.remove(yu[0])
    #print(yu) 打印斐波那契数列
    button = 0
    draw(top, 120, 0, yu, button)  # 调用函数开始绘制
    turtle.write("      wsw", font=("微软雅黑", 14, "normal")) #生成签名
    turtle.done()

三、结果展示

运行程序后,“海龟”会帮你画出整棵树,你只需要看着它画就行,需要等待一定的时间,画的速度可以自己选择,最后的一种成品如下,是想要的一半叶子在空中的感觉了,哈哈哈哈~

python小程序之飘落的银杏

以上,就是这个小程序的全部内容了,虽然简单,但是还挺有意思的,快去给欣赏的那个ta画棵树吧~在最美的年纪,与喜欢的人一起看花瓣在空中飞舞 ~

无用python小程序系列第一个,后续会不定期更新,还有开头提到的那个小程序,自动发送消息和温馨提醒的,也勉强算是实现了吧,hhhh,完成了当初学python的目的~这个程序其实也很简单,后面有时间会更新出来。

到此这篇关于python小程序之飘落的银杏的文章就介绍到这了,希望对大家有帮助,更多相关python小程序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

Python 相关文章推荐
从零学python系列之从文件读取和保存数据
May 23 Python
python 动态加载的实现方法
Dec 22 Python
python爬虫基本知识
Mar 05 Python
python仿抖音表白神器
Apr 08 Python
opencv实现简单人脸识别
Feb 19 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
python实现大战外星人小游戏实例代码
Dec 26 Python
pandas使用之宽表变窄表的实现
Apr 12 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
k-means & DBSCAN 总结
Apr 27 Python
我对PyTorch dataloader里的shuffle=True的理解
May 20 Python
Python Numpy之linspace用法说明
Apr 17 #Python
用Python的绘图库(matplotlib)绘制小波能量谱
用基于python的appium爬取b站直播消费记录
解决numpy数组互换两行及赋值的问题
Apr 17 #Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
You might like
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
PHP调用其他文件中的类
2018/04/02 PHP
php实现记事本案例
2020/10/20 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
jQuery 渐变下拉菜单
2009/12/15 Javascript
围观tangram js库
2010/12/28 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
9个JavaScript日常开发小技巧
2020/10/06 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
python调用shell的方法
2013/11/20 Python
Python获取央视节目单的实现代码
2015/07/25 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
房产销售经理职责
2013/12/20 职场文书
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
触摸春天教学反思
2014/02/03 职场文书
排查整治工作方案
2014/06/09 职场文书
经理岗位职责
2015/02/02 职场文书
导游词范文
2015/02/13 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
Pandas数据结构之Series的使用
2022/03/31 Python
详解OpenCV曝光融合
2022/04/29 Python
python神经网络 使用Keras构建RNN训练
2022/05/04 Python