python - 使用命令终止时代码不会终止

问题描述 投票:0回答:0

我正在尝试创建一个 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() 在后台持续运行,同时也接受输入?

python python-3.x exit
© www.soinside.com 2019 - 2024. All rights reserved.