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读写Excel文件的实例
Nov 01 Python
python实现多线程采集的2个代码例子
Jul 07 Python
Python实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
Python Web框架Flask中使用七牛云存储实例
Feb 08 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
创建pycharm的自定义python模板方法
May 23 Python
Django ModelForm组件使用方法详解
Jul 23 Python
python matplotlib拟合直线的实现
Nov 19 Python
Python实现word2Vec model过程解析
Dec 16 Python
python 爬取小说并下载的示例
Dec 07 Python
selenium如何定位span元素的实现
Jan 13 Python
Python的property属性详细讲解
Apr 11 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
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
Python实现批量修改文件名实例
2015/07/08 Python
Django的信号机制详解
2017/05/05 Python
Python简单读取json文件功能示例
2017/11/30 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
opencv-python 提取sift特征并匹配的实例
2019/12/09 Python
python 画图 图例自由定义方式
2020/04/17 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
介绍一下木马病毒的种类
2015/07/26 面试题
技术总监的工作职责
2013/11/13 职场文书
毕业论文致谢词
2015/05/14 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers