Ik probeer een programma opnieuw te starten met een if-test op basis van de invoer van de gebruiker.
Deze code werkt niet, maar het is ongeveer wat ik zoek:
answer = str(raw_input('Run again? (y/n): '))
if answer == 'n':
print 'Goodbye'
break
elif answer == 'y':
#restart_program???
else:
print 'Invalid input.'
Wat ik probeer te doen is:
- als u y antwoordt, start het programma opnieuw vanaf de bovenkant
- als je n antwoordt, eindigt het programma (dat deel werkt)
- als u iets anders invoert, zou het ‘ongeldige invoer’ moeten afdrukken. voer alstublieft y of n…’ of zoiets in en vraag u opnieuw om nieuwe invoer.
Ik kwam heel dicht bij een oplossing met een “while true”-lus, maar het programma start gewoon opnieuw op, ongeacht wat je indrukt (behalve n), of het stopt ongeacht wat je indrukt (behalve y). Enig idee?
Antwoord 1, autoriteit 100%
Probeer dit:
while True:
# main program
while True:
answer = str(input('Run again? (y/n): '))
if answer in ('y', 'n'):
break
print("invalid input.")
if answer == 'y':
continue
else:
print("Goodbye")
break
De binnenste while-lus loopt totdat de invoer 'y'
of 'n'
is. Als de invoer 'y'
is, begint de while-lus opnieuw (het sleutelwoord continue
slaat de resterende code over en gaat rechtstreeks naar de volgende iteratie). Als de invoer 'n'
is, eindigt het programma.
Antwoord 2, autoriteit 91%
Deze regel zal het lopende programma onvoorwaardelijk opnieuw opstarten:
os.execl(sys.executable, sys.executable, *sys.argv)
Een van de voordelen ten opzichte van de overige suggesties tot nu toe is dat het programma zelf opnieuw wordt gelezen.
Dit kan handig zijn als u bijvoorbeeld de code in een ander venster wijzigt.
Antwoord 3, autoriteit 29%
Je kunt dit eenvoudig doen met een functie. Bijvoorbeeld:
def script():
# program code here...
restart = raw_input("Would you like to restart this program?")
if restart == "yes" or restart == "y":
script()
if restart == "n" or restart == "no":
print "Script terminating. Goodbye."
script()
Natuurlijk kun je hier veel dingen veranderen. Wat er wordt gezegd, wat het script accepteert als een geldige invoer, de variabele- en functienamen. Je kunt het hele programma eenvoudig nesten in een door de gebruiker gedefinieerde functie (je moet natuurlijk alles in een extra streepje plaatsen) en het op elk moment opnieuw laten opstarten met behulp van deze regel code: myfunctionname()
. Meer hierover hier.
Antwoord 4, autoriteit 21%
Een while-lus gebruiken:
In [1]: start = 1
...:
...: while True:
...: if start != 1:
...: do_run = raw_input('Restart? y/n:')
...: if do_run == 'y':
...: pass
...: elif do_run == 'n':
...: break
...: else:
...: print 'Invalid input'
...: continue
...:
...: print 'Doing stuff!!!'
...:
...: if start == 1:
...: start = 0
...:
Doing stuff!!!
Restart? y/n:y
Doing stuff!!!
Restart? y/n:f
Invalid input
Restart? y/n:n
In [2]:
Antwoord 5, autoriteit 7%
Hier is een leuke manier om het te doen met een decorateur:
def restartable(func):
def wrapper(*args,**kwargs):
answer = 'y'
while answer == 'y':
func(*args,**kwargs)
while True:
answer = raw_input('Restart? y/n:')
if answer in ('y','n'):
break
else:
print "invalid answer"
return wrapper
@restartable
def main():
print "foo"
main()
Uiteindelijk denk ik dat je 2 while-loops nodig hebt. U hebt één lus nodig tussen het gedeelte dat om het antwoord vraagt, zodat u opnieuw kunt vragen als de gebruiker slechte invoer geeft. Je hebt een seconde nodig die controleert of het huidige antwoord 'y'
is en de code blijft uitvoeren totdat het antwoord niet 'y'
is.
Antwoord 6
Het is heel gemakkelijk om dit te doen
while True:
#do something
again = input("Run again? ")
if 'yes' in again:
continue
else:
print("Good Bye")
break
Kortom, hierin zal de while-lus het programma keer op keer uitvoeren, omdat while-lussen worden uitgevoerd als de voorwaarde True
is, dus hebben we de voorwaarde waar gemaakt en zoals u weet True
is altijd waar en nooit onwaar. Dus, zal niet stoppen, daarna komt het belangrijkste deel hier eerst, we zullen input van de gebruiker nemen of ze het programma willen voortzetten of niet, dan zullen we zeggen dat als de gebruiker ja zegt, ik wil doorgaan, dan de continue
trefwoord zal de lus weer naar de top brengen en zal het programma ook opnieuw uitvoeren en als de gebruiker iets anders zegt of je kunt het op een andere manier doen als je het programma alleen wilt afsluiten als de gebruiker nee zegt, voeg dan gewoon dit toe
elif 'no' in again:
print("Good Bye")
break
else:
print("Invalid Input")
dit zal er zo uitzien dat als er een ‘nee’ woord in de invoer staat en als dat zo is, de lus wordt verbroken en het programma stopt
Antwoord 7
Ik maak dit programma:
import pygame, sys, time, random, easygui
skier_images = ["skier_down.png", "skier_right1.png",
"skier_right2.png", "skier_left2.png",
"skier_left1.png"]
class SkierClass(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("skier_down.png")
self.rect = self.image.get_rect()
self.rect.center = [320, 100]
self.angle = 0
def turn(self, direction):
self.angle = self.angle + direction
if self.angle < -2: self.angle = -2
if self.angle > 2: self.angle = 2
center = self.rect.center
self.image = pygame.image.load(skier_images[self.angle])
self.rect = self.image.get_rect()
self.rect.center = center
speed = [self.angle, 6 - abs(self.angle) * 2]
return speed
def move(self,speed):
self.rect.centerx = self.rect.centerx + speed[0]
if self.rect.centerx < 20: self.rect.centerx = 20
if self.rect.centerx > 620: self.rect.centerx = 620
class ObstacleClass(pygame.sprite.Sprite):
def __init__(self,image_file, location, type):
pygame.sprite.Sprite.__init__(self)
self.image_file = image_file
self.image = pygame.image.load(image_file)
self.location = location
self.rect = self.image.get_rect()
self.rect.center = location
self.type = type
self.passed = False
def scroll(self, t_ptr):
self.rect.centery = self.location[1] - t_ptr
def create_map(start, end):
obstacles = pygame.sprite.Group()
gates = pygame.sprite.Group()
locations = []
for i in range(10):
row = random.randint(start, end)
col = random.randint(0, 9)
location = [col * 64 + 20, row * 64 + 20]
if not (location in locations) :
locations.append(location)
type = random.choice(["tree", "flag"])
if type == "tree": img = "skier_tree.png"
elif type == "flag": img = "skier_flag.png"
obstacle = ObstacleClass(img, location, type)
obstacles.add(obstacle)
return obstacles
def animate():
screen.fill([255,255,255])
pygame.display.update(obstacles.draw(screen))
screen.blit(skier.image, skier.rect)
screen.blit(score_text, [10,10])
pygame.display.flip()
def updateObstacleGroup(map0, map1):
obstacles = pygame.sprite.Group()
for ob in map0: obstacles.add(ob)
for ob in map1: obstacles.add(ob)
return obstacles
pygame.init()
screen = pygame.display.set_mode([640,640])
clock = pygame.time.Clock()
skier = SkierClass()
speed = [0, 6]
map_position = 0
points = 0
map0 = create_map(20, 29)
map1 = create_map(10, 19)
activeMap = 0
obstacles = updateObstacleGroup(map0, map1)
font = pygame.font.Font(None, 50)
a = True
while a:
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed = skier.turn(-1)
elif event.key == pygame.K_RIGHT:
speed = skier.turn(1)
skier.move(speed)
map_position += speed[1]
if map_position >= 640 and activeMap == 0:
activeMap = 1
map0 = create_map(20, 29)
obstacles = updateObstacleGroup(map0, map1)
if map_position >=1280 and activeMap == 1:
activeMap = 0
for ob in map0:
ob.location[1] = ob.location[1] - 1280
map_position = map_position - 1280
map1 = create_map(10, 19)
obstacles = updateObstacleGroup(map0, map1)
for obstacle in obstacles:
obstacle.scroll(map_position)
hit = pygame.sprite.spritecollide(skier, obstacles, False)
if hit:
if hit[0].type == "tree" and not hit[0].passed:
skier.image = pygame.image.load("skier_crash.png")
easygui.msgbox(msg="OOPS!!!")
choice = easygui.buttonbox("Do you want to play again?", "Play", ("Yes", "No"))
if choice == "Yes":
skier = SkierClass()
speed = [0, 6]
map_position = 0
points = 0
map0 = create_map(20, 29)
map1 = create_map(10, 19)
activeMap = 0
obstacles = updateObstacleGroup(map0, map1)
elif choice == "No":
a = False
quit()
elif hit[0].type == "flag" and not hit[0].passed:
points += 10
obstacles.remove(hit[0])
score_text = font.render("Score: " + str(points), 1, (0, 0, 0))
animate()
Link: Https://docs.google.com/document/d/1u8JHEA6ZFE5CG1IA3OSTL6DSEQ0VWV_VUIR3KQJM4C/ bewerken