使用Python计时器的硬币接受器

时间:2018-01-28 07:03:36

标签: python raspberry-pi

我无法搞清楚这段代码。我目前正在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')

感谢您的帮助!

2 个答案:

答案 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引脚状态改变,我猜它会依赖于中断,这样你就不会错过一个事件。调查一下这可能是一个好主意。