(看过我博客的,第一段不用看都一样):
再看文章之前,你先看看你是不是这类人:
1.在做辅导班的作业,做不出来,抄了其他博客,又不知道什么意思,害怕老师让你上前威风地给其他同学讲(没关系,这里我会手把手教你,到时候,你也手把手教他们)
2.想学这位仁兄的程序,但别人的看不懂(刷到我的就对了)
3.踩我的(踩我吧)
4.想参考一下,打发时间(那么,你得好好看看我的程序了)
好,先看原图吧:
搞美术的同志先别说我,这是计算机的问题,搞出个如此难堪的玩意儿,我也没办法。
言归正传,计算机搞出来的,就证明,人是随机的 ,而不是咱在哪儿吭哧吭哧算角度,也怪笔者太懒,不肯多发几张图片……
弄了半天程序人呢?
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: