Sperrbildschirmmuster von Android in Pygame

Passwort_3.gif

Die Implementierung des Sperrmusters von Android in Pygame ist ein interessanter Versuch, großartige Uis zu verspotten.

Schritte

Hier ist ein grober Überblick darüber, woran wir denken müssen:

  • Schaltflächen anzeigen
  • Benutzerauswahl aufzeichnen
  • Zeichnen Sie Muster basierend auf der Auswahl des Benutzers
  • Haben Sie eine Musterlänge
  • Überprüfung des richtigen Passworts
  • Auswahl zurücksetzen

Ich empfehle, dass Sie versuchen, es in Pygame oder P5py zu implementieren, und dann zurückkommen, um den Artikel zu lesen.

Das Skelett

Wir benutzen Mann in diesem Tutorial, das die p5js-API in Pygame implementiert.

python -m pip install hooman

Hier ist ein einfaches Skelett, das ein leeres Fenster anzeigt

from hooman import Hooman

import pygame

pen = Hooman(500, 500)


while pen.is_running:
    pen.background(255)


    pen.flip_display()
    pen.event_loop()

Schaltflächen anzeigen

Lassen Sie uns unsere Musterschaltflächen als bloße Kreise implementieren

class LockButton:
    def __init__(self, x, y, pen, num=0):
        self.x = x
        self.y = y
        self.pen = pen
        self.num = num

    def coords(self):
        return (self.x, self.y)

    def draw(self):
        pen = self.pen
        pen.fill(0)
        pen.ellipse(self.x, self.y, 20, 20)

    def update(self):
        pass

    def run(self):
        self.update()
        self.draw()

Wir initialisieren sie dann in einer Liste


button_id = 1
for x in range(5):
    for y in range(5):

        buttons.append(LockButton(x * 50 + 10, y * 50 + 10, pen, num=button_id))
        button_id += 1

Dann ziehen Sie sie aus der Liste


while pen.is_running:
    

    
    for b in buttons:
        b.run()

    

pass3but.png

Benutzerauswahl aufzeichnen

Um die Benutzerauswahl aufzuzeichnen, zeichnen wir die Koordinaten der ausgewählten Schaltflächen auf, um nicht erneut eine Linie darauf zu zeichnen, und wir zeichnen die Schaltflächen-ID auf, damit wir sie leicht mit unserem Passwortmuster vergleichen können

from hooman import Hooman
from hooman.formula import distance

import pygame

pen = Hooman(500, 500)

attempt_button_coords = [] 
attempt_button_ids = [] 
buttons = [] 



class LockButton:
    

    def update(self):
        pen = self.pen
        global attempt_button_coords, attempt_button_ids

        if pen.pygame.mouse.get_pressed()[0]: 
            mouse_coords = (pen.mouseX(), pen.mouseY())
            if distance(self.coords(), mouse_coords) <= 20:
                if self.coords() not in attempt_button_coords:
                    attempt_button_ids.append(self.num)
                    attempt_button_coords.append(self.coords())

    

Zeichnen Sie Muster basierend auf der Auswahl des Benutzers

while pen.is_running:
    
    
    pen.fill(0)
    for i, c in enumerate(attempt_button_coords):
        try:
            pen.stroke_size(5)
            pen.stroke(pen.color["green"])
            pen.line(
                c[0] + 10,
                c[1] + 10,
                attempt_button_coords[i + 1][0] + 10,
                attempt_button_coords[i + 1][1] + 10,
            )
        except Exception as e:
            pass

    
    try:
        pen.line(
            attempt_button_coords[-1][0] + 10,
            attempt_button_coords[-1][1] + 10,
            pen.mouseX(),
            pen.mouseY(),
        )
    except:
        pass

user_choice.gif

Aber wir haben ein Problem: Die Muster gehen unendlich weiter.

Haben Sie eine Musterlänge

  
    
    if len(attempt_button_coords) >= 7:

        attempt_button_coords = []
        attempt_button_ids = []

Musterlänge.gif

Suchen Sie nach dem richtigen Passwort

display_win = False
pattern = [1, 2, 3, 4, 5, 6, 7] 

    
    
    if len(attempt_button_coords) >= 7:

        if attempt_button_ids == pattern: 
            display_win = True

        

    
    if display_win:
        pen.fill((200, 200, 50))
        pen.font_size(30)
        pen.text("Right password!", 300, 50)

right_password.gif

Hinzufügen der Reset-Taste

Damit wir ein Muster erneut versuchen können, fügen wir einen Reset-Button hinzu, der die Musterliste leert. Wir verwenden einen Human-Button.


from hooman.ui import Button


def reset_clicked(this):
    global attempt_button_coords, attempt_button_ids, display_win
    attempt_button_coords = []
    attempt_button_ids = []
    display_win = False

reset_button_styles = {
    "hover_background_color": (200, 200, 200),
    "font_size": 10,
    "background_color": (210, 210, 210),
    "on_click": reset_clicked,
    "curve": 1,
}
reset_button = Button(250, 10, 150, 20, "Reset", reset_button_styles)



while pen.is_running:
    

    reset_button.update()

reset_button.gif

Vollständiger Code

from hooman import Hooman
from hooman.formula import distance
from hooman.ui import Button

import pygame

pen = Hooman(500, 500)

attempt_button_coords = [] 
attempt_button_ids = [] 
buttons = [] 
display_win = False
pattern = [1, 2, 3, 4, 5, 6, 7] 



def reset_clicked(this):
    global attempt_button_coords, attempt_button_ids, display_win
    attempt_button_coords = []
    attempt_button_ids = []
    display_win = False


reset_button_styles = {
    "hover_background_color": (200, 200, 200),
    "font_size": 10,
    "background_color": (210, 210, 210),
    "on_click": reset_clicked,
    "curve": 1,
}
reset_button = Button(250, 10, 150, 20, "Reset", reset_button_styles)


class LockButton:
    def __init__(self, x, y, pen, num=0):
        self.x = x
        self.y = y
        self.pen = pen
        self.num = num

    def coords(self):
        return (self.x, self.y)

    def draw(self):
        pen = self.pen

        pen.fill(0)
        pen.ellipse(self.x, self.y, 20, 20)

    def update(self):
        pen = self.pen
        global attempt_button_coords, attempt_button_ids

        if pen.pygame.mouse.get_pressed()[0]:

            mouse_coords = (pen.mouseX(), pen.mouseY())
            if distance(self.coords(), mouse_coords) <= 20:
                if self.coords() not in attempt_button_coords:
                    attempt_button_ids.append(self.num)
                    attempt_button_coords.append(self.coords())

    def run(self):
        self.update()
        self.draw()



button_id = 1
for x in range(5):
    for y in range(5):

        buttons.append(LockButton(x * 50 + 10, y * 50 + 10, pen, num=button_id))
        button_id += 1


while pen.is_running:
    pen.background(255)

    
    pen.fill(0)
    for i, c in enumerate(attempt_button_coords):
        try:
            pen.stroke_size(5)
            pen.stroke(pen.color["green"])
            pen.line(
                c[0] + 10,
                c[1] + 10,
                attempt_button_coords[i + 1][0] + 10,
                attempt_button_coords[i + 1][1] + 10,
            )
        except Exception as e:
            pass

    
    try:
        pen.line(
            attempt_button_coords[-1][0] + 10,
            attempt_button_coords[-1][1] + 10,
            pen.mouseX(),
            pen.mouseY(),
        )
    except:
        pass

    
    for b in buttons:
        b.run()


    
    if len(attempt_button_coords) >= 7:

        if attempt_button_ids == pattern:
            display_win = True

        attempt_button_coords = []
        attempt_button_ids = []

    
    if display_win:
        pen.fill((200, 200, 50))
        pen.font_size(30)
        pen.text("Right password!", 300, 50)

    reset_button.update()

    pen.flip_display()
    pen.event_loop()

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *