下面的代码是3个函数和一个while循环来调用这些函数:
draw_rect():根据给定的参数绘制一个矩形
draw_circle():根据给定参数绘制一个圆圈
draw_line():根据给定参数绘制一条线
我的所有功能都能正常工作,并且可以读取只有矩形,只有行或只有圆圈的文本文件。
我在底部的循环是我遇到麻烦的地方。我有一个带有矩形和圆圈的文件,最终是一个python徽标。我无法弄清楚在while循环中需要做什么同时执行正确的函数。任何帮助将非常感激。我已经使用了.xt实现了txt文件的样本。
颜色为蓝色
圈-30 0 80
圈0 30 80
黄色
圈30 0 80
圈0 -30 80
颜色为蓝色
rect -84 55 60 110
rect -84 55 25 120
rect -30 80 88 82
颜色黑色
圈-20 -35 38
黄色
圈圈-20 -35 32
颜色黑色
rect -58 -40 5 100
def draw_rect():
smart = turtle.Turtle()
i=0
while i < len(file_list):
if file_list[i] != "":
rect = file_list[i]
if rect[0] != 'rect':
return i
else:
color = str(rect[1])
x_coordinate = int(rect[2])
y_coordinate = int(rect[3])
width = int(rect[4])
height = int(rect[5])
smart.penup()
smart.fillcolor(color)
smart.begin_fill()
smart.goto(x_coordinate, y_coordinate)
smart.setheading(0)
smart.pendown()
smart.forward(width)
smart.right(90)
smart.forward(height)
smart.right(90)
smart.forward(width)
smart.right(90)
smart.forward(height)
smart.end_fill()
i += 1
return i
def draw_circle():
smart = turtle.Turtle()
i=0
while i < len(file_list):
if file_list[i] != "":
circ = file_list[i]
if circ[0] != 'circle':
return i
else:
color = str(circ[1])
x_coordinate = int(circ[2])
y_coordinate = int(circ[3])
radius = int(circ[4])
smart.penup()
smart.fillcolor(color)
smart.begin_fill()
smart.goto(x_coordinate, y_coordinate)
smart.setheading(0)
smart.pendown()
smart.circle(radius)
smart.end_fill()
i += 1
return i
def draw_line():
smart = turtle.Turtle()
i=0
while i < len(file_list):
if file_list[i] != "":
star = file_list[i]
if start[0] != 'line':
return i
else:
color = str(star[1])
x_coordinate = int(star[2])
y_coordinate = int(star[3])
angle = int(star[4])
line_length = int(star[5])
smart.penup()
smart.color(color)
smart.goto(x_coordinate, y_coordinate)
smart.setheading(angle)
smart.pendown()
smart.forward(line_length)
i += 1
return i
import turtle
turtle.speed(0)
file = input("What file would you like to execute?")
turtle.clearscreen()
with open(str(file),'r') as f:
file_list = []
for line in f:
if line == '\n':
continue
l = line.split()
if l[0].lower() == 'color':
color = l[1].lower()
else:
file_list.append([l[0].lower()] + [color] + l[1:])
print(file_list[0:])
n = 0
i = 0
while n < len(file_list):
n = n + i
while file_list[n] != "":
parameter = file_list[n]
print(parameter[0])
if parameter[0] != 'line' or parameter[0] != 'circle':
draw_rect()
elif parameter[0] != 'line' or parameter[0] != 'rect':
draw_circle()
elif parameter[0] != 'circle' or parameter[0] != 'rect':
draw_line()
print("Program complete")
答案 0 :(得分:1)
你的逻辑错了:
if parameter[0] != 'line' or parameter[0] != 'circle':
draw_rect()
elif parameter[0] != 'line' or parameter[0] != 'rect':
draw_circle()
elif parameter[0] != 'circle' or parameter[0] != 'rect':
draw_line()
您的意思是and
而不是or
。假设参数是'circle'。当行
if parameter[0] != 'line' or parameter[0] != 'circle':
draw_rect()
执行,参数不等于'line',因此执行draw_rect
。第二个条款从未被评估过。
但这是奇怪的代码。你为什么不把它改成
if parameter[0] =='rect':
draw_rect()
elif parameter[0] == 'circle':
draw_circle()
elif parameter[0] == 'line':
draw_line()
当然这更清楚了吗?
编辑:我重新组织了代码,我认为你会同意它更容易理解。它当然更短。最大的变化是 1)将绘图参数作为参数传递给绘图函数,而不是将它们保存在全局数组中。
2)使用迭代器处理文件中的行:for line in file
这样,您不必弄乱索引或担心有多少行。
3)注意我如何将行中的条目转换为整数,例如x, y, width, height = map(int, line[1:])
有些人不喜欢
map
。他们会写类似
x,y,width,height == [int(item) for item in line[1:]]
无论漂浮在你的船上。
import turtle
def draw_rect(color, x, y, width, height):
smart.penup()
smart.fillcolor(color)
smart.begin_fill()
smart.goto(x, y)
smart.setheading(0)
smart.pendown()
smart.forward(width)
smart.right(90)
smart.forward(height)
smart.right(90)
smart.forward(width)
smart.right(90)
smart.forward(height)
smart.end_fill()
def draw_circle(color, x, y, radius):
smart.penup()
smart.fillcolor(color)
smart.begin_fill()
smart.goto(x, y)
smart.setheading(0)
smart.pendown()
smart.circle(radius)
smart.end_fill()
def draw_line(color, x, y, angle, length ):
smart.penup()
smart.color(color)
smart.goto(x, y)
smart.setheading(angle)
smart.pendown()
smart.forward(line_length)
turtle.speed(0)
file = input("What file would you like to execute?")
turtle.clearscreen()
smart = turtle.Turtle()
with open(str(file),'r') as f:
color = 'black' #default
for line in f:
line = line.strip().split()
if line[0] == 'color':
color = line[1]
elif line[0] == 'rect':
x, y, width, height = map(int, line[1:])
draw_rect(color, x, y, width, height)
elif line[0] == 'circle':
x,y, radius = map(int, line[1:])
draw_circle(color, x, y, radius)
elif line[0] == 'line':
x, y, angle, length = map(int, line[1:])
draw_line(color, x, y, angle, length)
input("Press Enter to exit")
print("Program complete")
请注意,这大部分都是您的代码;我刚刚清理了一下。 “我每天都在变得更好”是正确的态度!保持。我的经验以及整个程序员的经验是,在节省调试和以后的维护时,您花费的时间使程序清晰可读得到了充分的回报。即使付出了我所付出的努力,我也无法计算六个月后我查看我的代码的时间,并且想:“这应该做什么?”