因此,我只创建一个基本游戏,您购买气球,而购买的每个气球都会增加您每秒获得的金钱。但是考虑到我已经有了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)
非常感谢您的帮助
答案 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)