趣谈Python银杏树(初学者程序)

一,看文章的人

(看过我博客的,第一段不用看都一样):

再看文章之前,你先看看你是不是这类人:

1.在做辅导班的作业,做不出来,抄了其他博客,又不知道什么意思,害怕老师让你上前威风地给其他同学讲(没关系,这里我会手把手教你,到时候,你也手把手教他们)

2.想学这位仁兄的程序,但别人的看不懂(刷到我的就对了)

3.踩我的(踩我吧)

4.想参考一下,打发时间(那么,你得好好看看我的程序了)


二,分析分析

好,先看原图吧:

趣谈Python银杏树(初学者程序)_第1张图片

搞美术的同志先别说我,这是计算机的问题,搞出个如此难堪的玩意儿,我也没办法。

言归正传,计算机搞出来的,就证明,人是随机的 ,而不是咱在哪儿吭哧吭哧算角度,也怪笔者太懒,不肯多发几张图片……

三,加油!!(代码第一段)

弄了半天程序人呢?

import turtle
import random
from math import *

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(10)  #生成斐波契那数列
print(yu)

这段代码就是生成一个斐波那契数(说实话,你这银杏树也没必要用到斐波那契数列啊,抄代码的同学可以跟老师说时看到网上都这么编,自己也跟着这么搞)。前三行不用说了吧,引进三个模块(小乌龟,随机,数学)。从第五行开始就是动真格了,(这段代码我黄金螺旋里面讲过,看过的第三章接下来可以跳过)。这个n是什么意思,就是第几个的意思(斐波那契数列),如果它等于0,那我们就返回0(return:返回的意思),如果等于一,就返回一。那下面是什么意思呢——斐波那契数列里前两项之和等于这一项,那前一项:第(项数-1)项,前两项:第(项数-2)项,然后再一加起来,就是这一项。第一位仁兄解决了,那还有一位等着汝等打开“编”戒:首先,我问你,你知道这个函数的第二行,空列表是什么意思吗?——空列表其实就是一个你可以往里头塞东西的柜子(子集里的空集),你加一个元素就加一个,你乐意就行。这就像一个公司,原来一个人没有,你创建了这个公司,就有一个大boss,然后你招员工,来一个,你公司里的员工(人)就多一个。这个理解了,那我现在让你做一个统计你公司的人的程序,你会做吗?——不会啊,你不会往哪列表里塞东西,你都不知道怎么把大象塞进冰箱,你怎么搞?所以说,这里我们要感谢PYTHON——给列表(所有)增加了一个新功能——append。这个模块是追加的意思,想加几个就加几个,不过你要说清楚你加几个,要不然电脑课听不懂。还有光说加几个,电脑基本蒙圈,所以还说要加什么要不然电脑基本报销。上面你看,我先用第一个函数做一个斐波那契数,然后把他搞列表里去,随着变量i的不断增加,那么这斐波那契数也不断增加,最忌形成了一个列表,然会返回这个列表,再把它赋值给yu(当时我在思考变量名,我校友不慎碰了一下我胳膊,就打出个这东西来了,好吧,就用这个做变量名吧)……

四,冲鸭!!(代码第二段——画叶子)

先看代码:

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)

(好吧,嫌我烦的直接到下面去复制代码得了,是吧)

好了,先定义四个函数:til/i/an/ye

til是取小乌龟头的朝向的值

i是在0到1值减去一个随机的值

an是在10到180之间随机取一个角度

ye就是随机取一种黄色(待会儿我们会通过一些手段把它改成RGB的值,所以说别慌)

 下面两行,大家就应该能理解了,就是去一种银杏树叶的颜色,有没有学霸能科普一下,银杏树叶的黄是什么黄啊?(抄代码的同学说这个是自己调试出来的,还可以具体描述如何艰辛,但不要过度)然后下面就是一些基础设置了,接下来就进入到画叶子阶段,知道i有什么用了吧,就是调一个边长,所以说这一段代码,重要的就是调试,没有什么过高的技术含量。

有人会问:node是什么意思,他就是一条笔的大小的一个形式参数(我当时写这个好像也没有什么意义,就是图个难度(网友笑评:增加推文长度的哈哈)

五,开挂(难的来了)!!

好吧,大家得先做一个心里准备啊,别被下边一长段吓着:

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:
 

你可能感兴趣的:(python)