使用按钮退出剪刀石头布游戏

时间:2019-01-24 10:16:06

标签: python-3.x raspberry-pi3 gpiozero

编程新手,请多多包涵.......

我有一款完美玩的石头/剪刀布游戏。我知道我实际上可以用我实际使用的代码的10%完成此操作,但是请使用我的代码向我解释,这就是我目前的理解方式。 我想在代码中的某个位置添加一个按钮(GPIO03),以完全退出游戏。我已经尝试了2天。 but.is_pressed,but.wait_for_press等。我就是无法正常工作。也许有些我不知道的东西,或者我只是在错误地使用它。 有人可以添加或更改代码以在游戏中的任何位置按下按钮时完全退出游戏吗?我机智......

from gpiozero import LED, Buzzer, Button   
from time import sleep   
buz = Buzzer(2)   
but = Button(3)   

def rps():   
    ledg = LED(15)   
    ledr = LED(14)   
    ledw = LED(18)   

if p1 == 'r' and p2 == 'r':   
    print("Draw!!")   
    ledw.on()   
    sleep(3)   
    ledw.off()   
elif p1 == 'p' and p2 == 'p':    
    print("Draw!!")    
    ledw.on()   
    sleep(3)    
    ledw.off()    
elif p1 == 's' and p2 == 's':    
    print("Draw!!")    
    ledw.on()    
    sleep(3)    
    ledw.off()   
elif p1 == 'r' and p2 == 'p':    
    print("P2 wins!!")    
    ledr.on()     
    sleep(3)    
    ledr.off()    
elif p1 == 'r' and p2 == 's':    
    print("P1 wins!!")    
    ledg.on()    
    sleep(3)    
    ledg.off    
elif p1 == 'p' and p2 == 'r':    
    print("P1 wins!!")    
    ledg.on()    
    sleep(3)    
    ledg.off    
elif p1 == 'p' and p2 == 's':    
    print("P2 wins!!")    
    ledr.on()   
    sleep(3)   
    ledr.off()    
elif p1 == 's' and p2 == 'r':   
    print("P2 wins!!")   
    ledr.on()   
    sleep(3)   
    ledg.off   
elif p1 == 's' and p2 == 'p':   
    print("P1 wins!!")   
    ledg.on()   
    sleep(3)   
    ledr.off()         

while True:                  
    p1 = input("Choose r/p/s P1: (Type 'quit' to exit) ")            
    if p1 == 'r' or p1 == 'p' or p1 == 's':          
        pass      
    elif p1 == 'quit':   
        print("Bye!!")   
        break   
    else:     
        print("Invalid choice P1. Try again")    
        buz.on()   
        sleep(1)   
        buz.off()    
        continue   

    while True:   
        p2 = input("Choose r/p/s P2: (Type 'quit' to exit) ")   
        if p2 == 'r' or p2 == 'p' or p2 == 's':   
            pass   
        elif p2 == 'quit':   
            print("Chow!!")   
            return   
        else:   
            print("Invalid choice P2. Try again")   
            buz.on()   
            sleep(1)   
            buz.off()    
            continue   

        rps()   
        break   

谢谢

1 个答案:

答案 0 :(得分:0)

您的主要游戏循环是while循环。如果您不想结束游戏,可以使用while True代替while running,然后将running设置为False。然后,您可以使用gpiozero的btn.when_pressed回调功能,随时将按钮running设置为False,与游戏循环分开。

例如:

stop_btn = Button(20)

def end_game():
    global running
    running = False

btn.when_pressed = end_game

running = True
while running:
    i = input("Enter a number or type 'quit': ")
    if i == 'quit':
        running = False
        continue
    if i == '1':
        print("running")
print("finished")

但是,您必须意识到它必须完成循环迭代才能使while条件结束,因此在您的版本中,如果您停留在input行,则必须继续执行在迭代结束之前停止。