2010-12-14 8 views
0

У меня есть питон программа, которая essentailly составленную из черепахи графики, и это в основном просят пользователей, сколько квадратов рисовать, а затем после каждого квадрата, он добавляет 1 к счетчику с помощью:python альтернатива команде goto?

counter=1 
<drawing code here> 
counter +=1 

И затем после этого я хотел сделать чек, чтобы узнать, равно ли число квадратов тому количеству, которое вводил пользователь, и если это так, тогда я хотел пойти в нижнюю часть скрипта, где я бы сказал, что-то вроде сделано !!. но я не знаю, как заставить его перейти к определенной части скрипта, поскольку команда goto, с которой я привык в пакетной версии, не поддерживается в python (я знаю, goto = код спагетти)

Я нашел Легкое обходное решение - это просто загрузить модуль, который кто-то сделал, который позволяет импортировать команду goto в python и использовать ее так же, как и в пакетном режиме, но я бы хотел использовать собственное решение python, если оно есть!

мой текущий код:

from turtle import * 
import time 
counter=1 
color("red", "blue") 
down() 

user=int(raw_input('how many balls do you want?')) 
counter +=1 
if user===counter: 

# solution goes here! 

else: 

for step in range(24): 
     right(105) 
     forward(100) 
     right(105) 
     forward(100) 
     right(105) 
     forward(100) 
     right(105) 
     forward(100) 

up() 
goto(120,0) 
down() 


counter +=1 
if user==counter: 

#solution goes here! 

else: 

for step in range(24): 
     right(105) 
     forward(100) 
     right(105) 
     forward(100) 
     right(105) 
     forward(100) 
     right(105) 
     forward(100) 

up() 
goto(0,-50) 
write("Done!") 

time.sleep(5) 

Если у вас есть ответ или альтернативу этой проблемы было бы весьма признателен!

+5

Есть ли причина, по которой вы не используете функции? – Falmarri

+0

goto (120,0), похоже, переводит вас в (x, y). Он выглядит как функция и не является goto, который вы найдете на каком-то языке программирования, который напрямую управляет указанным кодом. По крайней мере, с первого взгляда, это то, что кажется. – pyfunc

+2

Ух .... «goto», который вы получаете от модуля «черепаха», абсолютно не имеет никакого отношения к прыжкам в другое место в скрипте ... он устанавливает положение черепахи. Во всяком случае, способ, которым вы выполняете эту работу, состоит в том, чтобы ** структурировать ваш код **.Представьте, что вы никогда не слышали о «goto» и узнали, как работают реальные структуры управления, с самого начала. –

ответ

3

Поможет ли это?

import turtle # don't pollute the namespace 
import time 

def getInt(msg): 
    return int(raw_input(msg)) 

def drawBall(): 
    turtle.down() 
    for i in range(96): 
     turtle.right(105) 
     turtle.forward(100) 
    turtle.up() 

def moveOver(): 
    turtle.goto(120,0) 

def Done(): 
    turtle.goto(0,-50) 
    turtle.write('Done!') 
    time.sleep(5) 

def main(): 
    turtle.color('red','blue') 
    for i in range(getInt('How many balls do you want?')): 
     drawBall() 
     moveOver() 
    Done() 

if __name__=="__main__": 
    main() 

Не думайте в терминах одного длинного списка инструкций. Вместо этого подумайте о том, чтобы разделить вашу проблему на более мелкие действия, такие как «рисование шара», и написать каждое из этих действий в качестве процедуры; затем подумайте о том, как объединить эти процедуры для достижения своей цели. Повторение одного и того же кода является признаком того, что вы делаете это неправильно.

+0

ok Этот код не имеет ошибок, но он также не открывается! он мигает консолью на экране, например .1 секунд, а затем закрывается без ошибок ... какие-либо идеи? – daniel11

+0

@ Daniel11: Два способа запустить его: сначала вырезать и вставить в интерактивную сессию; во-вторых, сохраните как (например) myturtle.py, затем запустите из командной строки 'python -i myturtle.py' (-i говорит, что интерпретатор остается в интерактивном режиме, когда скрипт заканчивается). –

+0

wait, программа, которую вы опубликовали выше, просто определяет переменные, вы говорите, что я должен делать то, что вы разместили, а затем вставлять инструкции, такие как правые (90) или вперед (110)? потому что сценарий, который вы опубликовали, фактически не отображает ничего ... – daniel11

2

Не проверяйте количество квадратов, а затем переходите к концу, просто зациклируйте соответствующее количество раз, рисуя квадрат каждый раз.

0

некоторые намеки:

>>> def square(): 
    print "+--+" 
    print "| |" 
    print "| |" 
    print "+--+" 
    print 


>>> range(5) 
[0, 1, 2, 3, 4] 
>>> for x in range(5): 
    print x 
    square() 


0 
+--+ 
| | 
| | 
+--+ 

1 
+--+ 
| | 

[СНиП]

0

Разделите свой код на функции, затем используйте return всякий раз, когда вы хотите пропустить оставшийся код функции.

ОБНОВЛЕНИЕ: Я не обязательно допускаю несколько точек выхода для функции, как очевидно предполагал комментатор; этот ответ находится в контексте вопроса. Мое мнение по этому вопросу многосекционных выходов со-Incides с that Тим Питерс:

Ну, с одним выходом лучше, потому что он всегда делает приборы проще и часто делает рассуждения проще (вплоть до альтернатива не вводит так многие goofy Boolean flags, которые отслеживают их хуже, чем болезнь).

+1

Хотя это не так плохо, как goto, это часто плохая практика программирования - гораздо проще отлаживать функцию, когда она всегда выходит в одном месте. –

+0

@ Hugh: вопрос был ясен: альтернатива Python команде goto, поэтому в этом контексте я считаю свой ответ полезным; мы, очевидно, не согласны с контекстом. – tzot

+0

@TZ: к моему смущению, я обнаружил, что использую этот очень шаблон вскоре после написания своего комментария. Определенно, он имеет свое место и может сделать функцию более читаемой при использовании экономно - но, как говорится, вам нужно знать правила, чтобы разбить их разумно ;-) –

Смежные вопросы