硬币接受器与蟒蛇计时器



我在弄清楚这段代码时遇到了麻烦。我目前正在用python制作一个脚本,当你有30秒的时间继续并且你可以插入更多的硬币再次前进时,它就像街机的工作方式一样。我遇到的麻烦是,当计时器倒计时时,我无法让硬币计数。这是我到目前为止的代码:

while True:
start = GPIO.input(startBtn)
input_state = GPIO.input(counterPin)
if input_state == False:
coins += 1
print(str(coins) + "¢ inserted")
time.sleep(0.09)
if coins == 100:
coins -= 100
creditss += 1
print("You currently have: " +str(creditss) + " credits")
timer = creditss * 5
if start == False:
if creditss > 0:
print("You have: " +str(timer) + " minutes to play!")
print("Have Fun!")
x = timer
for i in range(x + 1):
time.sleep(1)
print(formatTime(x))
x -= 1
timer -= creditss * 5
creditss = 0
if timer == 0:
pause()
timer += 30
print("Continue? : Insert more money to keep playing!")
x = timer
if input_state == False:
coins += 1
print(str(coins) + "¢ inserted")
time.sleep(0.09)
else:
for i in range(x + 1):
time.sleep(1)
print(formatTime(x))
x -= 1
if coins == 100:
coins -= 100
creditss += 1
print(creditss)
if creditss > 0 & timer != 0:
print("Good")
pause()
else:
print("exit")
os.system('/home/pi/exit.sh')

感谢您的任何帮助!

好的...我能给你的最好的帮助是:

此时,您需要重构代码。 当你得到一个嵌套超过两到三个级别的程序(你有四个if语句嵌套),那么你应该定义函数并将程序的不同部分拆分为逻辑块。 这使得调试更容易,因为您可以删除 I/O 打印语句以查看脚本失败的位置。

为了帮助您知道首先要拆分的内容 - 查找您要重复的部分。 如果你多次输入它,它应该有自己的功能(DRY 原则 - 不要重复自己)。

例如,您有:

if coins == 100:
coins -= 100
creditss += 1
print("You currently have: " +str(creditss) + " credits")
timer = creditss * 5

if coins == 100:
coins -= 100
creditss += 1
print(creditss)

此功能非常相似,可以拆分为一个函数。 你要考虑的另一件事:你只希望程序的/one/部分能够改变硬币的数量,这样你就知道你什么时候调用它发生了什么(显式比隐式更好)。 这应该是一个函数,任何需要操作它的东西都可以调用它。 程序越容易阅读,调试就越容易。 至少在你遇到静默失败的问题之前。

sleep函数停止执行,因此在倒计时期间,每次您睡觉时,您都会停止检查 GPIO 状态整整一秒钟,然后再次检查它,直到再次睡眠一秒钟。要使此策略起作用,您需要非常快速地检查输入,以免错过快速事件。我的猜测是,每一秒检查一次可能不足以满足你正在做的事情。

一个更好的解决方案是不睡觉并使用time.clock()来检查游戏时间何时结束。因此,当游戏开始时,您存储time.clock()的当前值,然后继续检查它,直到经过足够的时间。可能仍然有一个输入可以更快地取消设置和设置您的输入引脚,您的循环可以检测到它,因此它不是防弹的。

我没有在 raspberry-pi 上使用 python 的经验,但快速的谷歌搜索显示我可以设置GPIO.add_event_detect()GPIO.add_event_callback()函数,以便在 GPIO 引脚状态更改时调用回调函数,我猜它依赖于中断,这样你就不会错过一个事件。对此进行调查可能是个好主意。

最新更新