1

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

我有一个完美运行的摇滚/纸/剪刀游戏。我知道我可能可以用我实际使用的代码的 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   

谢谢

4

1 回答 1

0

您的主要游戏循环是 while 循环。当您希望游戏结束时,while True您可以拥有while running然后设置为 False。running然后,您可以使用 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行上,您必须继续到迭代结束,然后它才会停止.

于 2019-01-24T11:43:40.023 回答