文章目录

  • 前言
  • 一、飘落的银杏
  • 二、代码部分
    • 1.导入所需的库
    • 2.生成斐波那契数列
    • 3.定义生成叶子的方法
    • 4.定义生成树的方法
    • 5.主函数部分
  • 三、结果展示

前言

关于学python的初衷,如图,然后清华大佬给我推荐了python,从此开始了三天打鱼两天晒网式的学习之路~
之前学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 0elif n == 1:return 1else: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)

运行结果如下:

3.定义生成叶子的方法

def leaf(x, y, node):#定义画叶子的方法til = turtle.heading()i = random.random()an = random.randint(10, 180)ye = random.randint(6, 9)/10turtle.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.25turtle.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] - 1c = 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() * 40turtle.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] -1if 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] +1if 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] - 1else:turtle.right(right + left)draw(node - 1, child_length, level, yu,button)# 将偏转的角度,转回turtle.left(left)yu[level] = yu[level] - 1else: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()  # 隐藏turtleturtle.speed(0)  # 设置画笔移动的速度,0-10 值越小速度越快# turtle.tracer(0,0)      #设置动画的开关和延迟,均为0turtle.penup()  # 抬起画笔turtle.left(90)  # 默认方向为朝x轴的正方向,左转90度则朝上turtle.backward(300)  # 设置turtle的位置,朝下移动300top = 9  #树高yu = Fibonacci_Recursion(top)  #生成斐波契那数列yu.remove(yu[0])#print(yu) 打印斐波那契数列button = 0draw(top, 120, 0, yu, button)  # 调用函数开始绘制turtle.write("      wsw", font=("微软雅黑", 14, "normal")) #生成签名turtle.done()

三、结果展示

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

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

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

完整代码后续会上传到github。
已上传:https://github.com/sw1122/interesting-PY-projects.git


系列之二预告:“关不掉的窗口”

有趣python小程序系列之一相关推荐

  1. 有趣python小程序系列之二

    文章目录 前言 一.关不掉的窗口 二.代码部分 1.导入所需的库 2.生成主窗口 3.生成提问.加载图片 4.生成按钮 5.定义点击按钮时的响应函数 6.主函数部分 三.结果展示 前言 没想到那么多人 ...

  2. python恶搞小程序-有趣的python小程序

    有趣的python小程序 1.密码生成器x=int(input()) print(''.join(__import__('random').choice('QWERTYUIOPASDFGHJKLZXC ...

  3. Python之有趣的小程序

    目录 前言 一.阶乘计算器 1.运行结果 2.源代码 3.知识点 (1)while的语法 (2) 注意 二.斐波那契数列 1.运行结果 2.源代码 3.知识点 三.猜数字游戏 1.运行结果 2.源代码 ...

  4. 有趣的python小程序

    有趣的python小程序 1.密码生成器 x=int(input()) print(''.join(__import__('random').choice('QWERTYUIOPASDFGHJKLZX ...

  5. Python之有趣的小程序——猜数字2.0

    目录 前言 一.前景回顾 二.思路讲解 三.猜数字2.0介绍 四.猜数字2.0源程序 五.程序讲解 1.基础部分 (1)while循环与for循环 (2)数值大小判断 2.再来一局 总结 前言 让大家 ...

  6. 【有趣的Python小程序】Python多个简单上手的库制作WalkLattice 走格子游戏 (思路篇)上

    篇写上一个思路篇,那么今天我们就来完成这一项工作 源代码和配套文件 链接: https://caiyun.139.com/m/i?135ClY1yWrSKX 提取码:e4pq 复制内容打开中国移动云盘 ...

  7. python编有趣的小程序_有趣的python小程序

    有趣的python小程序 1.密码生成器x=int(input()) print(''.join(__import__('random').choice('QWERTYUIOPASDFGHJKLZXC ...

  8. python有趣小程序代码-有趣的python小程序

    有趣的python小程序 1.密码生成器x=int(input()) print(''.join(__import__('random').choice('QWERTYUIOPASDFGHJKLZXC ...

  9. python有趣小程序代码-一个可以套路别人的python小程序实例代码

    先简要介绍一下程序. 程序是使用pycharm工具,python语言所写.程序包括客户端 client.py 和服务器端 server.py 两部分,利用了python中的socket包. 咳咳,使用 ...

最新文章

  1. dbcp 连接池参数说明
  2. 震惊!这样终止线程,竟然会导致服务宕机?
  3. post请求参数格式
  4. 澳洲森林火灾蔓延数学建模,基于元胞自动机模拟多模式下火灾蔓延(附部分源码)
  5. js与html编码不同,js与html中unicode编码的使用
  6. matlab中英文对照表,Matlab工具箱中英文对照
  7. 【BZOJ4300】绝世好题,位运算相关DP
  8. 【王道考研计算机网络】—计算机网络的概念 组成 功能 分类
  9. Python成员修饰符,metaclass,异常,反射,单例
  10. C语言开发FlyBird小游戏,飞翔小鸟小游戏,可以直接运行!
  11. 【OpenGL ES】EGL简介
  12. Java根据图片提取文字
  13. 判断和循环(实战收尾篇2—猜数字游戏)
  14. Lintcode 4 Ugly Number II
  15. 【论文相关】强化学习:提前看287篇ICLR-2021 深度强化学习领域论文得分汇总列表...
  16. ssh连接另一台主机
  17. VulnHub-BLUEMOON: 2021靶机
  18. QCon北京2013:NASA云计算专家Khawaja,百度基础体系首席架构师林仕鼎
  19. 京瓷4501i打印机扫描步骤_京瓷3011i网络扫描发送到SMB设置步骤(win7)
  20. 稳压二极管电路设计注意

热门文章

  1. 【Spring】context:component-scan包扫描问题
  2. 在重启Linux系统中把内存,在重新启动Linux系统的同时把内存中的信息写入硬盘,应使用()...
  3. 物联网通信技术期末复习7:第七章-典型物联网通信系统
  4. 微信小程序超级占内存_手机APP占内存?4款超赞的微信小程序,不用下载,拿去即可使用!...
  5. python 比较两种包装的大米的价钱
  6. 用混合编程实现两个LED交替闪烁
  7. 欢迎大家访问我的网站
  8. 电子学会2023年3月青少年软件编程python等级考试试卷(三级)真题,含答案解析
  9. 买二手房和买新房-----这几年的是没差别的
  10. 互亿天线短信接口php文档