螺旋线
from turtle import *
myTurtle = Turtle()
myWin = myTurtle.getscreen()
def drawSpiral(myTurtle, lineLen):
if lineLen > 0:
myTurtle.forward(lineLen)
myTurtle.right(90)
drawSpiral(myTurtle,lineLen - 5)
drawSpiral(myTurtle,300)
myWin.exitonclick()
分形树
def tree(branchLen ,t):
if branchLen >5:
t.forward(branchLen)
t.right(20)
tree(branchLen-15, t)
t.left(40)
tree(branchLen - 10, t)
t.right(20)
t.backward(branchLen)
t = Turtle()
myWin = t.getscreen()
t.left(90)
t.up()
t.backward(300)
t.down()
t.color("green")
tree(110,t)
myWin.exitonclick()
汉洛塔
def moveTower(height, fromPole, toPole, withPole):
if height >= 1:
moveTower(height - 1, fromPole, withPole, toPole)
print("将" + fromPole + "移动到" + toPole)
moveTower(height - 1, withPole, toPole, fromPole)
moveTower(3,"1","2","3")
探索迷宫
import turtle
from turtle import *
PART_OF_PATH = 'O'
TRIED = '.'
OBSTACLE = '+'
DEAD_END = '-'
def searchFrom(maze, startRow, startColumn):
maze.updatePosition(startRow, startColumn)
if maze[startRow][startColumn] == OBSTACLE:
return False
if maze[startRow][startColumn] == TRIED:
return False
maze.mazelist[startRow][startColumn] = TRIED
if maze.isExit(startRow,startColumn):
maze.updatePosition(startRow, startColumn, PART_OF_PATH)
return True
found = searchFrom(maze, startRow - 1, startColumn) or \
searchFrom(maze, startRow + 1, startColumn) or \
searchFrom(maze, startRow, startColumn + 1) or \
searchFrom(maze, startRow , startColumn -1)
if found:
maze.updatePosition(startRow,startColumn, PART_OF_PATH)
else:
maze.updatePosition(startRow,startColumn,DEAD_END)
return found
class Maze:
def __init__(self, mazeFileName):
columnsInMaze = 0
self.mazelist = []
mazeFile = open(mazeFileName,"r")
rowsInMaze = 0
for line in mazeFile:
rowList = []
col = 0
for ch in line[:-1]:
rowList.append(ch)
if ch == "S":
self.startRow = rowsInMaze
self.startCol = col
col =col +1
rowsInMaze = rowsInMaze + 1
self.mazelist.append(rowList)
columnsInMaze = len(rowList)
self.rowsInMaze = rowsInMaze
self.columnsInMaze = columnsInMaze
self.xTranslate = -columnsInMaze / 2
self.yTranslate = rowsInMaze / 2
self.t = Turtle(shape='turtle')
setup(width=600, height=600)
setworldcoordinates(-(columnsInMaze - 1) / 2 - .5,
-(rowsInMaze - 1) / 2 - .5,
(columnsInMaze - 1) / 2 + .5,
(rowsInMaze - 1) / 2 + .5)
def drawMaze(self):
for y in range(self.rowsInMaze):
for x in range(self.columnsInMaze):
if self.mazelist[y][x] == OBSTACLE:
self.drawCenteredBox(x + self.xTranslate,
-y + self.yTranslate,
'tan')
self.t.color('black', 'blue')
def drawCenteredBox(self, x, y, color):
tracer(0)
self.t.up()
self.t.goto(x - .5, y - .5)
self.t.color('black', color)
self.t.setheading(90)
self.t.down()
self.t.begin_fill()
for i in range(4):
self.t.forward(1)
self.t.right(90)
self.t.end_fill()
update()
tracer(1)
def moveTurtle(self, x, y):
self.t.up()
self.t.setheading(self.t.towards(x + self.xTranslate,
-y + self.yTranslate))
self.t.goto(x + self.xTranslate, -y + self.yTranslate)
def dropBreadcrumb(self, color):
self.t.dot(color)
def updatePosition(self, row, col, val=None):
if val:
self.mazelist[row][col] = val
self.moveTurtle(col, row)
if val == PART_OF_PATH:
color = 'green'
elif val == OBSTACLE:
color = 'red'
elif val == TRIED:
color = 'black'
elif val == DEAD_END:
color = 'red'
else:
color = None
if color:
self.dropBreadcrumb(color)
def isExit(self, row, col):
return (row == 0 or
row == self.rowsInMaze - 1 or
col == 0 or
col == self.columnsInMaze - 1)
def __getitem__(self, idx):
return self.mazelist[idx]
x = Maze("123")
x.drawMaze()
searchFrom(x,5,1)
++++++++++++++++++++++
+ + ++ ++ + +
+ + + +++ + ++
+ + + ++ ++++ + ++
+++ ++++++ +++ + +
+ ++ ++ +
+++++ ++++++ +++++ +
+ + +++++++ + +
+ +++++++ S + +
+ + +++
++++++++++++++++++ +++