Программа Pattern Design не работает правильно - PullRequest
0 голосов
/ 20 октября 2019

У меня есть два кода, которые работают вместе, чтобы рисовать шаблоны, используя импортную черепаху. Я не знаю, правильно ли работает код или он на 100% корректен, потому что я получаю несколько ошибок, которые не знаю, как исправить. Я пытался исправить их, но они продолжают появляться. Моя программа должна рисовать шаблоны в соответствии с вводом пользователя. Я получаю ошибки отступа, и я пытаюсь их исправить, но это все еще не работает. Пожалуйста, помогите!

Файл 1 кода:

import pattern as p

def main():
    p.setup()

playAgain = True
while playAgain:
    print("Choose a mode")
    print("1) Rectangle Pattern")
    print("2) Circle Pattern")
    print("3) Super Pattern")
mode = eval(input("Which mode do you want to play? 1, 2 or 3: "))

if mode == 1:
    width = input("Enter width for the rectangles: ")
    height = input("Enter height for the rectangles: ")
    count = input("Enter how many rectangles you'd like in the pattern: ")
    centerX, centerY = eval(input("Enter center position (x, y): "))
p.drawRectanglePattern(centerX, centerY, p.drawRectanglePattern.offset, width, height, count, p.drawRectanglePattern.rotations)

elif mode == 2:
    width = input("Enter width for the circles: ")
    height = input("Enter height for the circles: ")
    count = input("Enter how many circles you'd like in the pattern: ")
    centerX, centerY = eval(input("Enter center position (x, y): "))
p.drawCirclePattern(centerX, centerY, offset, radius, count)


elif mode == 3:
    width = input("Enter width for the super pattern: ")
    height = input("Enter height for the super pattern: ")
    count = input("Enter how many super patterns you'd like in the pattern: ")
    centerX, centerY = eval(input("Enter center position (x, y): "))

if num == "":
p.drawSuperPattern()
else:
p.drawSuperPattern(eval(num))


print("Do you want to play again?")
print("1) Yes, and keep drawings")
print("2) Yes, and clear drawings")
print("3) No, I am all done")
response = eval(input("Choose 1, 2, or 3: "))

if response == 1:
        playAgain = True
    if response == 2:
        pattern.reset()
        playAgain = True
    else:
        playAgain = False
        print("Thanks for playing!")
        pattern.done()

main()

Файл 2 называется pattern.py

import turtle
import random

SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 800

def setup():
turtle.screensize(SCREEN_WIDTH, SCREEN_HEIGHT)
turtle.speed(0)

def setRandomColor():
colors = ["misty rose", "lavender", "blue", "gold", "forest green", "orange"]
random.choice(colors)


def drawRectangle(centerX, centerY, width, height):
turtle.pd()
turtle.color((setRandomColor()))
for b in range(2):
turtle.forward(height)
turtle.left(90)
turtle.forward(width)
turtle.left(90)

def drawRectanglePattern(centerX, centerY, offset, width, height, count, rotation):
offset = 0
for c in range(count):
rotation = (360/count)
offset += 1
nextRect = (rotation/(height/2) + offset)
turtle.pu()
turtle.goto(nextRect)
drawRectangle(centerX, centerY, width, height)

1 Ответ

1 голос
/ 20 октября 2019

Ваш код - это катастрофа. Отступы по большей части не существуют. Вы вызываете функции, которые не существуют. Вы передаете аргументы, которые игнорируете. Вы импортируете второй файл под одним именем, но вызываете его под другим именем. Вы повторяете фиксированные вычисления внутри циклов. И т.д.

Это пример написания слишком большого количества кода без каких-либо проверок, а затем с надеждой, что это сработает. Пишите маленькие чанки, тестируйте маленькие чанки, пишите больше маленьких чанков и проверяйте их и т. Д.

Вот переписывание вашего кода, чтобы он в основном функционировал:

Библиотека pattern.py:

import turtle
from random import choice

SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 800

COLORS = ["misty rose", "lavender", "blue", "gold", "forest green", "orange"]

def setup():
    turtle.screensize(SCREEN_WIDTH, SCREEN_HEIGHT)
    turtle.speed('fastest')

def reset():
    turtle.clearscreen()

def getRandomColor():
    return choice(COLORS)

def drawRectangle(centerX, centerY, width, height):
    turtle.goto(centerX - width/2, centerY - height/2)
    turtle.pd()
    turtle.color(getRandomColor())

    for _ in range(2):
        turtle.forward(width)
        turtle.left(90)
        turtle.forward(height)
        turtle.left(90)

def drawRectanglePattern(centerX, centerY, width, height, count):
    rotation = 360 / count

    for _ in range(count):
        turtle.pu()
        turtle.left(rotation)
        drawRectangle(centerX, centerY, width, height)

def drawCirclePattern(centerX, centerY, radius, count):
    pass

def drawSuperPattern(centerX, centerY, width, height, count):
    pass

Основная программа, которая вызывает библиотеку:

import pattern

def main():

    while True:
        print("Choose a mode")
        print("1) Rectangle Pattern")
        print("2) Circle Pattern")
        print("3) Super Pattern")

        mode = int(input("Which mode do you want to play? 1, 2 or 3: "))

        pattern.setup()

        if mode == 1:
            width = int(input("Enter width for the rectangles: "))
            height = int(input("Enter height for the rectangles: "))
            count = int(input("Enter how many rectangles you'd like in the pattern: "))
            centerX, centerY = eval(input("Enter center position (x, y): "))

            pattern.drawRectanglePattern(int(centerX), int(centerY), width, height, count)
        elif mode == 2:
            radius = int(input("Enter the radius for the circles: "))
            count = int(input("Enter how many circles you'd like in the pattern: "))
            centerX, centerY = eval(input("Enter center position (x, y): "))

            pattern.drawCirclePattern(int(centerX), int(centerY), radius, count)
        elif mode == 3:
            width = int(input("Enter width for the super pattern: "))
            height = int(input("Enter height for the super pattern: "))
            count = int(input("Enter how many super patterns you'd like in the pattern: "))
            centerX, centerY = eval(input("Enter center position (x, y): "))

            pattern.drawSuperPattern(int(centerX), int(centerY), width, height, count)

        print("Do you want to play again?")
        print("1) Yes, and keep drawings")
        print("2) Yes, and clear drawings")
        print("3) No, I am all done")

        response = int(input("Choose 1, 2, or 3: "))

        if response == 1:
            pass
        elif response == 2:
            pattern.reset()
        else:
            print("Thanks for playing!")
            break

main()

Основная проблема, на которую следует обратить внимание, помимо заполнения отсутствующих функций, - избавить вашу программу от вызовов eval(). Это не рутина, которую вы должны использовать, несмотря на любое удобство, которое она может предоставить.

ПРИМЕР ИСПОЛЬЗОВАНИЯ

> python3 test.py
Choose a mode
1) Rectangle Pattern
2) Circle Pattern
3) Super Pattern
Which mode do you want to play? 1, 2 or 3: 1
Enter width for the rectangles: 150
Enter height for the rectangles: 275
Enter how many rectangles you'd like in the pattern: 17
Enter center position (x, y): (25, 75)
Do you want to play again?
1) Yes, and keep drawings
2) Yes, and clear drawings
3) No, I am all done
Choose 1, 2, or 3: 3
Thanks for playing!
> 

ПРИМЕР ВЫХОДА

enter image description here

...