{
 "cells": [
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "turtle库的基础命令介绍\n",
    "https://www.cnblogs.com/nowgood/p/turtle.html#_nav_11\n",
    "（1）画布\n",
    "画布cancas是绘图区域，可以设置它的大小和初始位置\n",
    "turtle.screensize(1000,600,'red')    大小的设置\n",
    "turtle.setup(width=0.5,height=0.75)  初始位置\n",
    "\n",
    "（2）画笔\n",
    "\n",
    "（1）画笔运动的命令\n",
    "turtle.forward(a)   向当前画笔方向移动a像素长度\n",
    "turtle.backward(a)  向当前画笔相反方向移动a像素长度\n",
    "turtle.right(a)     顺时针移动\n",
    "aturtle.left(a)     逆时针移动\n",
    "aturtle.pendown()   移动时绘制图形\n",
    "turtle.goto(x,y)    将画笔移动到坐标为x,y的位置\n",
    "turtle.penup()      移动时不绘制图形，提起笔\n",
    "turtle.speed(a)     画笔绘制的速度范围\n",
    "turtle.circle()     画图，半径为正，表示圆心在画笔的左边画圈\n",
    "（2）画笔控制命令\n",
    "turtle.pensize(width)   绘制图形的宽度\n",
    "turtle.pencolor()       画笔的颜色\n",
    "turtle.fillcolor(a)     绘制图形的填充颜色\n",
    "turtle.color(a1,a2)     同时设置pencolor=a1,fillcolor=a2\n",
    "turtle.filling()        返回当前是否在填充状态\n",
    "turtle.begin_fill()     准备开始填充图形\n",
    "turtle.end_fill()       填充完成\n",
    "turtle.hideturtle()     隐藏箭头显示\n",
    "turtle.showturtle()     显示箭头\n",
    "（3）全局控制命令\n",
    "turtle.clear()   清空turtle窗口,但是turtle的位置和状态不会改变\n",
    "turtle.reset()   清空窗口，重置turtle状态为起始位置\n",
    "turtle.undo()    撤销上一个turtle动作\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# turtle库的基本函数：\n",
    "\n",
    "## 一、绘图窗口设置命令\n",
    "\n",
    "①turtle.setup(width，height，starty,starty)  注：（starty,starty）指的是绘图窗体左上角位置的坐标,这两个参数可选，\n",
    "若为空，则窗口位于屏幕中心<br/>\n",
    "turtle.setup(100,100)<br/>\n",
    "turtle.setup800, 800, 100,100)\n",
    "\n",
    "②turtle.screensize(canvwidth=None, canvheight=None, bg=None)  参数分别为画布的宽(单位像素), 高, 背景颜色<br/> \n",
    "注：若括号为空，则默认值为（400,300）\n",
    "\n",
    "turtle.screensize(400, 300, \"red\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import turtle\n",
    "from turtle import *\n",
    "# turtle.setup(100,100)\n",
    "turtle.screensize(400, 300, \"blue\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "circle(50) # 整圆;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "circle(50,steps=3) # 三角形;  其实圆用多边形来替代，"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "circle(120, 180) # 半圆"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 画蓝色三角形"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import turtle as t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "t.pencolor(\"blue\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "t.pensize(10)      #绘制图形的宽度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "t.backward(100)    #往回100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "t.left(60)         #逆时针60"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "t.forward(200)     #前进200"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for __count in range(2):\n",
    "    t.right(120)\n",
    "    t.forward(200)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "t.left(90)\n",
    "t.forward(200)     #前进200\n",
    "t.done()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 二、坐标体系\n",
    "\n",
    "（1）空间坐标体系\n",
    "* ①turtle.goto(x,y)：直接跳转到（x,y）点，以绘图窗口中心为原点，向右为x轴，向上为y轴。\n",
    "* ②turtle.fd(d)、turtle.forward(d)：以当前方向，往前行进d像素。\n",
    "* ③turtle.bk(d)、turtle.backword(d)：保持当前方向不变，往后退行d像素。\n",
    "* ④turtle.circle(r,angle)：从当前位置以r为半径圆的angle角度旋转。<br/>\n",
    "（2）角度坐标体系\n",
    "* ①turtle.setheading(angle）也可简写为turtle.seth()    表示海龟改变行进角度，但不运动。绘图窗体以x轴为起点，将方向偏转为angle度，逆时针为正。\n",
    "* ②turtle.left(angle)：在当前行进方向的基础上，向左旋转angle度。\n",
    "* ③turtle.right(angle)：在当前行进方向的基础上，向右旋转angle度。<br/>\n",
    "\n",
    "（3）画笔控制命令\n",
    "* ①turtle.penup()  表示 抬笔   turtle.pendown()  表示   落笔\n",
    "\n",
    "* ②turtle.pensize(x)  表示画笔宽度\n",
    "\n",
    "* ③turtle.pencolor(颜色名red/RGB三元组/颜色编码)  表示画笔颜色  e.g.turtle.pencolor(\"red\")  画笔为红色\n",
    "\n",
    "   turtle.colormode(mode)\n",
    "\n",
    "* ④turtle.fillcolor(colorstring)：绘制图形的填充颜色<br/>\n",
    "    turtle.begin_fill()：开始填充<br/>\n",
    "    turtle.end_fill()：结束填充<br/>\n",
    "\n",
    "turtle.done()  写在末尾，程序运行完不会退出"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 绘制爱心"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import turtle\n",
    "turtle.color('red', 'pink')\n",
    "turtle.pensize(2)       \n",
    "turtle.pendown()\n",
    "turtle.seth(150)\n",
    "turtle.begin_fill()\n",
    "turtle.fd(40)\n",
    "turtle.circle(40 * -3.745, 45)\n",
    "turtle.circle(40 * -1.431, 165)\n",
    "turtle.left(120)\n",
    "turtle.circle(40 * -1.431, 165)\n",
    "turtle.circle(40 * -3.745, 45)\n",
    "turtle.fd(40)\n",
    "turtle.end_fill()\n",
    "\n",
    "turtle.done()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 画螺旋线\n",
    "import turtle\n",
    "myTurtle = turtle.Turtle()\n",
    "myWin = turtle.Screen()\n",
    "\n",
    "def drawSpiral(myTurtle, lineLen):\n",
    "    if lineLen > 0:\n",
    "        myTurtle.forward(lineLen)\n",
    "        myTurtle.right(90)\n",
    "        drawSpiral(myTurtle,lineLen-5)\n",
    "\n",
    "drawSpiral(myTurtle,100)\n",
    "myWin.exitonclick()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 递归画树\n",
    "import turtle\n",
    "\n",
    "def tree(branchLen,t):\n",
    "    if branchLen > 5:\n",
    "        t.forward(branchLen)\n",
    "        t.right(20)\n",
    "        tree(branchLen-15,t)\n",
    "        t.left(40)\n",
    "        tree(branchLen-15,t)\n",
    "        t.right(20)\n",
    "        t.backward(branchLen)\n",
    "        \n",
    "def main():\n",
    "    t = turtle.Turtle()\n",
    "    myWin = turtle.Screen()\n",
    "    t.left(90)\n",
    "    t.up()\n",
    "    t.backward(100)\n",
    "    t.down()\n",
    "    t.color(\"green\")\n",
    "    tree(75,t)\n",
    "    myWin.exitonclick()\n",
    "    \n",
    "main()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 小猪佩奇"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import turtle as t\n",
    "t.pensize(4)\n",
    "t.hideturtle()\n",
    "t.colormode(255)\n",
    "t.color((255, 155, 192), \"pink\")\n",
    "t.setup(840, 500)\n",
    "t.speed(20)\n",
    "# 鼻子\n",
    "t.pu()\n",
    "t.goto(-100, 100)\n",
    "t.pd()\n",
    "t.seth(-30)\n",
    "t.begin_fill()\n",
    "a = 0.4\n",
    "for i in range(120):\n",
    "    if 0 <= i < 30 or 60 <= i < 90:\n",
    "        a = a + 0.08\n",
    "        t.lt(3)  # 向左转3度\n",
    "        t.fd(a)  # 向前走a的步长\n",
    "    else:\n",
    "        a = a - 0.08\n",
    "        t.lt(3)\n",
    "        t.fd(a)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(25)\n",
    "t.seth(0)\n",
    "t.fd(10)\n",
    "t.pd()\n",
    "t.pencolor(255, 155, 192)\n",
    "t.seth(10)\n",
    "t.begin_fill()\n",
    "t.circle(5)\n",
    "t.color(160, 82, 45)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.seth(0)\n",
    "t.fd(20)\n",
    "t.pd()\n",
    "t.pencolor(255, 155, 192)\n",
    "t.seth(10)\n",
    "t.begin_fill()\n",
    "t.circle(5)\n",
    "t.color(160, 82, 45)\n",
    "t.end_fill()\n",
    "# 头\n",
    "t.color((255, 155, 192), \"pink\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(41)\n",
    "t.seth(0)\n",
    "t.fd(0)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.seth(180)\n",
    "t.circle(300, -30)\n",
    "t.circle(100, -60)\n",
    "t.circle(80, -100)\n",
    "t.circle(150, -20)\n",
    "t.circle(60, -95)\n",
    "t.seth(161)\n",
    "t.circle(-300, 15)\n",
    "t.pu()\n",
    "t.goto(-100, 100)\n",
    "t.pd()\n",
    "t.seth(-30)\n",
    "a = 0.4\n",
    "for i in range(60):\n",
    "    if 0 <= i < 30 or 60 <= i < 90:\n",
    "        a = a + 0.08\n",
    "        t.lt(3)  # 向左转3度\n",
    "        t.fd(a)  # 向前走a的步长\n",
    "    else:\n",
    "        a = a - 0.08\n",
    "        t.lt(3)\n",
    "        t.fd(a)\n",
    "t.end_fill()\n",
    "# 耳朵\n",
    "t.color((255, 155, 192), \"pink\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-7)\n",
    "t.seth(0)\n",
    "t.fd(70)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.seth(100)\n",
    "t.circle(-50, 50)\n",
    "t.circle(-10, 120)\n",
    "t.circle(-50, 54)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-12)\n",
    "t.seth(0)\n",
    "t.fd(30)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.seth(100)\n",
    "t.circle(-50, 50)\n",
    "t.circle(-10, 120)\n",
    "t.circle(-50, 56)\n",
    "t.end_fill()\n",
    "# 眼睛\n",
    "t.color((255, 155, 192), \"white\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-20)\n",
    "t.seth(0)\n",
    "t.fd(-95)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(15)\n",
    "t.end_fill()\n",
    "t.color(\"black\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(12)\n",
    "t.seth(0)\n",
    "t.fd(-3)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(3)\n",
    "t.end_fill()\n",
    "t.color((255, 155, 192), \"white\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-25)\n",
    "t.seth(0)\n",
    "t.fd(40)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(15)\n",
    "t.end_fill()\n",
    "t.color(\"black\")\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(12)\n",
    "t.seth(0)\n",
    "t.fd(-3)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(3)\n",
    "t.end_fill()\n",
    "# 腮\n",
    "t.color((255, 155, 192))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-95)\n",
    "t.seth(0)\n",
    "t.fd(65)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(30)\n",
    "t.end_fill()\n",
    "# 嘴\n",
    "t.color(239, 69, 19)\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(15)\n",
    "t.seth(0)\n",
    "t.fd(-100)\n",
    "t.pd()\n",
    "t.seth(-80)\n",
    "t.circle(30, 40)\n",
    "t.circle(40, 80)\n",
    "# 身体\n",
    "t.color(\"red\", (255, 99, 71))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-20)\n",
    "t.seth(0)\n",
    "t.fd(-78)\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.seth(-130)\n",
    "t.circle(100, 10)\n",
    "t.circle(300, 30)\n",
    "t.seth(0)\n",
    "t.fd(230)\n",
    "t.seth(90)\n",
    "t.circle(300, 30)\n",
    "t.circle(100, 3)\n",
    "t.color((255, 155, 192), (255, 100, 100))\n",
    "t.seth(-135)\n",
    "t.circle(-80, 63)\n",
    "t.circle(-150, 24)\n",
    "t.end_fill()\n",
    "# 手\n",
    "t.color((255, 155, 192))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-40)\n",
    "t.seth(0)\n",
    "t.fd(-27)\n",
    "t.pd()\n",
    "t.seth(-160)\n",
    "t.circle(300, 15)\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(15)\n",
    "t.seth(0)\n",
    "t.fd(0)\n",
    "t.pd()\n",
    "t.seth(-10)\n",
    "t.circle(-20, 90)\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(30)\n",
    "t.seth(0)\n",
    "t.fd(237)\n",
    "t.pd()\n",
    "t.seth(-20)\n",
    "t.circle(-300, 15)\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(20)\n",
    "t.seth(0)\n",
    "t.fd(0)\n",
    "t.pd()\n",
    "t.seth(-170)\n",
    "t.circle(20, 90)\n",
    "# 脚\n",
    "t.pensize(10)\n",
    "t.color((240, 128, 128))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(-75)\n",
    "t.seth(0)\n",
    "t.fd(-180)\n",
    "t.pd()\n",
    "t.seth(-90)\n",
    "t.fd(40)\n",
    "t.seth(-180)\n",
    "t.color(\"black\")\n",
    "t.pensize(15)\n",
    "t.fd(20)\n",
    "t.pensize(10)\n",
    "t.color((240, 128, 128))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(40)\n",
    "t.seth(0)\n",
    "t.fd(90)\n",
    "t.pd()\n",
    "t.seth(-90)\n",
    "t.fd(40)\n",
    "t.seth(-180)\n",
    "t.color(\"black\")\n",
    "t.pensize(15)\n",
    "t.fd(20)\n",
    "# 尾巴\n",
    "t.pensize(4)\n",
    "t.color((255, 155, 192))\n",
    "t.pu()\n",
    "t.seth(90)\n",
    "t.fd(70)\n",
    "t.seth(0)\n",
    "t.fd(95)\n",
    "t.pd()\n",
    "t.seth(0)\n",
    "t.circle(70, 20)\n",
    "t.circle(10, 330)\n",
    "t.circle(70, 30)\n",
    "t.exitonclick()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 视觉冲击1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import turtle as t\n",
    "\n",
    "angle = 60 #通过改变角度，绘制出各种多边形\n",
    "t.setup(1280,720,500,500)\n",
    "t.bgcolor('black')\n",
    "t.pensize(2)\n",
    "randomColor = ['red','blue','green','purple','gold','pink']\n",
    "t.speed(0)\n",
    "for i in range(600):\n",
    "      t.color(randomColor[i%6])\n",
    "      t.fd(i)\n",
    "      t.rt(angle+1)\n",
    "up()\n",
    "color(\"#0fe6ca\")\n",
    "goto(0,0)\n",
    "down()\n",
    "t.done()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 明月几时有"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from turtle import *\n",
    "import time\n",
    "import turtle as t\n",
    "\n",
    "\n",
    "def gotopos(x, y):\n",
    "    up()\n",
    "    goto(x, y)\n",
    "    down()\n",
    "    ht()\n",
    "\n",
    "\n",
    "def author():\n",
    "    pensize(2)\n",
    "    gotopos(610, -315)\n",
    "    lt(-90)\n",
    "    fd(80)\n",
    "    pensize(1)\n",
    "    lt(-270)\n",
    " \n",
    "\n",
    "def apply_rules(path, rules):\n",
    "    L = [_ for _ in path]\n",
    "    for i in range(len(L)):\n",
    "        symbol = L[i]\n",
    "        if symbol == 'F':\n",
    "            L[i] = rules[symbol]\n",
    "        if symbol == 'X':\n",
    "            L[i] = rules[symbol]\n",
    "    path = ''.join(L)\n",
    "    return path\n",
    "\n",
    "\n",
    "def draw_path(path):\n",
    "    posList, angleList = [], []\n",
    "    for symbol in path:\n",
    "        if symbol == 'F':\n",
    "            t.forward(length)\n",
    "        elif symbol == '+':\n",
    "            t.left(angle)\n",
    "        elif symbol == '-':\n",
    "            t.rt(angle)\n",
    "        elif symbol == '[':\n",
    "            posList.append(t.pos())\n",
    "            angleList.append(t.heading())\n",
    "        elif symbol == 'a':\n",
    "            t.pensize(3)\n",
    "            t.color(\"#867b68\")\n",
    "        elif symbol == 'b':\n",
    "            t.pensize(2)\n",
    "            t.color(\"#867b68\")\n",
    "        elif symbol == 'c':\n",
    "            t.pensize(2)\n",
    "            t.color(\"#867b68\")\n",
    "        elif symbol == ']':\n",
    "            t.up()\n",
    "            t.home()\n",
    "            t.goto(posList.pop())\n",
    "            t.left(angleList.pop())\n",
    "            t.down()\n",
    "\n",
    "\n",
    "def writez(x, y, str_, size=56, font=\"华文行楷\"):\n",
    "    gotopos(x, y)\n",
    "    write(str_, font=(font, size))\n",
    "\n",
    "\n",
    "setup(1280, 800,50,50)\n",
    "speed(5)\n",
    "bgcolor(\"#9c917f\")\n",
    "color(\"#afa697\")\n",
    "begin_fill()\n",
    "gotopos(0, -400)\n",
    "circle(400)\n",
    "end_fill()\n",
    "author()\n",
    "color(\"#7d776d\")\n",
    "s = \"但愿人长久\"\n",
    "s2 = \"千里共婵娟\"\n",
    "for i in range(len(s)):\n",
    "    writez(560, 350 - i * 50, s[i], 36)\n",
    "for i in range(len(s2)):\n",
    "    writez(460, 350 - i * 50, s2[i], 36)\n",
    "color(\"#888475\")\n",
    "writez(-50, 100, \"天\")\n",
    "writez(-50, 40, \"涯\")\n",
    "writez(-160, 0, \"共\", 96)\n",
    "# writez(-50, 0, \"此\", 176)\n",
    "writez(33, -30, \"此\", 62)\n",
    "writez(-18, -95, \"时\", 78)\n",
    "# writez(-213, -210, \"亮\", 196)\n",
    "\n",
    "gotopos(249, -26)\n",
    "color(\"#867b68\")\n",
    "speed(8)\n",
    "gotopos(-650, -100)\n",
    "length = 6\n",
    "path = 'F'\n",
    "angle = 27\n",
    "rules = {\n",
    "    'F': 'aFF[b-F++F][c+F--F]c++F--F',\n",
    "    'X': 'aFF+[b+F]+[c-F]'\n",
    "}\n",
    "\n",
    "for _ in range(4):\n",
    "    path = apply_rules(path, rules)\n",
    "    \n",
    "draw_path(path)\n",
    "gotopos(570, -330)\n",
    "done()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 机器猫"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import turtle as t\n",
    "# t.speed(5)\n",
    "t.pensize(8)\n",
    "t.hideturtle()\n",
    "t.screensize(500, 500, bg='white')\n",
    "# 猫脸\n",
    "t.fillcolor('#00A1E8')\n",
    "t.begin_fill()\n",
    "t.circle(120)\n",
    "t.end_fill()\n",
    "t.pensize(3)\n",
    "t.fillcolor('white')\n",
    "t.begin_fill()\n",
    "t.circle(100)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(0, 134)\n",
    "t.pd()\n",
    "t.pensize(4)\n",
    "t.fillcolor(\"#EA0014\")\n",
    "t.begin_fill()\n",
    "t.circle(18)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.goto(7, 155)\n",
    "t.pensize(2)\n",
    "t.color('white', 'white')\n",
    "t.pd()\n",
    "t.begin_fill()\n",
    "t.circle(4)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.goto(-30, 160)\n",
    "t.pensize(4)\n",
    "t.pd()\n",
    "t.color('black', 'white')\n",
    "t.begin_fill()\n",
    "a = 0.4\n",
    "for i in range(120):\n",
    "    if 0 <= i < 30 or 60 <= i < 90:\n",
    "        a = a + 0.08\n",
    "        t.lt(3)  # 向左转3度\n",
    "        t.fd(a)  # 向前走a的步长\n",
    "    else:\n",
    "        a = a - 0.08\n",
    "        t.lt(3)\n",
    "        t.fd(a)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.goto(30, 160)\n",
    "t.pensize(4)\n",
    "t.pd()\n",
    "t.color('black', 'white')\n",
    "t.begin_fill()\n",
    "for i in range(120):\n",
    "    if 0 <= i < 30 or 60 <= i < 90:\n",
    "        a = a + 0.08\n",
    "        t.lt(3)  # 向左转3度\n",
    "        t.fd(a)  # 向前走a的步长\n",
    "    else:\n",
    "        a = a - 0.08\n",
    "        t.lt(3)\n",
    "        t.fd(a)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.goto(-38, 190)\n",
    "t.pensize(8)\n",
    "t.pd()\n",
    "t.right(-30)\n",
    "t.forward(15)\n",
    "t.right(70)\n",
    "t.forward(15)\n",
    "t.pu()\n",
    "t.goto(15, 185)\n",
    "t.pensize(4)\n",
    "t.pd()\n",
    "t.color('black', 'black')\n",
    "t.begin_fill()\n",
    "t.circle(13)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.goto(13, 190)\n",
    "t.pensize(2)\n",
    "t.pd()\n",
    "t.color('white', 'white')\n",
    "t.begin_fill()\n",
    "t.circle(5)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(0, 134)\n",
    "t.pensize(4)\n",
    "t.pencolor('black')\n",
    "t.pd()\n",
    "t.right(90)\n",
    "t.forward(40)\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(0, 124)\n",
    "t.pensize(3)\n",
    "t.pencolor('black')\n",
    "t.pd()\n",
    "t.left(10)\n",
    "t.forward(80)\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(0, 114)\n",
    "t.pensize(3)\n",
    "t.pencolor('black')\n",
    "t.pd()\n",
    "t.left(6)\n",
    "t.forward(80)\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(0, 104)\n",
    "t.pensize(3)\n",
    "t.pencolor('black')\n",
    "t.pd()\n",
    "t.left(0)\n",
    "t.forward(80)\n",
    "# 左边的胡子\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(0, 124)\n",
    "t.pensize(3)\n",
    "t.pencolor('black')\n",
    "t.pd()\n",
    "t.left(170)\n",
    "t.forward(80)\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(0, 114)\n",
    "t.pensize(3)\n",
    "t.pencolor('black')\n",
    "t.pd()\n",
    "t.left(174)\n",
    "t.forward(80)\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(0, 104)\n",
    "t.pensize(3)\n",
    "t.pencolor('black')\n",
    "t.pd()\n",
    "t.left(180)\n",
    "t.forward(80)\n",
    "t.pu()\n",
    "t.goto(-70, 70)\n",
    "t.pd()\n",
    "t.color('black', 'red')\n",
    "t.pensize(6)\n",
    "t.seth(-60)\n",
    "t.begin_fill()\n",
    "t.circle(80, 40)\n",
    "t.circle(80, 80)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(-80, 70)\n",
    "t.pd()\n",
    "t.forward(160)\n",
    "t.pu()\n",
    "t.home()\n",
    "t.goto(-50, 50)\n",
    "t.pd()\n",
    "t.pensize(1)\n",
    "t.fillcolor(\"#eb6e1a\")\n",
    "t.seth(40)\n",
    "t.begin_fill()\n",
    "t.circle(-40, 40)\n",
    "t.circle(-40, 40)\n",
    "t.seth(40)\n",
    "t.circle(-40, 40)\n",
    "t.circle(-40, 40)\n",
    "t.seth(220)\n",
    "t.circle(-80, 40)\n",
    "t.circle(-80, 40)\n",
    "t.end_fill()\n",
    "# 领带\n",
    "t.pu()\n",
    "t.goto(-70, 12)\n",
    "t.pensize(14)\n",
    "t.pencolor('red')\n",
    "t.pd()\n",
    "t.seth(-20)\n",
    "t.circle(200, 30)\n",
    "t.circle(200, 10)\n",
    "# 铃铛\n",
    "t.pu()\n",
    "t.goto(0, -46)\n",
    "t.pd()\n",
    "t.pensize(3)\n",
    "t.color(\"black\", '#f8d102')\n",
    "t.begin_fill()\n",
    "t.circle(25)\n",
    "t.end_fill()\n",
    "t.pu()\n",
    "t.goto(-5, -40)\n",
    "t.pd()\n",
    "t.pensize(2)\n",
    "t.color(\"black\", '#79675d')\n",
    "t.begin_fill()\n",
    "t.circle(5)\n",
    "t.end_fill()\n",
    "t.pensize(3)\n",
    "t.right(115)\n",
    "t.forward(7)\n",
    "t.mainloop()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 皮卡丘"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# coding:utf-8\n",
    "import turtle as t\n",
    "import time\n",
    "# 皮卡丘\n",
    "# 基础设置\n",
    "t.screensize(800, 600)\n",
    "t.pensize(2)  # 设置画笔的大小\n",
    "t.speed(10)  # 设置画笔速度为10\n",
    "# 画左偏曲线函数\n",
    "def radian_left(ang, dis, step, n):\n",
    "    for i in range(n):\n",
    "        dis += step  # dis增大step\n",
    "        t.lt(ang)  # 向左转ang度\n",
    "        t.fd(dis)  # 向前走dis的步长\n",
    "def radian_right(ang, dis, step, n):\n",
    "    for i in range(n):\n",
    "        dis += step\n",
    "        t.rt(ang)  # 向左转ang度\n",
    "        t.fd(dis)  # 向前走dis的步长\n",
    "# 画耳朵\n",
    "def InitEars():\n",
    "    t.color(\"black\", \"yellow\")\n",
    "    # 左耳朵曲线\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(-50, 100)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(110)  # 画笔角度\n",
    "    t.begin_fill()\n",
    "    radian_left(1.2, 0.4, 0.1, 40)\n",
    "    t.setheading(270)  # 画笔角度\n",
    "    radian_left(1.2, 0.4, 0.1, 40)\n",
    "    t.setheading(44)  # 画笔角度\n",
    "    t.forward(32)\n",
    "    t.end_fill()\n",
    "    # 右耳朵曲线\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(50, 100)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(70)  # 画笔角度\n",
    "    t.begin_fill()\n",
    "    radian_right(1.2, 0.4, 0.1, 40)\n",
    "    t.setheading(270)  # 画笔角度\n",
    "    radian_right(1.2, 0.4, 0.1, 40)\n",
    "    t.setheading(136)  # 画笔角度\n",
    "    t.forward(32)\n",
    "    t.end_fill()\n",
    "    # 耳朵黑\n",
    "    t.begin_fill()\n",
    "    t.fillcolor(\"black\")\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(88, 141)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(35)  # 画笔角度\n",
    "    radian_right(1.2, 1.6, 0.1, 16)\n",
    "    t.setheading(270)  # 画笔角度\n",
    "    radian_right(1.2, 0.4, 0.1, 25)\n",
    "    t.setheading(132)  # 画笔角度\n",
    "    t.forward(31)\n",
    "    t.end_fill()\n",
    "    t.begin_fill()\n",
    "    t.fillcolor(\"black\")\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(-88, 141)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(145)  # 画笔角度\n",
    "    radian_left(1.2, 1.6, 0.1, 16)\n",
    "    t.setheading(270)  # 画笔角度\n",
    "    radian_left(1.2, 0.4, 0.1, 25)\n",
    "    t.setheading(48)  # 画笔角度\n",
    "    t.forward(31)\n",
    "    t.end_fill()\n",
    "# 画尾巴\n",
    "def InitTail():\n",
    "    # 尾巴\n",
    "    t.begin_fill()\n",
    "    t.fillcolor(\"yellow\")\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(64, -140)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(10)  # 画笔角度\n",
    "    t.forward(20)\n",
    "    t.setheading(90)  # 画笔角度\n",
    "    t.forward(20)\n",
    "    t.setheading(10)  # 画笔角度\n",
    "    t.forward(10)\n",
    "    t.setheading(80)  # 画笔角度\n",
    "    t.forward(100)\n",
    "    t.setheading(35)  # 画笔角度\n",
    "    t.forward(80)\n",
    "    t.setheading(260)  # 画笔角度\n",
    "    t.forward(100)\n",
    "    t.setheading(205)  # 画笔角度\n",
    "    t.forward(40)\n",
    "    t.setheading(260)  # 画笔角度\n",
    "    t.forward(37)\n",
    "    t.setheading(205)  # 画笔角度\n",
    "    t.forward(20)\n",
    "    t.setheading(260)  # 画笔角度\n",
    "    t.forward(25)\n",
    "    t.setheading(175)  # 画笔角度\n",
    "    t.forward(30)\n",
    "    t.setheading(100)  # 画笔角度\n",
    "    t.forward(13)\n",
    "    t.end_fill()\n",
    "# 画脚\n",
    "def InitFoots():\n",
    "    # 脚\n",
    "    t.begin_fill()\n",
    "    t.fillcolor(\"yellow\")\n",
    "    t.pensize(2)\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(-70, -200)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(225)  # 画笔角度\n",
    "    radian_left(0.5, 1.2, 0, 12)\n",
    "    radian_left(35, 0.6, 0, 4)\n",
    "    radian_left(1, 1.2, 0, 18)\n",
    "    t.setheading(160)  # 画笔角度\n",
    "    t.forward(13)\n",
    "    t.end_fill()\n",
    "    t.begin_fill()\n",
    "    t.fillcolor(\"yellow\")\n",
    "    t.pensize(2)\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(70, -200)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(315)  # 画笔角度\n",
    "    radian_right(0.5, 1.2, 0, 12)\n",
    "    radian_right(35, 0.6, 0, 4)\n",
    "    radian_right(1, 1.2, 0, 18)\n",
    "    t.setheading(20)  # 画笔角度\n",
    "    t.forward(13)\n",
    "    t.end_fill()\n",
    "# 画身体\n",
    "def InitBody():\n",
    "    # 外形轮廓\n",
    "    t.begin_fill()\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(112, 0)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(90)  # 画笔角度\n",
    "    t.circle(112, 180)\n",
    "    t.setheading(250)  # 画笔角度\n",
    "    radian_left(1.6, 1.3, 0, 50)\n",
    "    radian_left(0.8, 1.5, 0, 25)\n",
    "    t.setheading(255)  # 画笔角度\n",
    "    radian_left(0.4, 1.6, 0.2, 27)\n",
    "    radian_left(2.8, 1, 0, 45)\n",
    "    radian_right(0.9, 1.4, 0, 31)\n",
    "    t.setheading(355)  # 画笔角度\n",
    "    radian_right(0.9, 1.4, 0, 31)\n",
    "    radian_left(2.8, 1, 0, 45)\n",
    "    radian_left(0.4, 7.2, -0.2, 27)\n",
    "    t.setheading(10)  # 画笔角度\n",
    "    radian_left(0.8, 1.5, 0, 25)\n",
    "    radian_left(1.6, 1.3, 0, 50)\n",
    "    t.end_fill()\n",
    "def InitEyes():\n",
    "    # 左眼睛\n",
    "    t.begin_fill()\n",
    "    t.fillcolor(\"black\")\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(-46, 10)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(90)  # 画笔角度\n",
    "    t.circle(5, 360)\n",
    "    t.end_fill()\n",
    "    # 右眼睛\n",
    "    t.begin_fill()\n",
    "    t.fillcolor(\"black\")\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(46, 10)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(-90)  # 画笔角度\n",
    "    t.circle(5, 360)\n",
    "    t.end_fill()\n",
    "# 画脸\n",
    "def InitFace():\n",
    "    # 脸蛋\n",
    "    t.begin_fill()\n",
    "    t.fillcolor(\"red\")\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(-63, -10)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(90)  # 画笔角度\n",
    "    t.circle(10, 360)\n",
    "    t.end_fill()\n",
    "    t.begin_fill()\n",
    "    t.fillcolor(\"red\")\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(63, -10)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(-90)  # 画笔角度\n",
    "    t.circle(10, 360)\n",
    "    t.end_fill()\n",
    "    # 嘴巴\n",
    "    t.pensize(2.2)\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(0, 0)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(235)  # 画笔角度\n",
    "    radian_right(5, 0.8, 0, 30)\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(0, 0)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(305)  # 画笔角度\n",
    "    radian_left(5, 0.8, 0, 30)\n",
    "# 画手\n",
    "def InitHands():\n",
    "    # 左手\n",
    "    t.pensize(2)\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(-46, -100)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(285)  # 画笔角度\n",
    "    radian_right(0.4, 1.2, 0, 26)\n",
    "    radian_right(5, 0.35, 0, 26)\n",
    "    radian_right(0.3, 1.2, 0, 15)\n",
    "    # 右手\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(46, -100)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(255)  # 画笔角度\n",
    "    radian_left(0.4, 1.2, 0, 26)\n",
    "    radian_left(5, 0.35, 0, 26)\n",
    "    radian_left(0.3, 1.2, 0, 15)\n",
    "def CloseEyes():\n",
    "    # 左眼睛\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(-46, 12)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(180)  # 画笔角度\n",
    "    t.forward(10)\n",
    "    # 右眼睛\n",
    "    t.pu()  # 提笔\n",
    "    t.goto(46, 12)  # 笔头初始位置\n",
    "    t.pd()  # 下笔\n",
    "    t.setheading(0)  # 画笔角度\n",
    "    t.forward(10)\n",
    "# 初始化\n",
    "def Init():\n",
    "    InitEars()\n",
    "    InitTail()\n",
    "    InitFoots()\n",
    "    InitBody()\n",
    "    InitFace()\n",
    "    InitHands()\n",
    "    InitEyes()\n",
    "# 眨眼睛\n",
    "def Upgarde():\n",
    "    InitEars()\n",
    "    InitTail()\n",
    "    InitFoots()\n",
    "    InitBody()\n",
    "    InitFace()\n",
    "    InitHands()\n",
    "    CloseEyes()\n",
    "def Upgarde_Init():\n",
    "    InitEars()\n",
    "    InitTail()\n",
    "    InitFoots()\n",
    "    InitBody()\n",
    "    InitFace()\n",
    "    InitHands()\n",
    "    InitEyes()\n",
    "def main():\n",
    "    Init()\n",
    "    t.tracer(False)\n",
    "    # 眨眼睛动画\n",
    "    for i in range(30):\n",
    "        if i % 2 == 0:\n",
    "            t.reset()\n",
    "            t.hideturtle()\n",
    "            Upgarde()\n",
    "            t.update()\n",
    "            time.sleep(0.3)\n",
    "        else:\n",
    "            t.reset()\n",
    "            t.hideturtle()\n",
    "            Upgarde_Init()\n",
    "            t.update()\n",
    "            time.sleep(1)\n",
    "main()\n",
    "# 结束画笔\n",
    "t.done()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 樱花树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from turtle import *\n",
    "from random import *\n",
    "from math import *\n",
    "class Tree:\n",
    "    def __init__(self):\n",
    "        setup(1000, 700)\n",
    "        bgcolor(1, 1, 1)  # 背景色\n",
    "        # ht()  # 隐藏turtle\n",
    "        speed(10)  # 速度 1-10渐进，0 最快\n",
    "        # tracer(1, 100)    # 设置绘图屏幕刷新频率，参数1设置在正常刷新频次的第参数1次刷新，参数2设置每次刷新的时延\n",
    "        tracer(0, 0)\n",
    "        pu()  # 抬笔\n",
    "        backward(100)\n",
    "        # 保证笔触箭头方向始终不向下，此处使其左转90度，而不是右转\n",
    "        left(90)  # 左转90度\n",
    "        backward(300)  # 后退300\n",
    "    def tree(self, n, l):\n",
    "        pd()  # 下笔\n",
    "        # 阴影效果\n",
    "        t = cos(radians(heading() + 45)) / 8 + 0.25\n",
    "        pencolor(t, t, t)\n",
    "        pensize(n / 1.2)\n",
    "        forward(l)  # 画树枝\n",
    "        if n > 0:\n",
    "            b = random() * 15 + 10  # 右分支偏转角度\n",
    "            c = random() * 15 + 10  # 左分支偏转角度\n",
    "            d = l * (random() * 0.25 + 0.7)  # 下一个分支的长度\n",
    "            # 右转一定角度,画右分支\n",
    "            right(b)\n",
    "            self.tree(n - 1, d)\n",
    "            # 左转一定角度，画左分支\n",
    "            left(b + c)\n",
    "            self.tree(n - 1, d)\n",
    "            # 转回来\n",
    "            right(c)\n",
    "        else:\n",
    "            # 画叶子\n",
    "            right(90)\n",
    "            n = cos(radians(heading() - 45)) / 4 + 0.5\n",
    "            pencolor(n, n * 0.8, n * 0.8)\n",
    "            fillcolor(n, n * 0.8, n * 0.8)\n",
    "            begin_fill()\n",
    "            circle(3)\n",
    "            left(90)\n",
    "            end_fill()\n",
    "            # 添加0.3倍的飘落叶子\n",
    "            if random() > 0.7:\n",
    "                pu()\n",
    "                # 飘落\n",
    "                t = heading()\n",
    "                an = -40 + random() * 40\n",
    "                setheading(an)\n",
    "                dis = int(800 * random() * 0.5 + 400 * random() * 0.3 + 200 * random() * 0.2)\n",
    "                forward(dis)\n",
    "                setheading(t)\n",
    "                # 画叶子\n",
    "                pd()\n",
    "                right(90)\n",
    "                n = cos(radians(heading() - 45)) / 4 + 0.5\n",
    "                pencolor(n * 0.5 + 0.5, 0.4 + n * 0.4, 0.4 + n * 0.4)\n",
    "                fillcolor(n, n * 0.8, n * 0.8)\n",
    "                begin_fill()\n",
    "                circle(2)\n",
    "                left(90)\n",
    "                end_fill()\n",
    "                pu()\n",
    "                # 返回\n",
    "                t = heading()\n",
    "                setheading(an)\n",
    "                backward(dis)\n",
    "                setheading(t)\n",
    "                # pass\n",
    "        pu()\n",
    "        backward(l)  # 退回\n",
    "def main():\n",
    "    tree = Tree()\n",
    "    tree.tree(12, 100)  # 递归7层\n",
    "    done()\n",
    "if __name__ == '__main__':\n",
    "    main()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 黑白樱花树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from turtle import *\n",
    "from random import *\n",
    "from math import *\n",
    "def tree(n, l):\n",
    "    pd()  # 下笔\n",
    "    # 阴影效果\n",
    "    t = cos(radians(heading() + 45)) / 8 + 0.25\n",
    "    pencolor(t, t, t)\n",
    "    pensize(n / 4)\n",
    "    forward(l)  # 画树枝\n",
    "    if n > 0:\n",
    "        b = random() * 15 + 10  # 右分支偏转角度\n",
    "        c = random() * 15 + 10  # 左分支偏转角度\n",
    "        d = l * (random() * 0.35 + 0.6)  # 下一个分支的长度\n",
    "        # 右转一定角度，画右分支\n",
    "        right(b)\n",
    "        tree(n - 1, d)\n",
    "        # 左转一定角度，画左分支\n",
    "        left(b + c)\n",
    "        tree(n - 1, d)\n",
    "        # 转回来\n",
    "        right(c)\n",
    "    else:\n",
    "        # 画叶子\n",
    "        right(90)\n",
    "        n = cos(radians(heading() - 45)) / 4 + 0.5\n",
    "        pencolor(n, n, n)\n",
    "        circle(2)\n",
    "        left(90)\n",
    "    pu()\n",
    "    backward(l)  # 退回\n",
    "bgcolor(0.5, 0.5, 0.5)  # 背景色\n",
    "ht()  # 隐藏turtle\n",
    "speed(0)  # 速度，1-10渐进，0最快\n",
    "tracer(0, 0)\n",
    "left(90)  # 左转90度\n",
    "pu()  # 抬笔\n",
    "backward(300)  # 后退300\n",
    "tree(13, 100)  # 递归7层\n",
    "done()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 桃花词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from turtle import *\n",
    "from random import *\n",
    "from math import *\n",
    "def tree(n, l):\n",
    "    setup(1000, 800)\n",
    "    pd()  # 下笔\n",
    "    # 阴影效果\n",
    "    t = cos(radians(heading() + 45)) / 8 + 0.25\n",
    "    pencolor(t, t, t)\n",
    "    pensize(n / 3)\n",
    "    forward(l)  # 画树枝\n",
    "    if n > 0:\n",
    "        b = random() * 15 + 10  # 右分支偏转角度\n",
    "        c = random() * 15 + 10  # 左分支偏转角度\n",
    "        d = l * (random() * 0.25 + 0.7)  # 下一个分支的长度\n",
    "        # 右转一定角度，画右分支\n",
    "        right(b)\n",
    "        tree(n - 1, d)\n",
    "        # 左转一定角度，画左分支\n",
    "        left(b + c)\n",
    "        tree(n - 1, d)\n",
    "        # 转回来\n",
    "        right(c)\n",
    "    else:\n",
    "        # 画叶子\n",
    "        right(90)\n",
    "        n = cos(radians(heading() - 45)) / 4 + 0.5\n",
    "        pencolor(n, n * 0.8, n * 0.8)\n",
    "        circle(3)\n",
    "        left(90)\n",
    "        # 添加0.3倍的飘落叶子\n",
    "        if (random() > 0.7):\n",
    "            pu()\n",
    "            # 飘落\n",
    "            t = heading()\n",
    "            an = -40 + random() * 40\n",
    "            setheading(an)\n",
    "            dis = int(800 * random() * 0.5 + 400 * random() * 0.3 + 200 * random() * 0.2)\n",
    "            forward(dis)\n",
    "            setheading(t)\n",
    "            # 画叶子\n",
    "            pd()\n",
    "            right(90)\n",
    "            n = cos(radians(heading() - 45)) / 4 + 0.5\n",
    "            pencolor(n * 0.5 + 0.5, 0.4 + n * 0.4, 0.4 + n * 0.4)\n",
    "            circle(2)\n",
    "            left(90)\n",
    "            pu()\n",
    "            # 返回\n",
    "            t = heading()\n",
    "            setheading(an)\n",
    "            backward(dis)\n",
    "            setheading(t)\n",
    "    pu()\n",
    "    backward(l)  # 退回\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "bgcolor(0.5, 0.5, 0.5)  # 背景色\n",
    "ht()  # 隐藏turtle\n",
    "speed(0)  # 速度，1-10渐进，0最快\n",
    "tracer(0, 0)\n",
    "pu()  # 抬笔\n",
    "backward(100)\n",
    "left(90)  # 左转90度\n",
    "pu()  # 抬笔\n",
    "backward(300)  # 后退300\n",
    "# tree(12, 100)  # 递归7层\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def writez(x, y, str_, size=56, font=\"华文行楷\"):\n",
    "    gotopos(x, y)\n",
    "    write(str_, font=(font, size))\n",
    "def gotopos(x, y):\n",
    "    up()\n",
    "    goto(x, y)\n",
    "    down()\n",
    "    ht()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "tree(8, 100)  # 递归3层"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "color(\"pink\")\n",
    "s = \"暮晓春来迟，先于百花知\"\n",
    "s2 = \"岁岁种桃花，开在断肠时\"\n",
    "for i in range(len(s)):\n",
    "    writez(360, 130 - i * 30, s[i], 19)\n",
    "for i in range(len(s2)):\n",
    "    writez(420, 130 - i * 30, s2[i], 19)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "done()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:py36] *",
   "language": "python",
   "name": "conda-env-py36-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "185.523px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
