Spielerisch Lernen - [Teil 1]

Spiele selbst programmieren und Spiele-Controller mit wenig Aufwand selbst herstellen - Teil 1

Um nicht aus der Übung zu kommen, mache ich gelegentlich Online-Seminare bei der Raspberry Pi Foundation mit oder schaue mir die vielen Beispiele an, die auf deren Homepage veröffentlicht sind. Auf diese Weise wurde ich auf die Spiele Turtle Race (als Beispiel für das Modul Turtle Graphics) und Pong (als Beispiel für das Modul pygame zero) aufmerksam.

Beim ersten Spiel rennen vier kleine Schildkröten um die Wette; eine Zufallszahl bestimmt jeweils die Schrittweite. Mir fehlte dabei allerdings die Mitwirkung der (bis zu vier) Spieler. Für das zweite Spiel – ein Klon des ersten erfolgreichen Arkade-Game - fehlten mir die Paddles, wie diese Controller seinerzeit genannt und von Atari in großer Stückzahl gefertigt wurden. Die kann man höchstens noch auf einem Flohmarkt zufällig bekommen. Also ´ran ans Werk und selber machen.

Benötigte Hardware

Außer dem benötigten Kabel und einem Analog-Digitalwandler ist auf dem Bild oben links alles abgebildet, was wir für unsere Spiele-Controller benötigen: Ü-Eier (alternativ Sektkorken), Taster und Potentiometer mit 10 kOhm.





Die Bilder sprechen für sich: Ü-Ei oben und unten durchbohren, Ü-Ei öffnen (schade, nichts mehr drin), Taster bzw. Potentiometer einbauen, Kabel durchziehen und anlöten. Ü-Ei wieder schließen. Fertig.

Nun zu dem ersten Spiel, für das die Controller mit den Tastern (buttons) benötigt werden.

Der Aufbau

Zunächst das Schaltbild:


Für die Spiele-Controller mit den Tastern verwende ich die GPIOs 6, 13, 19 und 26, die gegen den nahegelegenen GND-Pin geschlossen werden. So kann ich die Button-Objekte mit den Voreinstellungen von gpiozero instanziieren.

Meine Schildkröten habe ich nach den unvergessenen Teenage Mutant Ninja Turtles, dem Kino-Film der 1990-er Jahre benannt (und deren Namen gehen ja auf die alten italienischen Meister zurück). Damit es auch bei ungleichen Spielern spannend bleibt, spielt der Zufall ein wenig mit. Pro Klick bewegt sich die Schildkröte mit randint(7,9) 7, 8 oder 9 Pixel vorwärts.

Die Software

# Turtle race with four buttons to be pressed as often as possible
# Random steps of 7 to 9 units per click
# based on projects.raspberrypi.org/en/projects/turtle-race
# Empfehlung: Deutsche Projekte unter projects.rapberrypi.org/de-DE/projects
# Die Namen in Erinnerung an die unvergesslichen Teenage Mutant Ninja Turtles
# und deren Namensgeber, die italienischen Meister

import turtle
from turtle import Turtle
from random import randint
from gpiozero import Button
from signal import pause

Leonstep=0
Rafistep=0
Mickstep=0
Donnystep=0
play=True

button1 = Button(6)
button2 = Button(13)
button3 = Button(19)
button4 = Button(26)

def Leonforward():
    global Leonstep
    Leonstep=randint(7,9)

def Rafiforward():
    global Rafistep
    Rafistep=randint(7,9)

def Mickforward():
    global Mickstep
    Mickstep=randint(7,9)

def Donnyforward():
    global Donnystep
    Donnystep=randint(7,9)

finish=Turtle()
finish.penup()
finish.goto(200,200)
finish.pendown()
finish.goto(200,-50)
finish.hideturtle()

Leon = Turtle()
Leon.color("red")
Leon.shape("turtle")
Leon.penup()
Leon.goto(-200,150)
Leon.pendown()

Rafi = Turtle()
Rafi.color("green")
Rafi.shape("turtle")
Rafi.penup()
Rafi.goto(-200,100)
Rafi.pendown()

Mick = Turtle()
Mick.color("blue")
Mick.shape("turtle")
Mick.penup()
Mick.goto(-200,50)
Mick.pendown()

Donny = Turtle()
Donny.color("pink")
Donny.shape("turtle")
Donny.penup()
Donny.goto(-200,0)
Donny.pendown()


while play:
    button1.when_pressed = Leonforward
    if Leonstep!=0:
        Leon.forward(Leonstep)
        Leonstep=0
        if Leon.xcor()>200:
            print("Red Turtle wins")
            play=False
    button2.when_pressed = Rafiforward
    if Rafistep!=0:
        Rafi.forward(Rafistep)
        Rafistep=0
        if Rafi.xcor()>200:
            print("Green Turtle wins")
            play=False    
    button3.when_pressed = Mickforward
    if Mickstep!=0:
        Mick.forward(Mickstep)
        Mickstep=0
        if Mick.xcor()>200:
            print("Blue Turtle wins")
            play=False
    button4.when_pressed = Donnyforward
    if Donnystep!=0:
        Donny.forward(Donnystep)
        Donnystep=0
        if Donny.xcor()>200:
            print("Pink Turtle wins")
            play=False

print()
print("Distance to finish line:")
print("Red Turtle",200-Leon.xcor())
print("Green Turtle",200-Rafi.xcor())
print("Blue Turtle",200-Mick.xcor())
print("Pink Turtle",200-Donny.xcor())

button1.close()
button2.close()
button3.close()
button4.close()            
turtle.bye() 

Download Code

Hier noch einmal der Link zur Dokumentation von gpiozero:

Viel Spaß beim Nachvollziehen und ggf. Verbessern des Programm-Codes, beim Basteln der Spiele-Controller und natürlich beim Spielen. Im zweiten Teil werde ich zeigen, wie die Spiele-Controller mit den Potentiometern als Paddles eingesetzt werden.


Überraschung für mich beim Herstellen des Bildschirmfotos: Beim Aktivieren des Programms scrot verschwanden die Schildkröten vollständig aus dem aktiven Fenster. Deshalb habe ich dieses Bild mit der Kompaktkamera gemacht. Vielleicht finde ich irgendwann eine Erklärung dafür.

Projekte für anfänger

1 Kommentar

Tobias

Tobias

In den Links in den Code-Kommentaren fehlt ein ‘s’ (___ => projects.ra___pberrypi.org/en/projects/turtle-race).
Ansonsten Cooles Projekt, das werde ich mal ausprobieren. Klasse fände ich es, wenn ihr kleine Bundles schnüren würdet, so das man mit einem Klick das passende bestellen kann.

Gruß, Tobias

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert