我目前正在完成大学任务。我们第一学期一直在使用John Zelle的graphics.py
模块。
任务是构建两个不同的模式,然后将它们放在特定的设计中,根据窗口是500 x 500, 700 x 700 or 900 x 900
像素自动调整。
我已完成任务,但是,我的代码中很大一部分效率很低而且很长,因此不是理想的。
下面是长而低效的代码:
def DrawPattern(width,size,win,colour):
if size == 5:
for x in range(0,width,100):
drawCircleExpanse(win,x,400,colour)
for j in range(100,400,100):
drawCircleExpanse(win,j,300,colour)
drawCircleExpanse(win,200,200,colour)
for j in range(100,400,100):
drawCircleExpanse(win,j,100,colour)
for x in range(0,width,100):
drawCircleExpanse(win,x,0,colour)
if size == 7:
for x in range(0,width,100):
drawCircleExpanse(win,x,width-100,colour)
for j in range(100,width-100,100):
drawCircleExpanse(win,j,width-200,colour)
for i in range(200,width-200,100):
drawCircleExpanse(win,i,width-300,colour)
drawCircleExpanse(win,300,300,colour)
for j in range(100,width-100,100):
drawCircleExpanse(win,j,100,colour)
for x in range(0,width,100):
drawCircleExpanse(win,x,0,colour)
for i in range(200,width-200,100):
drawCircleExpanse(win,i,width-500,colour)
if size == 9:
for x in range(0,width,100):
drawCircleExpanse(win,x,width-100,colour)
for j in range(100,width-100,100):
drawCircleExpanse(win,j,width-200,colour)
for i in range(200,width-200,100):
drawCircleExpanse(win,i,width-300,colour)
for y in range(300,width-300,100):
drawCircleExpanse(win,y,width-400,colour)
drawCircleExpanse(win,400,400,colour)
for j in range(100,width-100,100):
drawCircleExpanse(win,j,100,colour)
for x in range(0,width,100):
drawCircleExpanse(win,x,0,colour)
for i in range(200,width-200,100):
drawCircleExpanse(win,i,width-700,colour)
for y in range(300,width-300,100):
drawCircleExpanse(win,y,width-600,colour)
size
变量获取用户的输入;例如5, 7 or 9
。这转换为500 x 500, 700 x 700 or 900 x 900
。与colour
类似,只会将颜色更改为用户选择之一。
此代码将生成以下模式,其大小为5
,转换为500 x 500
:
构造模式本身的drawCircleExpanse
函数包含以下代码:
def drawCircleExpanse(win,x,y,colour):
rad = 50
for c in range(10):
circle = Circle(Point(50+x,(50+(c * 10) / 2)+y), rad)
circle.setOutline(colour)
circle.draw(win)
rad -= 5
如果有人可以协助缩短我的大量代码,我将非常感激。
答案 0 :(得分:1)
我同意这可能更适合代码审查,但有两个想法可以帮助你:
size
的每个值,中心元素drawCircleExpanse
之前和之后的行数(for循环)为floor(size/2)
。由于您可以计算行数,因此可以使用另一个循环嵌套行循环。在中心元素draw...
调用之前和之后使用嵌套循环意味着您可以完全摆脱if
语句。drawCircleExpanse
,因此drawCircleExpanse
的坐标位于虚拟网格而不是屏幕像素上。如果需要,本地化网格到像素的转换还可以让您更灵活地在以后更改转换。答案 1 :(得分:0)
为什么你不让电脑为你做数学计算?对于size == 5
,这是重构的第一步:
x_list = range(0, 500, 100) + \
range(100, 400, 100) + \
[200] + \
range(100, 400, 100) + \
range(0, 500, 100)
y_list = [400] * 5 + \
[300] * 3 + \
[200] + \
[100] * 3 + \
[0] * 5
def drawCircleExpanse(win, x, y, colour):
print "%3d, %3d" % (x, y)
win = None
colour = None
for x, y in zip(x_list, y_list):
drawCircleExpanse(win, x, y, colour)
<强>输出强>
0, 400
100, 400
200, 400
300, 400
400, 400
100, 300
200, 300
300, 300
200, 200
100, 100
200, 100
300, 100
0, 0
100, 0
200, 0
300, 0
400, 0
您应该可以使用size
创建x_list
和y_list
来进一步重构此内容。
答案 2 :(得分:0)
如果有人可以协助缩短我的意见,我将非常感激 大量代码。
这是否足够短:
from graphics import *
RADIUS = 50
NUMBER_CIRCLES = 10
DECREMENT = RADIUS // NUMBER_CIRCLES
def drawCircleExpanse(win, x, y, colour):
for radius in range(RADIUS, 0, -DECREMENT):
circle = Circle(Point(RADIUS + x, (2 * RADIUS - radius) + y), radius)
circle.setOutline(colour)
circle.draw(win)
def DrawPattern(width, size, win, colour):
for y in range(size, 0, -2): # 5 3 1
for x in range(width // 2 - y * RADIUS, width // 2 + y * RADIUS, RADIUS * 2):
drawCircleExpanse(win, x, width // 2 - y * RADIUS, colour)
if y > 1:
drawCircleExpanse(win, x, width // 2 + (y - 2) * RADIUS, colour)
win = GraphWin("Optimize Drawing", 700, 700)
DrawPattern(700, 7, win, "red")
win.getMouse()
win.close()
我认为你做得比必要复杂得多。以上内容也适用于&#39; 3&#39; (和300)以及可能超过5,7和5的其他值。 9.调整我留给你的轻微窗边(铬)宽度有一点问题。