简体   繁体   English

"如何根据用户输入重新启动程序?"

[英]How do I restart a program based on user input?

I'm trying to restart a program using an if-test based on the input from the user.我正在尝试使用基于用户输入的 if-test 重新启动程序。

This code doesn't work, but it's approximately what I'm after:这段代码不起作用,但它大约是我所追求的:

answer = str(raw_input('Run again? (y/n): '))

if answer == 'n':
   print 'Goodbye'
   break
elif answer == 'y':
   #restart_program???
else:
   print 'Invalid input.'

What I'm trying to do is:我想做的是:

  • if you answer y - the program restarts from the top如果您回答 y - 程序从顶部重新启动
  • if you answer n - the program ends (that part works)如果您回答 n - 程序结束(该部分有效)
  • if you enter anything else, it should print 'invalid input.如果您输入其他任何内容,它应该打印'无效输入。 please enter y or n...' or something, and ask you again for new input.请输入 y 或 n...' 或其他内容,然后再次询问您是否有新的输入。

I got really close to a solution with a "while true" loop, but the program either just restarts no matter what you press (except n), or it quits no matter what you press (except y).我非常接近使用“while true”循环的解决方案,但是无论您按什么(n 除外),程序要么只是重新启动,要么无论您按什么(y 除外)它都会退出。 Any ideas?有任何想法吗?

This line will unconditionally restart the running program from scratch:此行将无条件地从头开始重新启动正在运行的程序:

os.execl(sys.executable, sys.executable, *sys.argv)

Try this:试试这个:

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

Using one while loop:使用一个while循环:

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]:

You can do this simply with a function.你可以简单地用一个函数来做到这一点。 For example:例如:

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()

Of course you can change a lot of things here.当然你可以在这里改变很多东西。 What is said, what the script will accept as a valid input, the variable and function names.说什么,脚本将接受什么作为有效输入,变量和函数名称。 You can simply nest the entire program in a user-defined function (Of course you must give everything inside an extra indent) and have it restart at anytime using this line of code: myfunctionname() .您可以简单地将整个程序嵌套在用户定义的函数中(当然,您必须将所有内容都放在一个额外的缩进中)并使用以下代码行随时重新启动它: myfunctionname() More on this here.更多关于这里。

Here's a fun way to do it with a decorator :这是一个使用装饰器的有趣方法:

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()

Ultimately, I think you need 2 while loops.最终,我认为您需要 2 个 while 循环。 You need one loop bracketing the portion which prompts for the answer so that you can prompt again if the user gives bad input.您需要一个循环将提示答案的部分括起来,以便在用户输入错误时可以再次提示。 You need a second which will check that the current answer is 'y' and keep running the code until the answer isn't 'y' .您需要一秒钟来检查当前答案是否为'y'并继续运行代码,直到答案不是'y'

It is very easy do this很容易做到这一点

while True:

       #do something

       again = input("Run again? ")

       if 'yes' in again:
              continue
       else:
              print("Good Bye")
              break

I create this program:我创建了这个程序:

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/1U8JhesA6zFE5cG1Ia3OsTL6dseq0Vwv_vuIr3kqJm4c/edit链接: https : //docs.google.com/document/d/1U8JhesA6zFE5cG1Ia3OsTL6dseq0Vwv_vuIr3kqJm4c/edit

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何根据用户输入设置 boolean 条件以清除或关闭海龟程序? - How do I set a boolean condition to clear or close the turtle program based on user input? 如何在我的 python 脚本中重新启动 main() function? 无论我添加什么输入,程序都会重新启动 - How do I restart the main() function in my python script? The program restarts no matter what input I add 如何从用户输入中重置/重新启动Python中的程序? - How to reset/restart a program in Python from user input? 由于用户输入无效,如何重新启动python程序 - How to restart a python program due to invalid input from the user 如何使用用户输入来确定程序的工作方式? - How do I use user input to determine how the program works? 我如何制作一个while循环来询问用户是否要重新启动程序 - How do I make a while loop to ask the user if they want to restart the program 如何在Python 3中基于用户输入调用函数? - How do I call a function based on user input in Python 3? 如何根据用户输入在 SymPy 中创建符号? - How do I create Symbols in SymPy based on user input? 如何根据用户输入显示if语句? - How do I get if statements to print based on user input? 如何根据Django中的用户输入将值存储在模型中? - How do I store values in a model based on user input in django?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM