Homepage von Papa

Projekt Snake

Der finale Stand

Zum Abschluss hier noch einmal der finale Code als Version mit auskommentierten oder gelöschten print()-Anweisungen. Nutzt zum Herunterladen gerne den Download-Button ganz unten, oder den Kopier-Button im Listing oben rechts.

###################################################
#  Definition der Importe
###################################################
import pygame
import random

###################################################
#  Definition der Konstanten und Variablen
###################################################

#  Werte fuer das Spielefenster
BREITE = 800
HOEHE = 400

# Spielsteuerung
spielen = True
verloren = False

# Farben RGB (Red, Green, Blue), jeweils 0 - 255
ROT = (255,0,0)
GRUEN = (0,255,0)
BLAU = (0,0,255)
WEISS = (255, 255, 255)
SCHWARZ = (0, 0, 0)

# Positionen der oberen linken Ecke des Kopfes
snake_x = BREITE/2
snake_y = HOEHE/2

# Bewegungen auf der x- und der y-Achse
snake_bewegung_x = 0
snake_bewegung_y = 0

# Geschwindigkeiten
zeit = pygame.time.Clock()
snake_geschwindigkeit = 10

# Groesse des Quadrats
quadrat_seite = 10

# Essen zubereiten
# Liste der x-Positionen
liste_essen_x = []
# Liste der y-Positionen
liste_essen_y = []
# Position von x
essen_x = 0
# Position von y
essen_y = 0

# Liste zur Speicherung des Kopfes und der gefressenen Quadrate
snake_als_liste = []
# Startwert der Länge der Schlange bei Spielbeginn ist 1 (der Kopf halt...)
snake_laenge = 1

###################################################
#  Definition der Funktionen
###################################################

def futter_vorbereiten():
    print('in futter_vorbereiten')
    e_x = 0
    e_y = 0
    for i in range (0, int(BREITE/quadrat_seite)):
        liste_essen_x.append(e_x)
        e_x += quadrat_seite
    #print('liste_essen_x = ', liste_essen_x)
    for i in range (0, int(HOEHE/quadrat_seite)):
        liste_essen_y.append(e_y)
        e_y += quadrat_seite
    #print('liste_essen_y = ', liste_essen_y)


def fenster_definieren():
    print('in fenster_definieren')
    pygame.init()
    f = pygame.display.set_mode((BREITE,HOEHE))
    pygame.display.set_caption('Snake – das Schlangenspiel')
    return f


def spielschleife_aufrufen():
    print('in spielschleife_aufrufen')
    global spielen, snake_x, snake_y, quadrat_seite, snake_bewegung_x, snake_bewegung_y, \
           snake_laenge, verloren, snake_als_liste

    essen_x = random.choice(liste_essen_x)
    essen_y = random.choice(liste_essen_y)

    while spielen:

        # dieser Teil wird nur aufgerufen, wenn das Spiel verloren wurde
        while verloren:
            fenster.fill(BLAU)
            nachricht_anzeigen("Verloren! Nochmal mit \"c\", verlassen mit \"q\" ", ROT)
            pygame.display.update()
            
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        spielen = False
                        verloren = False
                    if event.key == pygame.K_c:
                        spielen = True
                        verloren = False
                        snake_x = BREITE/2
                        snake_y = HOEHE/2
                        snake_bewegung_x = 0
                        snake_bewegung_y = 0
                        snake_als_liste = []
                        snake_laenge = 1
                        futter_vorbereiten()
                        spielschleife_aufrufen()

                if event.type == pygame.QUIT:
                    spielen = False
                    verloren = False

        for event in pygame.event.get():
            # Ausgeben aller Aktivitaeten, die innerhalb des Fensters stattfinden
            # print(event)
            # wenn das x im Fenster gedrueckt wird, soll das Fenster zugehen
            if event.type == pygame.QUIT:
                spielen = False

            # die Tastatur abfragen
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    snake_bewegung_x = quadrat_seite
                    snake_bewegung_y = 0
                elif event.key == pygame.K_LEFT:
                    snake_bewegung_x = quadrat_seite * -1
                    snake_bewegung_y = 0
                elif event.key == pygame.K_UP:
                    snake_bewegung_x = 0
                    snake_bewegung_y = quadrat_seite * -1
                elif event.key == pygame.K_DOWN:
                    snake_bewegung_x = 0
                    snake_bewegung_y = quadrat_seite

        # Abfrage, ob die Schlange aus dem Fenster verschwindet.
        # Wenn ja, dann wird die Variable verloren auf True gesetzt
        if snake_x >= BREITE or snake_x < 0 or snake_y >= HOEHE or snake_y < 0:
            verloren = True

        # Wenn nein, wird
        # - die Veraenderung als neue Position gespeichert
        # Fenster wird neu aufgebaut
        else:
            snake_x += snake_bewegung_x
            snake_y += snake_bewegung_y
            fenster.fill(SCHWARZ)
            pygame.draw.rect(fenster, GRUEN, [essen_x, essen_y, quadrat_seite, quadrat_seite])

            # aktuelle Position des Kopfes in einer Liste speichern...
            snake_kopf = []
            snake_kopf.append(snake_x)
            snake_kopf.append(snake_y)
            #print('snake_als_liste = ', snake_als_liste)

            # ... und an die bestehende Liste anhaengen
            snake_als_liste.append(snake_kopf)

            # der letzte Eintrag wird geloescht, damit der Eindruck entsteht,
            # dass sich die Schlange bewegt
            if len(snake_als_liste) > snake_laenge:
                del snake_als_liste[0]

            # die Spur augeben
            for snake in snake_als_liste:
                pygame.draw.rect(fenster, ROT, [snake[0], snake[1], quadrat_seite, \
                                                quadrat_seite])

            # das Essen wurde gefangen, also erhoeht sich die Laenge der Schlange um ein
            # Quadrat. Dann muss auch noch ein neues Futter-Quadrat platziert werden
            if snake_x == essen_x and snake_y == essen_y:
                snake_laenge += 1
                essen_x = random.choice(liste_essen_x)
                essen_y = random.choice(liste_essen_y)

            # Ausgabe Spielstand - immer 1 weniger, als die Schlange lang ist
            spielstand_anzeigen(snake_laenge - 1)

            pygame.display.update()
            zeit.tick(snake_geschwindigkeit)


def spielstand_anzeigen(punktestand):
    schrift_punktestand = pygame.font.SysFont("playbill", 35)
    anzeige = schrift_punktestand.render("Spielstand: " + str(punktestand), True, BLAU)
    fenster.blit(anzeige, [0, 0])


def nachricht_anzeigen(nachricht, farbe):
    font_style = pygame.font.SysFont("arial", 25)
    bild = font_style.render(nachricht, True, farbe)
    fenster.blit(bild, [180, HOEHE/2])


def spiel_verlassen():
    print('in spiel_verlassen')
    pygame.quit()
    quit()


###################################################
#  Programmstart
###################################################

print('Programmstart!')

futter_vorbereiten()

fenster = fenster_definieren()

spielschleife_aufrufen()

spiel_verlassen()

  • Zurück
  • Weiter

Inhaltsverzeichnis:

1. Vorwort
2. Das Projekt
3. Vorarbeiten
4. Projekt Snake
4.1. Der Funktionsumfang
4.2. Die Planung der Umsetzung
4.3. Das Coden
4.3.1. Das Grundgerüst
4.3.2. Das Fenster
4.3.3. Der Schlangenkopf
4.3.4. Die Bewegung der Schlange
4.3.5. Kleine Verbesserungen
4.3.6. Das Futter platzieren
4.3.7. Die Schlange wächst
4.3.8. Den Spielstand ausgeben
4.3.9. Die Wiederholung
4.3.10. Der finale Stand
5. Abschluss

© by Papa. Die Seite ist online seit 2020.

Menu

  • Startseite
  • Projekte
    • Übersicht aller Projekte
    • Nachbau Snake
    • Taschenrechner
  • Helferlein
    • Übersicht Hilfprogramme
    • Fonts in pygame
    • Quellcode nach HTML
    • Text nach HTML
  • Impressum
  • Disclaimer
This is message 1

Modal content goes here