簡體   English   中英

重新啟動我的Python腳本

[英]Restart my Python script

所以我創建了這個猜數字游戲。 它可以正常工作,直到需要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")

請注意,修改后的播放器將返回一個布爾值,該布爾值指示用戶是否要再次播放。 如上所述,您在播放器中犯了同樣的錯誤。 不要將遞歸用作循環,而應使用顯式的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()的調用,因為不再需要這些調用。

這是重啟游戲的一種非常糟糕的方法,您應盡可能避免執行exec

另一種方法是根據用戶輸入返回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