Python =每秒重复

时间:2018-06-24 18:43:55

标签: python

因此,我只创建一个基本游戏,您购买气球,而购买的每个气球都会增加您每秒获得的金钱。但是考虑到我已经有了While循环,而又没有另一个循环了,我似乎无法弄清楚如何每秒增加一笔钱。

这是我的代码

###Game###
import time
money=1
money_ps=0
score=0
while True:
    time.sleep(1)
    money=money+money_ps

while score==0:
    inp=input().lower()

    if inp=="buy" or inp=="purchase":
        print("What would you like to buy")
        print("•Red Balloon (£1)")
        print("•Blue Balloon (£100)")
        print("•Yellow Balloon (£10000)")   
        print("•Green Balloon (£1000000)")
        print("•Pink Balloon (£100000000)")
        inp=input().lower()
        if inp=="red balloon":
            if money >= 1:
                money_ps=money_ps+0.1
                money=money-1
                print("You successfully bought a Red Balloon")
            else:
                print("You are unable to afford this")
        elif inp=="blue balloon":
            if money >= 100:
                money_ps=money_ps+1
                money=money-1
                print("You successfully bought a Blue Balloon")
            else:
                print("You are unable to afford this")

elif inp=="bank":
    print("You have £",money)

非常感谢您的帮助

3 个答案:

答案 0 :(得分:1)

您的问题是您的主循环正在阻塞这些input调用。幸运的是,这实际上只是GUI应用程序,3D游戏和网络服务器背后的基本问题的特例,因此解决方案是众所周知的。不幸的是,解决方案可能有点复杂,或者至少需要大量学习。

一种解决方案是异步I / O。如果您从非阻塞文件中读取(input仅从sys.stdin中读取,该文件的行为就像一个文件,即使它不在磁盘上),则可以使用来自{{1}的循环}或selectors之类的更高级别,等待超时直到准备就绪,而不是永远等待。或者,您可以进入asyncio级别以下,并循环等待(带有超时)来自控制台或OS的事件,然后将这些事件放到输入中。或者,您可以使用stdin之类的高级库来为您完成此操作。

另一种解决方案需要更少的代码重新思考:让您的主线程将所有时间都花在curses上运行一个循环,并使用一个运行不同循环的后台线程,该线程会更新您的钱然后睡觉一秒钟。

有关详细信息和一些示例,请参见threading文档,但您可能希望通过更详尽的教程来学习。无论如何,这是使钱循环在线程中运行所需的更改:

input

现在,我们还必须确保每次要在主线程中访问money = 1 money_ps = 0 money_lock = threading.Lock() def money_loop(): global money global money_ps global money_lock while True: time.sleep(1) with money_lock: money=money+money_ps money_thread = threading.Thread(target=money_loop, args=()) money_thread.start() Lock时都使用相同的money

money_ps

就是这样;现在它将起作用。


除了一个问题:您需要一种在退出时告诉后台线程停止的方法。如果您要同时退出整个程序,那么有一个快速而肮脏的解决方案:使用daemon thread

if inp=="red balloon":
    with money_lock:
        if money >= 1:
            money_ps=money_ps+0.1
            money=money-1
        print("You successfully bought a Red Balloon")
    else:
        print("You are unable to afford this")

一旦主线程退出,守护进程线程就会被杀死。例如,如果您的后台线程正在重写文件,则可能会很危险,因为您可能会在写入一半的时候得到损坏的文件。但是在这里,您的所有后台线程所做的只是睡眠,并修改了主线程使用的一些变量,在退出时不再关心它们,因此很安全。

答案 1 :(得分:0)

有多种方法可以编写游戏中的事件循环。线程和异步是您可能要考虑的一些更高级的方法。

但是最简单的方法是将所有更新放入while循环中。导入时间,并在主循环内添加if语句,以检查自上次更新以来是否已过去至少一秒钟。如果有,请更新您的状态变量。

游戏引擎通常会在主循环中有一个任务循环,其中包含需要随时间变化的所有实体的列表。然后,它在每个实体上调用update()方法。然后,每个实体都会检查时钟并根据当前时间决定要更改多少。

while True:
    for entity in entities:
        entity.update()

但是,您的input调用将阻止主循环运行。考虑使用tkinter代替输入,因为这不会阻塞。

答案 2 :(得分:0)

其他答案在向您介绍多线程和事件循环方面做得很好,如果您需要在等待输入时向用户报告更改,则这是正确的答案。但是在您的情况下,由于您不报告添加的新资金,因此您可以等到收到输入后再更新资金状态。也就是说,您可以从主输入循环中更新货币状态,如下所示:

import time

money = 1
money_ps = 0
score = 0
last_update_time = int(time.time())

def update_money():
    global money, last_update_time
    new_time = int(time.time())
    money = money + (new_time - last_update_time)
    last_update_time = new_time

while score==0:
    inp=input().lower()
    update_money()

    if inp=="buy" or inp=="purchase":
        print("What would you like to buy")
        print("•Red Balloon (£1)")
        print("•Blue Balloon (£100)")
        print("•Yellow Balloon (£10000)")   
        print("•Green Balloon (£1000000)")
        print("•Pink Balloon (£100000000)")
        inp=input().lower()
        update_money()
        if inp=="red balloon":
            if money >= 1:
                money_ps=money_ps+0.1
                money=money-1
                print("You successfully bought a Red Balloon")
            else:
                print("You are unable to afford this")
        elif inp=="blue balloon":
            if money >= 100:
                money_ps = money_ps+1
                money = money - 1
                print("You successfully bought a Blue Balloon")
            else:
                print("You are unable to afford this")
    elif inp=="bank":
        print("You have £", money)