003-Paint_FreePythonGames_Complete

Posted luoxun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了003-Paint_FreePythonGames_Complete相关的知识,希望对你有一定的参考价值。

一 代码

此次把代码中画三角形和矩形的内容补充完全了,不过三角形只能实现画正三角形;代码最后一部分还是每弄懂,有点头疼。

  1 """Paint, for drawing shapes.
  2 
  3 Exercises
  4 
  5 1. Add a color.
  6 2. Complete circle.
  7 3. Complete rectangle.
  8 4. Complete triangle.
  9 5. Add width parameter.
 10 
 11 """
 12 
 13 from turtle import *                   # 导入turtle库
 14 from freegames import vector           # 这句没太搞明白?大概是引入向量?
 15 
 16 def line(start, end):                  # 定义一个画一条线的函数,参数类型只能是向量
 17     "Draw line from start to end."
 18     penup()                            # 画笔提起操作
 19     goto(start.x, start.y)             # 将画笔移动到起点坐标为(x,y)的位置
 20     pendown()                          # 画笔放下操作
 21     goto(end.x, end.y)                 # 将画笔移动到终点坐标为(x,y)的位置
 22 
 23 def square(start, end):                # 定义一个画正方形的函数,参数类型只能是向量
 24     "Draw square from start to end."
 25     up()                               # 画笔提起操作
 26     goto(start.x, start.y)             # 将画笔移动到起点坐标为(x,y)的位置
 27     down()                             # 画笔放下操作
 28     begin_fill()                       # 准备开始填充图形
 29 
 30     for count in range(4):             # 循环4次,用于画矩形
 31         forward(end.x - start.x)       # 向当前画笔方向移动一段距离,该距离是第二次点击鼠标所在位置的横坐标减去第一次点击鼠标所在位置的横坐标
 32         left(90)                       # 调整画笔方向:逆时针移动90°
 33 
 34     end_fill()                         # 填充图形结束
 35 
 36 def paint_circle(start, end):          # 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆
 37     "Draw circle from start to end."
 38     up()                               # 画笔提起操作
 39     goto(start.x,start.y)              # 将画笔移动到起点坐标为(x,y)的位置
 40     down()                             # 画笔放下操作
 41     begin_fill()                       # 准备开始填充图形
 42     fillcolor("pink")                  # 将填充颜色设置为粉色
 43     radius = end.x - start.x           # 圆的半径是第二次点击屏幕所在位置的横坐标减去第一次点击屏幕所在位置的横坐标
 44     circle(radius)                     # radius为正,逆时针画一个半径为radius的圆;radius为负,顺时针画一个半径为radius的圆
 45     end_fill()                         # 填充图形结束
 46     # pass # TODO                      # 内容需要自己补充
 47 
 48 def rectangle(start, end):             # 画矩形框
 49     "Draw rectangle from start to end."
 50     up()                               # 画笔提起操作
 51     goto(start.x,start.y)              # 将画笔移动到起点坐标为(x,y)的位置
 52     down()                             # 画笔放下操作
 53     begin_fill()                       # 准备开始填充图形
 54     
 55     fillcolor("purple")                # 将填充颜色设置为紫色
 56     for count in range(2):             # 循环2次,用于画矩形
 57         forward(end.x-start.x)         # 向当前画笔方向移动一段距离
 58         left(90)                       # 调整画笔方向:逆时针移动90°
 59         forward(end.y-start.y)         # 向当前画笔方向移动一段距离
 60         left(90)                       # 调整画笔方向:逆时针移动90°
 61     
 62     end_fill()
 63     # pass  # TODO
 64 
 65 def triangle(start, end):              # 画三角形
 66     "Draw triangle from start to end."
 67     up()                               # 画笔提起操作
 68     goto(start.x,start.y)              # 将画笔移动到起点坐标为(x,y)的位置
 69     down()                             # 画笔放下操作
 70     begin_fill()                       # 准备开始填充图形
 71     
 72     fillcolor("blue")                  # 将填充颜色设置为蓝色
 73     for count in range(3):             # 循环3次,用于画正三角形
 74         forward(end.x-start.x)         # 向当前画笔方向移动一段距离,该距离是第二次点击鼠标所在位置的横坐标减去第一次点击鼠标所在位置的横坐标
 75         left(120)                      # 调整画笔方向:逆时针移动120°
 76     
 77     end_fill()                         # 填充图形结束
 78     #pass  # TODO
 79 
 80 def tap(x, y):                         # 用来存储鼠标的初始位置或者要画的图形
 81     "Store starting point or draw shape."
 82     start = state[start]
 83 
 84     if start is None:
 85         state[start] = vector(x, y)   # 将字典中‘start‘初始化为一个向量
 86     else:
 87         shape = state[shape]          # 将字典中‘shape‘的值赋给shape变量
 88         end = vector(x, y)              # 定义画图结束位置的向量
 89         shape(start, end)               # 调用shape变量对应的函数绘制图形
 90         state[start] = None           # 将start字典的‘start‘元素值重置为None
 91 
 92 def store(key, value):
 93     "Store value in state at key."
 94     state[key] = value
 95 
 96 state = {start: None, shape: rectangle}# 定义一个字典类型state变量用来告诉程序要绘制什么图形
 97 setup(500, 500, 500,0)                  # 设置画布初始位置
 98 onscreenclick(tap)                      # 可能这句代码的意思是每次在画布上敲击鼠标,都调用一次tap函数;
 99                                         # 第一次敲击鼠标调用tap函数后,将画笔的起点位置状态由None改变为一个向量vector(x, y)
100                                         # 第二次敲击鼠标调用tap函数后,在tap函数内部调用shape值对应的函数进行画图
101 listen()
102 onkey(undo, u)                            # 撤销上一个turtle动作
103 onkey(lambda: color(black), K)
104 onkey(lambda: color(white), W)          # 暂时没搞懂这些代码啥意思,注释掉也不影响程序运行
105 onkey(lambda: color(green), G)
106 onkey(lambda: color(blue), B)
107 onkey(lambda: color(red), R)
108 onkey(lambda: store(shape, line), l)
109 onkey(lambda: store(shape, square), s)
110 onkey(lambda: store(shape, circle), c)
111 onkey(lambda: store(shape, rectangle), r)
112 onkey(lambda: store(shape, triangle), t)
113 
114 done()                                        #  必须是乌龟图形程序中的最后一个语句。

代码101~112行的内容不太清楚作用,网上查不到太多关于onkey的内容,lambda表达式刚了解到,在这里好像就只是为了返回表达式中调用color函数和store函数的执行结果,但这个结果返回给onkey函数后,我就不知道onkey函数是干什么用的了,执行程序的时候也没有体现出来这段代码的作用,就很头疼,有没有帮忙大佬解释一下!!!

以上是关于003-Paint_FreePythonGames_Complete的主要内容,如果未能解决你的问题,请参考以下文章