简体   繁体   English

重新启动我的Python脚本

[英]Restart my Python script

So I've created this number guessing game. 所以我创建了这个猜数字游戏。 And it works fine up until the play_again function is needed. 它可以正常工作,直到需要play_again函数。 I have looked around trying to figure out how I can restart the program. 我四处张望,试图弄清楚如何重新启动程序。 I have tested this in my PyCharm IDE and it just exits with exit code 0. What is the best way to actually restart the program so it generates a new number in my rand variable? 我已经在我的PyCharm IDE中对此进行了测试,它会以退出代码0退出。真正重启程序的最佳方法是什么,以便它在rand变量中生成一个新数字?

import os
from random import random

import sys


class Game:
    """
    rand is declared by grabbing a number between 0 and 1, multiplying it by 100, and rounding to the nearest integer
    guessed is declared as false in order to keep the while loop running until the number is guessed
    """
    rand = round(random() * 100, 0)
    guessed = False
    print("Guess the number [0 - 100]")

    # This function handles the number guessing and number formatting
    def run_game(self):

        # Assigns the 'answer' variable by grabbing user input from console
        answer = input()

        # Checks if the input from the console is a number, and if not, asks the user to enter a valid number
        if answer.isdigit():

            n = int(answer)

            # Checks the input given against the random number generated
            while not self.guessed:
                if n > int(self.rand):
                    print("Number is less than " + str(n))
                    self.run_game()
                elif n < int(self.rand):
                    print("Number is greater than " + str(n))
                    self.run_game()
                else:
                    print("You have guessed the correct number!")
                    self.guessed = True
                    self.play_again()
        else:
            print("Please enter a number")
            self.run_game()
            return

    def play_again(self):

        reply = input("Play again? (y/n)")

        if reply.lower() == "y":
            python = sys.executable
            os.execl(python, python, *sys.argv)
        elif reply.lower() == "n":
            print("Thanks for playing!")
        else:
            self.play_again()


if __name__ == "__main__":
    game = Game()
    game.run_game()

Solution

There are several errors in your code. 您的代码中有几个错误。 The most common being is that you are using recursion as a looping construct. 最常见的是您将递归用作循环构造。 Don't do this. 不要这样 It's a great way to introduce bugs, not to mention if your "loop" runs to many times, you'll hit the recursion limit. 这是引入错误的好方法,更不用说如果您的“循环”运行了很多次,您将达到递归限制。 Just use a while loop: 只需使用while循环:

def run_game(self):
    while True:
        answer = input()
        if answer.isdigit():
            n = int(answer)
            if n > int(self.rand):
                print("Number is less than " + str(n))
            elif n < int(self.rand):
                print("Number is greater than " + str(n))
            else:
                print("You have guessed the correct number!")
                reply = self.play_again()
                if reply is False:
                    break
        else:
            print("Please enter a number")

Note a modified player to return a boolean indicating whether the user wants to play again. 请注意,修改后的播放器将返回一个布尔值,该布尔值指示用户是否要再次播放。 As I said above, you made the same mistake in player. 如上所述,您在播放器中犯了同样的错误。 Don't use a recursion as a loop, use an explicit while loop: 不要将递归用作循环,而应使用显式的while循环:

def play_again(self):
    while True:
        reply = input("Play again? (y/n)")
        if reply.lower() == "y":
            return True
        elif reply.lower() == "n":
            return False
        else:
            print("Enter 'y' or 'n'")

Improvements 改进措施

On an unrelated side note, I see no reason to use a class here. 另外,我没有理由在这里使用类。 There's no global state you need to keep track of or any data you're trying to encapsulate. 您无需跟踪任何全局状态,也无需尝试封装任何数据。 This can be implemented much cleaner using just functions: 仅使用函数就可以实现更简洁的实现:

def run_game():
    rand = randint(1, 100)
    while True:
        answer = input()
        if answer.isdigit():
            n = int(answer)
            if n > rand:
                print("Number is less than " + str(n))
            elif n < rand:
                print("Number is greater than " + str(n))
            else:
                print("You have guessed the correct number!")
                if not play_again():
                    break
        else:
            print("Please enter a number")


def play_again():
    while True:
        reply = input("Play again? (y/n)")
        if reply.lower() == "y":
            return True
        elif reply.lower() == "n":
            return False
        else:
            print("Enter 'y' or 'n'")


if __name__ == "__main__":
    print("Guess the number [0 - 100]")
    run_game()

Here are some other improvements I made: 这是我所做的其他一些改进:

  • I used ranint() instead of randomm() . 我用ranint()代替randomm() Since you have a specific range, just use randint() . 由于您具有特定范围,因此只需使用randint()
  • I removed the calls to int() as those are no longer needed. 我删除了对int()的调用,因为不再需要这些调用。

That's a pretty bad way to restart the game, you should avoid running exec when possible. 这是重启游戏的一种非常糟糕的方法,您应尽可能避免执行exec

One other way to do it would be to return False or True based on user input, and keep running the game while the function returns True : 另一种方法是根据用户输入返回FalseTrue ,并在函数返回True继续运行游戏:

import os
from random import random

import sys


class Game:
    """
    rand is declared by grabbing a number between 0 and 1, multiplying it by 100, and rounding to the nearest integer
    guessed is declared as false in order to keep the while loop running until the number is guessed
    """
    rand = round(random() * 100, 0)
    guessed = False
    print("Guess the number [0 - 100]")

    # This function handles the number guessing and number formatting
    def run_game(self):

        # Assigns the 'answer' variable by grabbing user input from console
        answer = input()

        # Checks if the input from the console is a number, and if not, asks the user to enter a valid number
        if answer.isdigit():

            n = int(answer)

            # Checks the input given against the random number generated
            while not self.guessed:
                if n > int(self.rand):
                    print("Number is less than " + str(n))
                    self.run_game()
                elif n < int(self.rand):
                    print("Number is greater than " + str(n))
                    self.run_game()
                else:
                    print("You have guessed the correct number!")
                    self.guessed = True
                    return self.play_again()  # Here we run play_again and return its result
        else:
            print("Please enter a number")
            self.run_game()
            return

    def play_again(self):

        reply = input("Play again? (y/n)")

        if reply.lower() == "y":
            return False  # Game isn't finished
        elif reply.lower() == "n":
            print("Thanks for playing!")
            return False  # Game is finished
        else:
            return self.play_again()


if __name__ == "__main__":
    game = Game()
    game_is_finished = False
    while not game_is_finished:
        game_is_finished = game.run_game()

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM