1 说明
====
1.1 turtle库:海龟库,是python3的内置库。
1.2 我已经做了初步介绍:
《Turtle海龟库:python3内置简单却很强大的绘图库》
1.3 今天来介绍几个高级例子,顺带学习turtle绘图相关知识和python的相关知识,代码讲解清楚,注释仔细,小白秒懂,干货满满,适合收藏。
2 内容
=====
2.1 转动的太极
2.2 贪食蛇
2.3 国画:
2.4 国际象棋棋盘
3 转动太极的代码
#文章来源#旋转的太极import turtle as t t.bgcolor('gray')t.title('转动的太极')# radius可以看作半径,extent是角度# fc是填充的颜色,默认为白色。# 每次画完圆之后都会回到原点。#定义函数圆def yuan(radius, extent=None, fc='white'): # setheading是保证当次循环是同一朝向。 t.setheading(dd) t.forward(radius) t.left(90) t.down() t.fillcolor(fc) t.begin_fill() t.circle(radius, extent) t.end_fill() t.up() t.right(90) t.back(radius) a = 8dd = a#隐藏笔头t.hideturtle()while True: t.goto(0, 0) t.tracer(0, 0) # 画个黑半圆, yuan(200, extent=180, fc='black') # 画个白半圆。 yuan(200, extent=-180) # 向前100,画个黑半圆。 t.forward(100) yuan(100, extent=-180, fc='black') # 向后200,画个白半圆。 t.back(200) yuan(100, extent=180) # 顺便画个小黑圆,比白圆大点是因为白圆还有边框,显得大。 yuan(33, fc='black') # 向后200,画个小白圆。要问我为什么不是向前200,因为我试出来的233333 t.back(200) yuan(30) # 延时10毫秒,不加这句的话,因为tracer(0,0)是画完才显示,会导致一直啥都画不出来。 t.tracer(1, 10) # 然后下次循环的goto在tracer(0,0)之前这个很有讲究。这相当于是tracer dd += a if dd > 360: dd -= 360
4 贪食蛇的代码
#文章来源# turtle import *import timeimport randomtracer(10000000,0)#正方形框大小与蛇大小、水果大小绑定size=1000#蛇的速度snakeSpeed=5stepNum=20stepSize=size/stepNumpoints=0direction=0snakeLen=4snake="0,0|-1,0|-2,0|-3,0|"fruit=[1,1]getFruit=FalsesleepTime=1/snakeSpeed#窗口大小设置setup(1200,1200)def getSnake(barNum):barCount=0STR=""x=0;y=0for i in range(len(snake)):if barCount==barNum:j=iwhile snake[j]!=',':STR+=snake[j]j+=1x=int(STR)j+=1STR=""while snake[j]!='|':STR+=snake[j]j+=1y=int(STR)breakif snake[i]=='|':barCount+=1return [x,y]def move():newSnake=""if direction==0:readReturn=getSnake(0)newSnake+=str(readReturn[0]+1); newSnake+=","; newSnake+=str(readReturn[1]); newSnake+="|"for i in range(snakeLen-1):readReturn=getSnake(i)newSnake+=str(readReturn[0]); newSnake+=","; newSnake+=str(readReturn[1]); newSnake+="|"if direction==1:readReturn=getSnake(0)newSnake+=str(readReturn[0]); newSnake+=","; newSnake+=str(readReturn[1]-1); newSnake+="|"for i in range(snakeLen-1):readReturn=getSnake(i)newSnake+=str(readReturn[0]); newSnake+=","; newSnake+=str(readReturn[1]); newSnake+="|"if direction==2:readReturn=getSnake(0)newSnake+=str(readReturn[0]-1); newSnake+=","; newSnake+=str(readReturn[1]); newSnake+="|"for i in range(snakeLen-1):readReturn=getSnake(i)newSnake+=str(readReturn[0]); newSnake+=","; newSnake+=str(readReturn[1]); newSnake+="|"if direction==3:readReturn=getSnake(0)newSnake+=str(readReturn[0]); newSnake+=","; newSnake+=str(readReturn[1]+1); newSnake+="|"for i in range(snakeLen-1):readReturn=getSnake(i)newSnake+=str(readReturn[0]); newSnake+=","; newSnake+=str(readReturn[1]); newSnake+="|"if getFruit==True:readReturn=getSnake(snakeLen-2)newSnake+=str(readReturn[0]); newSnake+=","; newSnake+=str(readReturn[1]); newSnake+="|"return newSnakedef drawSnake(clr):pensize(stepSize-2)readReturn=getSnake(0)penup()goto(readReturn[0]*stepSize,readReturn[1]*stepSize,)pendown()for i in range(snakeLen):readReturn=getSnake(i)goto(readReturn[0]*stepSize,readReturn[1]*stepSize,)penup()def check():readReturn=getSnake(0)global getFruitgetFruit=Falsesnkl=snakeLenfor i in range(snakeLen-1):readReturn1=getSnake(i+1)if readReturn[0]==readReturn1[0] and readReturn[1]==readReturn1[1]:#hit selftime.sleep(2)bye()if readReturn[0]>stepNum/2 or readReturn[1]>stepNum/2 or readReturn[0]
5 国画的代码
"""author:魏振东data:2019.10.25func:绘制创意图形"""#画梅花诗画from turtle import *from random import *title('国画')#画雪花def drawSnow(): hideturtle() pensize(2) for i in range(20): pencolor("white") penup() setx(randint(-640,640)) sety(randint(-400,400)) pendown() dens=randint(8,12) snowsize=randint(10,14) for j in range(dens): forward(snowsize) backward(snowsize) right(360/dens)# 位移函数def gotopos(x, y): up() goto(x, y) down() ht()def apply_rules(path, rules): L = [_ for _ in path] for i in range(len(L)): symbol = L[i] if symbol == 'F': L[i] = rules[symbol] if symbol == 'X': L[i] = rules[symbol] path = ''.join(L) return pathdef draw_path(path): posList, angleList = [], [] for symbol in path: if symbol == 'F': forward(length) elif symbol == '+': left(angle) elif symbol == '-': rt(angle) elif symbol == '[': posList.append(pos()) angleList.append(heading()) elif symbol == 'a': pensize(3) color("black") elif symbol == 'b': pensize(2) color("black") elif symbol == 'c': pensize(2) color("black") elif symbol == ']': up() home() goto(posList.pop()) left(angleList.pop()) down()# 写字def writez(x, y, str_, size=16, font="Arial"): gotopos(x, y) write(str_, font=(font, size))# 画布setup(1280, 800)speed(5)bgcolor("Silver")# 题字color("black")writez(-213, -210, "梅", 16)writez(-50, 100, "宋")writez(80, 20, "王")writez(33, -30, "安", 16)writez(-18, -95, "石", 16)# 写诗color("black")s1 = "墙角数枝梅"s2 = "凌寒独自开"s3 = "遥知不是雪"s4 = "为有暗香来"for i in range(len(s1)): writez(560, 350 - i * 50, s1[i], 16)for i in range(len(s2)): writez(510, 320 - i * 50, s2[i], 16)for i in range(len(s3)): writez(460, 290 - i * 50, s3[i], 16)for i in range(len(s4)): writez(410, 260 - i * 50, s4[i], 16)# 画雪drawSnow()# 画梅gotopos(249, -26)speed(0)gotopos(-650, -100)length = 6path = 'F'angle = 27rules = { 'F': 'aFF[b-F++F][c+F--F]c++F--F', 'X': 'aFF+[b+F]+[c-F]'}for _ in range(4): path = apply_rules(path, rules)draw_path(path)done()
6 国际象棋棋盘绘制的代码
#国际象棋棋盘import turtle as t cube_line=50t.pu()t.goto(-200,-200)t.pd()for i in range(8): #一共有八列 for j in range(8):#每一行有八个格 t.forward(cube_line) if j % 2 == 0:#判断是否为第奇数个格(是否画黑色格) if i % 2 ==0:#判断是否为奇数行(调整画黑色正方形时小海龟的转向) t.begin_fill()#开始填充 for s in range(4):#画正方形 t.left(90) t.forward(cube_line) t.end_fill()#结束填充 else :#如果为偶数行,则小海龟画正方形时不断向右转向 t.begin_fill() for s in range(4): t.right(90) t.forward(cube_line) t.end_fill() if i % 2 == 0:#一行画完之后,判断小海龟该向哪个方向转向,从而画下一行 t.left(90) t.forward(cube_line) t.left(90) else: t.right(90) t.forward(cube_line) t.right(90)t.forward(8*cube_line)#画完最后一行时,补齐上方边线,8条边t.done()
7 代码来源网络,仅供学习,如有侵权请联系,定删。