Использование кнопки, чтобы выйти из игры «Каменная бумага» - PullRequest
0 голосов
/ 24 января 2019

плохо знакомы с программированием, пожалуйста, потерпите меня .......

У меня есть игра «камень / бумага / ножницы», которая отлично работает. Я знаю, что, вероятно, мог бы сделать это с 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 голосов
/ 24 января 2019

Ваш основной игровой цикл - цикл while. Вместо while True вы могли бы иметь while running и затем установить running в False, когда хотите, чтобы ваша игра заканчивалась. Затем вы можете использовать функцию обратного вызова btn.when_pressed в gpiozero, чтобы установить для кнопки 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, вам придется продолжать до конца итерация до того, как она остановится.

...