Skip to main content
 首页 » 编程设计

python之重新启动我的 Python 脚本

2025年05月04日2398°冷暖

所以我创建了这个猜数字游戏。在需要 play_again 函数之前,它工作正常。我环顾四周试图弄清楚如何重新启动程序。我已经在我的 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() 

请您参考如下方法:

解决方案

您的代码中有几个错误。最常见的情况是您将递归用作循环结构。不要这样做。这是引入错误的好方法,更不用说如果您的“循环”运行多次,您将达到递归限制。只需使用 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") 

注意修改后的播放器返回一个 bool 值,指示用户是否想再次播放。正如我上面所说,你在播放器中犯了同样的错误。不要将递归用作循环,使用显式 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'") 

改进

在不相关的旁注中,我认为没有理由在这里使用类。没有您需要跟踪的全局状态或您试图封装的任何数据。这可以仅使用函数来实现得更清晰:

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

以下是我所做的其他一些改进:

  • 我使用了 ranint() 而不是 randomm()。由于您有一个特定的范围,只需使用 randint()。
  • 我删除了对 int() 的调用,因为不再需要它们。