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()
Inhaltsverzeichnis:
1. Vorwort2. 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