Python / Turtle - 如何在列表

时间:2015-08-29 10:29:42

标签: python turtle-graphics

我是一个完整的Python新手,我的任务是创建一个函数,将图标绘制成龟中的网格(900x600网格,5列和4行,每个正方形为150x150像素)。图标的类型,位置和方向必须基于数据集中的4个给定变量。该函数必须能够解释以下形式的数据集:

data_set = [icon_style, bottom_left_column, bottom_left_row, orientation]

一个完整数据集的示例,它绘制了4个图标,如下所示:

data_set_03 = [['A', 1, 0, 'N'], ['C', 2, 1, 'E'], ['A', 3, 2, 'S'], ['A', 4, 3, 'W']]

意味着第一个图标是A类型,在第1列,第0行,朝北。第二个图标是C类型,在第2列第1行绘制,面向东方。等等,用于该列表中的所有4个图标。

为了解决这个挑战,首先我定义了一个函数来解释列表并创建4个变量,这些变量稍后将被绘制图标的函数使用

def read_icons(w,x,y,z):
    if w == 'A':              
        icon = icon_01            
    elif w == 'B':           
        icon = icon_02
   elif w == 'C':
        icon = icon_03
    elif w == 'D':
        icon = icon_04


    if x == 0:
        x_coord = -450
    elif x == 1:
        x_coord = -300
    elif x == 2:
        x_coord = -150
    elif x == 3:
        x_coord = 0
    elif x == 4:
        x_coord = 150
    elif x == 5:
        x_coord = 300



    if y == 0:
        y_coord = -300
    elif y == 1:
        y_coord = -150
    elif y == 2:
        y_coord = 0
    elif y == 3:
        y_coord = 150



    if z == 'N':
        heading = 90
    elif z == 'E':
        heading = 0
    elif z == 'S':
       heading = 270
    elif z == 'W':
        heading = 180

最后,我在函数末尾添加了这个以测试绘图 - 我计划稍后将其移动到我的draw_icons函数中

   icon()
   read_icons(*data_set_01)

icon()告诉函数绘制图标,所以我可以看到它是否正确绘制,read_icons(* data_set_01)执行基于data_set_01的整个函数

这在绘制任何SINGLE图标时效果很好,正确的图标以正确的方向绘制在正确的位置。这适用于任何数据集,例如

  data_set_01 = ['B', 1, 2, 'N']

仅绘制1个图标。

但是,我的问题是当我尝试使用包含多个图标信息的数据集时,例如

data_set_03 = [['A', 1, 0, 'N'], ['C', 2, 1, 'E'], ['A', 3, 2, 'S'], ['A', 4, 3, 'W']]

我遇到了一大堆错误。

以下是我创建draw_icons函数的最佳尝试,使用for循环为每个子列表运行read_icons()函数一次:

def draw_icons(data_set):
   for sublist in data_set:
     read_icons(*data_set)
     penup()
     goto(x_coord, y_coord)
     setheading(heading)
     pendown()
     icon()


draw_icons(data_set_03)

但是,此代码会导致错误:

 goto(x_coord, y_coord)
 NameError: global name 'x_coord' is not defined

当使用仅有1个图标的变量时,我的x_coord没有被定义的问题。

我的第二次尝试是尝试删除for循环并在每个子列表1上明确地运行read_icons:

def draw_icons(data_set):
read_icons(*data_set[0])
penup()
goto(x_coord, y_coord)
setheading(heading)
pendown()
icon()

read_icons(*data_set[1])
penup()
goto(x_coord, y_coord)
setheading(heading)
pendown()
icon()

read_icons(*data_set[2])
penup()
goto(x_coord, y_coord)
setheading(heading)
pendown()
icon()

read_icons(*data_set[3])
penup()
goto(x_coord, y_coord)
setheading(heading)
pendown()
icon()

然而遇到同样的错误。

我希望draw_icons(data_set_03)的工作原理如下:

对于data_set_03的第一个子列表,即:[' A',1,0,' N'],根据规则定义w,x,y和z read_icons(),然后根据这些变量绘制图标。

接下来,转到data_set_03的第二个子列表,即:[' C',2,1,' E'],重新定义w,x,y和z根据read_icons()的规则,根据这些变量绘制下一个图标。

冲洗并重复下列清单3和4,直到正确绘制所有4个图标。

我认为data_set_03分为以下子列表是否正确?

sublist 0 = ['A', 1, 0, 'N'] 
sublist 1 = ['C', 2, 1, 'E']
sublist 2 = ['A', 3, 2, 'S']
sublist 3 = ['A', 4, 3, 'W']

如果是这样,为什么我的for循环不从第一个子列表生成4个变量,绘制图标,然后用第二个子列表中的新值覆盖4个变量,然后绘制第二个图标等等。

我接近这个完全错了吗?这是一个初学者的任务,因此产生正常运行的代码是唯一的要求,无论它多么丑陋。我还不需要优雅或简洁。这是我完成挑战的诚实尝试,但此时遇到了障碍。

对此有任何帮助或见解将不胜感激!

0 个答案:

没有答案