-2

我目前正在完成大学作业。第一学期我们一直在使用 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

如果有人可以帮助缩短我的大量代码块,我将不胜感激。

4

3 回答 3

1

我同意这可能更适合 codereview,但有两个想法可以帮助你:

  • 对于 的每个值size,中心元素前后的行数(for 循环)drawCircleExpansefloor(size/2)。由于您可以计算行数,因此您可以使用另一个循环,其中嵌套了行循环。在中心元素调用之前和之后使用嵌套循环draw...意味着您可以完全摆脱if语句。
  • 为了使代码更易于阅读,我实际上会将 100 的因子移动到drawCircleExpanse,以便坐标drawCircleExpanse位于假想网格上而不是屏幕像素上。本地化网格到像素的转换还可以让您更灵活地在以后根据需要更改该转换。
于 2016-12-07T18:26:40.540 回答
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_listy_list.

于 2016-12-07T18:51:08.660 回答
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()

我认为你让它变得比必要的复杂得多。以上也适用于“3”(和 300)以及可能超过 5、7 和 9 的其他值。调整我留给您的轻微窗口边框(chrome)宽度有一个小问题。

在此处输入图像描述

于 2017-02-08T08:54:52.747 回答