Hoe herstart ik een programma op basis van gebruikersinvoer?

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 continueslaat 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 Trueis, dus hebben we de voorwaarde waar gemaakt en zoals u weet Trueis 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 continuetrefwoord 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

Other episodes