所以我创建了这个猜数字游戏。它可以正常工作,直到需要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()
的调用,因为不再需要这些调用。关于python - 重新启动我的Python脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45069843/