我正在尝试创建一个 cookie Clicker 版本,除了在控制台中使用文本输入/输出,并且当用户输入命令“退出”时,我希望它终止程序。尽管如此,这仍然不起作用,它会创建一个新的输入行,除非您无法在其中输入并且整个程序被冻结。即使按通常会终止程序的 ctrl + c(Mac 为 cmd + c)也不起作用。最终,我只需要杀死终端。这是我当前的代码:
import time
import random
import threading
import os
import sys
sys.setrecursionlimit(10000)
cookies = 0
display_cookies = 0
cps = 74
cookies_per_click = 1
cookie_clicks = 0
all_commands = {
" cookie balance": "Displays the amount of cookies you have.\n",
" exit": "Exits the program.\n",
" view <item-to-view>": "Views the price (if available, otherwise, shows how to get it), item discription, and "
"item use (if available)."
}
def reset():
global cookies, cps, cookie_clicks, cookies_per_click
cookies = 0
cps = 0
cookie_clicks = 0
cookies_per_click = 1
def click():
global cookies, cookies_per_click, cookie_clicks
double_chance = ((random.random() * 100) == 28)
if double_chance:
cookies += (cookies_per_click * 2)
print(f"A glitch happened. We gave you {cookies_per_click * 2} cookies, twice the amount of your cookies per "
f"click to resolve it.")
else:
cookies += cookies_per_click
print(f"Added {cookies_per_click} cookies to your bank.")
cookie_clicks += 1
def add_cps_loop():
global cps, cookies, display_cookies
for i in range(1):
cookies += cps / 75
display_cookies = int(cookies)
time.sleep(1/1000)
add_cps_loop()
def clear_console():
os.system("cls")
def format_all_commands():
all_commands_formatted = ""
for command, desc in all_commands.items():
all_commands_formatted += f"{command}: {desc}"
return all_commands_formatted
def get_user_input():
inp = input("")
match inp:
case "clear":
clear_console()
case "cookie balance":
print(display_cookies)
case "exit":
sys.exit()
case "help":
print(format_all_commands())
case _:
print("Not recognized as a command. Enter \"help\" for all available commands.")
get_user_input()
if __name__ == "__main__":
threading.Thread(target = add_cps_loop).start()
threading.Thread(target = get_user_input).start()
我也尝试过使用
os._exit
、exit
和quit
。它们都不起作用。 os._exit
产生退出错误(杀死代码的错误),但它仍然创建换行符输入并冻结程序。我将不胜感激任何帮助。
根据@juanpa.arrivilliga 的建议,我将其更改为使用 while 循环,这是我更新的代码:
import time
import random
import os
import sys
cookies = 0
display_cookies = 0
cps = 34
cookies_per_click = 1
cookie_clicks = 0
all_commands = {
" cookie balance OR cookies OR cookie bal": "Displays the amount of cookies you have.\n",
" exit": "Exits the program.\n",
" view <item-to-view>": "Views the price (if available, otherwise, shows how to get it), item discription, and "
"item use (if available).\n",
" click": "Why is there a definition for this? It's pretty self-explanatory? This command clicks the cookie, "
"duhhh!\n"
}
def reset():
global cookies, cps, cookie_clicks, cookies_per_click
cookies = 0
cps = 0
cookie_clicks = 0
cookies_per_click = 1
clear_console()
def click():
global cookies, cookies_per_click, cookie_clicks
double_chance = ((random.random() * 100) == 28)
if cookies_per_click == 1:
form_of_word_cookie = "cookie"
else:
form_of_word_cookie = "cookies"
if double_chance:
cookies += (cookies_per_click * 2)
print(f"A glitch happened. We gave you {cookies_per_click * 2} {form_of_word_cookie}, twice the amount of "
f"your cookies per click, to resolve it.")
else:
cookies += cookies_per_click
print(f"Added {cookies_per_click} {form_of_word_cookie} to your bank.")
cookie_clicks += 1
def add_cps_loop():
global cps, cookies, display_cookies
cookies += cps / 75
display_cookies = int(cookies)
time.sleep(1/1000)
def clear_console():
os.system("cls")
def format_all_commands():
all_commands_formatted = ""
for command, desc in all_commands.items():
all_commands_formatted += f"{command}: {desc}"
return all_commands_formatted
def get_user_input():
inp = input("Enter your command (Enter \"help\" for all commands): ")
match inp:
case "clear":
clear_console()
case "click":
click()
case "cookie balance":
print(display_cookies)
case "cookies":
print(cookies)
case "cookie bal":
print(display_cookies)
case "exit":
sys.exit()
case "help":
print(format_all_commands())
case _:
print("Not recognized as a command. Enter \"help\" for all available commands.")
if __name__ == "__main__":
clear_console()
#reset()
while True:
get_user_input()
add_cps_loop()
现在这带来了另一个问题:每次用户输入时 cps 只会增加,对于 34 cps,如上面的代码片段中使用的那样,每个用户输入的 cookie 增加 ~0.5 个 cookie。有没有办法让 add_cps_loop() 在后台持续运行,同时也接受输入?