我无法搞清楚这段代码。我目前正在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')
感谢您的帮助!
答案 0 :(得分:0)
好的......我能给你的最好的帮助是:
此时您需要重构代码。当你得到一个具有两到三个嵌套级别的程序时(你有四个if语句嵌套),那么你应该定义函数并将程序的不同部分拆分成逻辑块。这使调试更容易,因为您可以删除I / O打印语句以查看脚本失败的位置。
为了帮助您了解首先要拆分的内容 - 查找您自己重复的部分。如果你不止一次输入它,它应该有自己的功能(干燥原则 - 不要自己重复)。
例如,你有: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)
此功能非常相似,可能会分成一个功能。你想要考虑的另一件事:你只希望/一个/部分程序能够改变硬币的数量,以便你知道什么时候你正在调用它发生了什么(显性更好)比隐含的)。这应该是一个功能,任何需要操作它的东西都可以调用它。程序读取越容易,调试就越容易。至少在你遇到无声失败的问题之前。
答案 1 :(得分:0)
sleep
函数停止执行,因此在每次睡眠时倒计时期间,您停止检查GPIO状态一整秒,然后再检查一次,直到再次休眠一秒钟。要使此策略起作用,您需要非常快速地检查输入,以免错过快速事件。我的猜测是,每秒检查一次可能不足以满足您的需求。
一个更好的解决方案是不睡觉并使用time.clock()
检查播放时间何时结束。因此,当游戏开始时,您存储当前值time.clock()
,然后继续检查它,直到经过足够的时间。可能仍然有一个输入会取消设置并将输入引脚设置得更快,您的循环可以检测到它,因此它不是防弹的。
我没有使用raspberry-pi上的python经验,但快速谷歌搜索显示我可以设置GPIO.add_event_detect()
和GPIO.add_event_callback()
函数,以便调用回调函数一个GPIO引脚状态改变,我猜它会依赖于中断,这样你就不会错过一个事件。调查一下这可能是一个好主意。