import pygame import sys from random import * BREITE = 60 HOEHE = 30 # EINHEIT gibt die Seitenlänge eines Quadrats in Pixel an. EINHEIT = 25 # Dictionary: Speichert die Farben für die Zustände eines Feldes: farbe = { 'leer' : [0, 0, 0], 'raster' : [150, 155, 165], 'rand' : [0, 0, 255], 'schlange' : [255, 0, 0], 'apfel' : [0, 255, 0], 'schrift' : [255, 255, 255], } def zeichne_quadrat_ohne_update(x, y, zeichenfarbe): rechteck = pygame.Rect(x*EINHEIT, HOEHE*EINHEIT-y*EINHEIT-EINHEIT, EINHEIT, EINHEIT) pygame.draw.rect(surface=fenster, color=farbe['raster'], rect=rechteck) rechteck = pygame.Rect(x*EINHEIT, HOEHE*EINHEIT-y*EINHEIT-EINHEIT, EINHEIT-1, EINHEIT-1) pygame.draw.rect(surface=fenster, color=zeichenfarbe, rect=rechteck) def zeichne_quadrat_mit_update(x, y, zeichenfarbe): rechteck = pygame.Rect(x*EINHEIT, HOEHE*EINHEIT-y*EINHEIT-EINHEIT, EINHEIT, EINHEIT) q1 = pygame.draw.rect(surface=fenster, color=farbe['raster'], rect=rechteck) rechteck = pygame.Rect(x*EINHEIT, HOEHE*EINHEIT-y*EINHEIT-EINHEIT, EINHEIT-1, EINHEIT-1) q2 = pygame.draw.rect(surface=fenster, color=zeichenfarbe, rect=rechteck) pygame.display.update([q1, q2]) def schreibe(x, y, text, groesse=1): schrift = pygame.font.SysFont('freemono', round(groesse * EINHEIT)) formatierter_text = schrift.render(text, True, farbe['schrift'], farbe['leer']) rechteck = formatierter_text.get_rect() rechteck.center = [x*EINHEIT, HOEHE*EINHEIT-y*EINHEIT-EINHEIT] fenster.blit(formatierter_text, rechteck) pygame.display.update() pygame.init() pygame.display.set_caption("Snake") uhr = pygame.time.Clock() fenster = pygame.display.set_mode((BREITE*EINHEIT, HOEHE*EINHEIT+3*EINHEIT)) print(""" Snake Steuerung mit Pfeiltasten. Für jeden gefressenen Apfel gibt es einen Punkt, die Schlange verlängert sich um ein Feld und die Frame rate wächst um 1. Du hast 5 Leben. Fenster schliessen per Maus oder per Taste 'q' """) # Initialisierung for x in range(BREITE): for y in range(HOEHE): zeichne_quadrat_ohne_update(x, y, farbe['leer']) for x in range(BREITE): zeichne_quadrat_ohne_update(x, 0, farbe['rand']) # Zeichne oberen Rand und seitliche Ränder. punkte = 0 leben = 5 laenge = 5 x = randrange(BREITE//3, 2*BREITE//3) y = randrange(HOEHE//3, 2*HOEHE//3) schlange = [[x, y] for _ in range(laenge)] richtung = [1, 0] zeichne_quadrat_ohne_update(schlange[0][0], schlange[0][1], farbe['schlange']) pygame.display.flip() frames_pro_sekunde = 1 spielende = False # wird True, sobald der Benutzer das Fenster schliesst oder die Taste 'q' drückt. while True: schreibe(BREITE//2, HOEHE//2, 'Drücke Pfeiltaste nach oben.') for ereignis in pygame.event.get(): if ereignis.type == pygame.QUIT: print('Fenster schliessen.') spielende = True elif ereignis.type == pygame.KEYDOWN: if ereignis.key == pygame.K_q: print('Taste "q" gedrückt.') spielende = True elif ereignis.key == pygame.K_UP: print('Pfeiltaste UP gedrückt') richtung = [1, 2] x, y = schlange[0] xneu, yneu = x + richtung[0], y + richtung[1] zeichne_quadrat_mit_update(xneu, yneu, farbe['schlange']) schlange.insert(0, [xneu, yneu]) schreibe(BREITE//2, -2.5, f'{punkte=}, {leben=}, {laenge=}, {frames_pro_sekunde=:.1f}') if spielende: pygame.time.wait(500) pygame.quit() sys.exit() uhr.tick(frames_pro_sekunde)