"""python simplest turtle graphics example"""

import turtle

turtle.fd(100)
"""python simple turtle graphics example"""

import turtle

for i in range(4):
    turtle.fd(100)
    turtle.rt(90)


"""python simple turtle graphics example with screen object"""

import turtle

width,height = 480,360

screen = turtle.getscreen()
screen.setup(width,height)
screen.title("Python海龟画正方形程序")

for i in range(4):
    turtle.fd(100)
    turtle.rt(90)

screen.mainloop()


"""python simple turtle graphics example with screen object and new instance of turtle named chinese_loong。
   this program will draw five angle star,这个程序会画一个五角星。
   Python简单的海龟画图示例程序。本程序会新建屏幕对象,并且实例化一个海龟名叫中国龙。

"""

import turtle

width,height = 480,360

screen = turtle.Screen()
screen.setup(width,height)
screen.title("Python海龟画五角星程序")

chinese_loong = turtle.Turtle(shape='turtle')
chinese_loong.color("brown")
chinese_loong.width(4)

for i in range(5):
    chinese_loong.fd(100)
    chinese_loong.rt(144)

screen.exitonclick()


"""python simple turtle graphics example with screen object and new instance of turtle named chinese_loong。
   
   you can move turtle with arrow keys。
   
   Python简单的海龟画图示例程序。本程序会新建屏幕对象,并且实例化一个海龟名叫中国龙。你可以通过按上下左右方向箭头操作海龟移动。

"""

import turtle

def move_left():
    chinese_loong.setheading(180)
    chinese_loong.fd(10)
    
def move_right():
    chinese_loong.setheading(00)
    chinese_loong.fd(10)
    
def move_up():
    chinese_loong.setheading(90)
    chinese_loong.fd(10)
    
def move_down():
    chinese_loong.setheading(-90)
    chinese_loong.fd(10)

width,height = 480,360

screen = turtle.Screen()
screen.bgcolor("black")
screen.delay(0)
screen.setup(width,height)
screen.title("Python海龟画图移动海龟,move turtle with arrow by lixingqiu")

chinese_loong = turtle.Turtle(shape='turtle')
chinese_loong.color("brown")
chinese_loong.width(4)

screen.onkey(move_left,"Left")   # when pressed left arror ,call move_left function
screen.onkey(move_right,"Right")
screen.onkey(move_up,"Up")
screen.onkey(move_down,"Down")

screen.listen()                  # 监听键盘
screen.exitonclick()             # 单击鼠标关闭窗口


"""python simple turtle graphics animation with screen object and new instance of turtle named ball。
   
   ball 's shape is circle,it will move and bounce on edge。
   
   Python简单的海龟画图示例程序。本程序会新建屏幕对象,并且实例化一个海龟名叫ball。
   这个球会移动,并且碰到屏幕边缘会反弹。
   

"""
import random
import turtle
 
width,height = 480,360

screen = turtle.Screen()
screen.bgcolor("black")
screen.delay(10)
screen.setup(width,height)
screen.title("Python海龟画图弹球动画,a bounce ball animation by lixingqiu ")

ball = turtle.Turtle(shape='circle')
ball.penup()
ball.color("cyan")
ball.dx = random.randint(-5,5)   # Custom Property  Horizontal direction of unit displacement
ball.dy = random.randint(-5,5)   # 自定义属性,垂直方向的单位位移量。

while True:
    x = ball.xcor() + ball.dx
    y = ball.ycor() + ball.dy
    ball.goto(x,y)
    if abs(x) > width//2 : ball.dx = -ball.dx
    if abs(y) > height//2 :ball.dy = -ball.dy
 


"""python simple turtle graphics animation with screen object and new instance of turtle named ball。
   
   ball 's shape is circle,it will move and bounce on edge, but use screen ontimer function。
   
   Python简单的海龟画图示例程序。本程序会新建屏幕对象,并且实例化一个海龟名叫ball。
   这个球会移动,并且碰到屏幕边缘会反弹。本程序使用了屏幕的ontimer定时器功能以实现“循环”。
   

"""
import random
import turtle
 
width,height = 480,360

screen = turtle.Screen()
screen.bgcolor("black")
screen.delay(0)
screen.setup(width,height)
screen.title("Python海龟画图弹球动画用screen的ontimer实现 ,a bounce ball animation by lixingqiu ")

ball = turtle.Turtle(shape='circle')
ball.penup()
ball.color("cyan")
ball.dx = random.randint(-5,5)   # Custom Property  Horizontal direction of unit displacement
ball.dy = random.randint(-5,5)   # 自定义属性,垂直方向的单位位移量。

def move():    
    x = ball.xcor() + ball.dx
    y = ball.ycor() + ball.dy
    ball.goto(x,y)
    if abs(x) > width//2 : ball.dx = -ball.dx
    if abs(y) > height//2 :ball.dy = -ball.dy
    screen.ontimer(move,1)        # after on millionsecond,it will call move function.

move()
screen.exitonclick()
 


"""This program will define a Ball class,and it will make a lot of balls.

   本程序会定义一个Ball类,用它会生成很多球。
   
"""
import random
import turtle

class Ball(turtle.Turtle):
    def __init__(self):
        turtle.Turtle.__init__(self,visible=False,shape='circle')
        self.penup()
        self.dx =  random.randint(-5,5)       # Custom Property  Horizontal direction of unit displacement
        self.dy = random.randint(-5,5)        # 自定义属性,垂直方向的单位位移量。
        self.sw = self.screen.window_width()  # screen's width
        self.sh = self.screen.window_height() # screen's height
        self.color("cyan")
        self.st()
        self.move()

    def move(self):
        """移动弹球,move self"""            
        x = self.xcor() + self.dx
        y = self.ycor() + self.dy
        self.goto(x,y)
        if abs(x) > self.sw//2 : self.dx = -self.dx
        if abs(y) > self.sh//2 :self.dy = -self.dy
        self.screen.ontimer(self.move,1)    # after on millionsecond,it will call move function.
            
def main():
    
    width,height = 480,360

    screen = turtle.Screen()
    screen.bgcolor("black")
    screen.delay(0)
    screen.setup(width,height)
    screen.title("Python的turtle之Ball弹球类 ,a bounce Ball class by lixingqiu ")

    [Ball() for i in range(10)]           # 生成10个弹球

    screen.exitonclick()

if __name__ == "__main__":

    main()
     


"""This program will define a Ball class,and it will make a lot of balls.

   本程序会定义一个Ball类,用它会生成很多球。
   
"""
import time
import random
import turtle

class Ball(turtle.Turtle):
    def __init__(self):
        turtle.Turtle.__init__(self,visible=False,shape='circle')
        self.penup()
        self.radius = 10                      # use get_shapepoly() will know its radius
        self.shapesize(2,2)
        self.radius = 10 * 2
        self.dx =  random.randint(-5,5 )       # Custom Property  Horizontal direction of unit displacement
        self.dy = random.randint(-5,5)        # 自定义属性,垂直方向的单位位移量。
        self.sw = self.screen.window_width()  # screen's width
        self.sh = self.screen.window_height() # screen's height
        self.color("cyan")
        self.st()         

    def move(self):
        """移动弹球,move self"""            
        x = self.xcor() + self.dx
        y = self.ycor() + self.dy
        self.goto(x,y)
        self.bounce_on_edge(x,y)
        
    def bounce_on_edge(self,x,y):
        
        if x + self.radius > self.sw//2 or x - self.radius < -self.sw//2 : self.dx = -self.dx
        if y + self.radius > self.sh//2 or y - self.radius < -self.sh//2 : self.dy = -self.dy
            
def main():
    
    width,height = 480,360

    screen = turtle.Screen()
    screen.bgcolor("black")
    screen.delay(0)
    screen.setup(width,height)
    screen.title("Python的turtle之Ball弹球类with while game cycle ,a bounce Ball class by lixingqiu ")

    balls =  [Ball() for i in range(3)]           # 生成10个弹球
    
    while True:
        for ball in balls:
            ball.move()
            time.sleep(0.01)
  

if __name__ == "__main__":

    main()
     


"""This program will define a Ball class,and it will make a lot of balls.
   also will define a Rectangle class ,and operated by mouse .

   本程序会定义一个Ball类,用它会生成很多球。程序还会定义一个矩形类,用鼠标来控制它。
   
"""
import time
import random
import turtle

class Rectangle(turtle.Turtle):
    def __init__(self):
        turtle.Turtle.__init__(self,visible=False,shape='square')
        self.penup()
        self.shapesize(1,10)
        self._width = 200               #  use get_shapepoly() will know its width and height
        self._height = 20
        self.color("white")
        self.goto(0,-150)
        self.st()
        self.screen.cv.bind("<Motion>",self.move)
        
    def move(self,event):
        """conver coordinates,转换鼠标的坐标到海龟画图里的坐标"""
        x, y = (self.screen.cv.canvasx(event.x)/self.screen.xscale,
                        -self.screen.cv.canvasy(event.y)/self.screen.yscale)
        self.setx(x)
        
    
class Ball(turtle.Turtle):
    def __init__(self,board):
        turtle.Turtle.__init__(self,visible=False,shape='circle')
        self.penup()
        self.radius = 10                      # use get_shapepoly() will know its radius
        self.shapesize(2,2)
        self.radius = 10 * 2
        self.dx =  random.randint(-5,5 )       # Custom Property  Horizontal direction of unit displacement
        self.dy = random.randint(-5,5)        # 自定义属性,垂直方向的单位位移量。
        self.sw = self.screen.window_width()  # screen's width
        self.sh = self.screen.window_height() # screen's height
        self.color("cyan")
        self.board = board
        self.st()         

    def move(self):
        """移动弹球,move self"""            
        x = self.xcor() + self.dx
        y = self.ycor() + self.dy
        self.goto(x,y)
        self.bounce_on_edge(x,y)
        self.bounce_on_rect(x,y)
        
    def bounce_on_edge(self,x,y):
        
        if x + self.radius > self.sw//2 or x - self.radius < -self.sw//2 : self.dx = -self.dx
        if y + self.radius > self.sh//2 or y - self.radius < -self.sh//2 : self.dy = -self.dy  
        
    def bounce_on_rect(self,x,y):
        """碰到矩形就反弹"""
        if x > self.board.xcor() - self.board._width//2 and x < self.board.xcor() + self.board._width//2 :
            if y - self.radius <=  self.board.ycor() + self.board._height//2 :  self.dy = -self.dy
      
            
def main():
    
    width,height = 480,460

    screen = turtle.Screen()
    screen.bgcolor("black")
    screen.delay(0)
    screen.setup(width,height)
    screen.title("Python的turtle之Ball弹球类with while game cycle ,a bounce Ball class by lixingqiu ")

    board =   Rectangle()
    balls =  [Ball(board) for i in range(3)]           # 生成3个弹球    
    
    while True:
        for ball in balls:
            ball.move()
            time.sleep(0.01)
  

if __name__ == "__main__":

    main()