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 相关文章推荐
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
Python中函数及默认参数的定义与调用操作实例分析
Jul 25 Python
对python抓取需要登录网站数据的方法详解
May 21 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
Python图像处理之gif动态图的解析与合成操作详解
Dec 30 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
python中必要的名词解释
Nov 20 Python
python日期与时间戳的各种转换示例
Feb 12 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 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中json_encode中文编码问题分析
2011/09/13 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
php技巧小结【推荐】
2017/01/19 PHP
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
jquery图片轮播特效代码分享
2020/04/20 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Python中元组,列表,字典的区别
2017/05/21 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
迪奥官网:Dior.com
2018/12/04 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
新浪网技术部笔试题
2016/08/26 面试题
大学生收银员求职信分享
2014/01/02 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
525心理健康活动总结
2015/05/08 职场文书
幼儿园老师工作总结2015
2015/05/22 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server