import time
from tty import ISPEED
import pygame, sys
from pygame.locals import *
import random
 
pygame.init()
FPS = 60
FramePerSec = pygame.time.Clock()
 
# gebrauchte Farben
BLUE  = (10, 150, 255) 
RED   = (200, 0, 0)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
 
# Bildschirminformationen: Veränderungen der Bildschirmgrösse sind hier möglich
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 800
pygame.display.set_caption("Die Qual der Qualle")

DISPLAYSURF = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))

 
#Fonts/Schriftzüge werden deffiniert
font = pygame.font.SysFont("Chiller", 60) # Die angezeigte Schriftart ist nicht Chiller, jedoch mag ich die, die Angezeit ist-> ich behalte es so. 
game_over = font.render("Spiel vorbei", True, RED)
gewonnen = font.render("Gewonnen!", True, BLACK)

#globale Variabeln
a = 2
b = 0
losgehts = False
anzahl = 50
Vorgeschichte = True
Tränen = pygame.image.load("Verloren.png")
Konfetti = pygame.image.load("Konfetti.png")
nurEinMal = True
happyEnd = False

class Netz(pygame.sprite.Sprite):
      
      def __init__(self):
        super().__init__() 
        self.image = pygame.image.load("Netz.png") #wird an das Bild weitergeleitet
        self.rect = self.image.get_rect() #schaut wo die Grenzen sind
        self.rect.center = (200,0) #Mittelpunkt des Netzes
        
      def move(self): # Grösse im Bild anpassen
        
        if self.rect.bottom >= 650: # Wenn es so weit unten ist dann
          self.rect.center = (3000, 3000)#das Netz geht aus dem Sichtfeld raus
          global happyEnd
          happyEnd = True
          
        else: 
          global a
          a = a + 1
          if a % 7 == 0: #ist a teibar durch z.B. 5, dann bewegt es sich, sonst nicht. weil es kann sich nicht um eine halbe Einheit nach unten bewegen. 
            self.rect.move_ip(0,1) #Geschwindigkeit, schneller als eine Einheit pro Frame
 
      def draw(self, surface):
        surface.blit(self.image, self.rect) 
 
class Hindernis (pygame.sprite.Sprite): 
      def __init__(self):
        super().__init__() 
        gegenstand = random.randint(1, 5)
        if gegenstand % 2== 0:# ich möchte mehr Luftblasen als Enten oder Säcke; darum soll jede zweite Zahl eine Luftblase sein
          self.image = pygame.image.load("Luftblase.png") #wird an das Bild weitergeleitet
        elif gegenstand == 1:
          self.image = pygame.image.load("sack3.png")
        else:
          self.image = pygame.image.load("ente3.png") 
        self.rect = self.image.get_rect() #schaut wo die Grenzen sind
        self.rect.center=(random.randint(-10, 410),random.randint(700,4010)) #Wo ist der Mittelpunkt des Hindernisses?: ich habe die zufällige Position so gewählt, dass sie auch ausserhalb sein kann. Denn sonst könnte man sich immer am Rand aufhalten, da dort weniger Hindernisse die Qualle mitreissen.
        Groesse = random.randint(15, 30) #für ein bisschen Abwechslung
        self.image = pygame.transform.scale(self.image, (Groesse, Groesse))#Grösse des Bildes anpassen, da alle Bilder Quadratisch sind, geht "Grösse" für Länge und Breite. 

 
      def move(self): 
        self.rect.move_ip(0,-1) #Geschwindigkeit
        
     
      def draw(self, surface):
        surface.blit(self.image, self.rect) 


class Qualle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__() 
        self.image = pygame.image.load("Qualle1.png")
        self.rect = self.image.get_rect()
        self.rect.center = (160, 620)#Wo soll die Qualle sein?
    global b 
    def update(self):
        pressed_keys = pygame.key.get_pressed()
        if pressed_keys[K_UP]:# es kann nie über das Netz, desswegen muss es gen oben keine Grenze haben. 
            self.rect.move_ip(0, -5)
        if self.rect.bottom < SCREEN_HEIGHT:#Qualle bleibt im Bildschirm   
            if  b == 0: #wenn ein Hindernis berührt wird, ist B Null und kann nicht nach unten schwimmen
              if pressed_keys[K_DOWN]:
                self.rect.move_ip(0,5)
        if self.rect.left > 0:
              if pressed_keys[K_LEFT]:
                  self.rect.move_ip(-5, 0)
        if self.rect.right < SCREEN_WIDTH:     
              if pressed_keys[K_RIGHT]:
                  self.rect.move_ip(5, 0)
 
    def draw(self, surface):
        surface.blit(self.image, self.rect)    

    def up(self): 
          self.rect.move_ip(0,-1) #Geschwindigkeit 



class Schild(pygame.sprite.Sprite):
    def __init__(self, höhe, bild):
        super().__init__() 
        self.image = pygame.image.load(bild)
        self.rect = self.image.get_rect()
        self.rect.center = (200, höhe)#Wo soll das Schild sein?
       
    def update(self, menge):
    
            if ( self.rect.collidepoint( mouse_position ) ):   # Wurde das Kästchen angeklickt?
                self.rect.center = (3000, 3000) #das muss vor dem Rest passieren, sonst wird es nicht ausgeführt. Es geht aus dem Sichtfeld raus. 
                global anzahl
                anzahl = menge
                global klick 
                klick = True
                global losgehts
                global Vorgeschichte
                losgehts = True
                Vorgeschichte = False
            

    def draw(self, surface):
        surface.blit(self.image, self.rect)    

          
#Das sind die ersten Sprites, die anderen werden später erstellt, da sie noch nicht für den ersten Teil des Spieles (Auswahl des Spielmodus) gebraucht werden

S1 = Schild(200, "easy.png")
S2 = Schild(400, "normal.png")
S3 = Schild(600, "hard.png")

# Sprites Gruppen erstellen
Schilder = pygame.sprite.Group()
for i in range (1,4):
    Schilder.add(globals()[f"S{i}"])


while True:
  #Erster Teil des Spieles; Wahl des Spielmodus
  while Vorgeschichte == True: 
    DISPLAYSURF.fill(BLUE)

    for entity in Schilder: 
       DISPLAYSURF.blit(entity.image, entity.rect)
    pygame.display.flip()
    

    klick = False
    while klick == False: # das habe ich gemacht, den sonst musste man sehr oft klicken, bis ein Klick genau dan bei der Abfrage gekommen ist. 
        for event in pygame.event.get():  
            if (event.type == pygame.MOUSEBUTTONUP):
                mouse_position = pygame.mouse.get_pos()    # Wo wurde rauf geklickt
                S1.update(45)
                S2.update(65)
                S3.update(85)
    

    for event in pygame.event.get():
        if event.type == QUIT:
          pygame.quit()
          sys.exit()

    #Haubtteil des Spiels
  while losgehts == True:
    if nurEinMal == True: # die Sprites und Sprite Gruppen werden nur ein Mal erstellt
        # Die neuen Sprites werdern erstellt
        P1 = Qualle()
        E1 = Netz() 
        for i in range(anzahl):
            globals()[f"H{i}"] = Hindernis()

    #Spritesgruppen
        Quallen = pygame.sprite.Group()
        Quallen.add(P1)

        all_sprites = pygame.sprite.Group()
        all_sprites.add(P1)
        all_sprites.add(E1)
        for i in range (anzahl):
            all_sprites.add(globals()[f"H{i}"])

        Hindernisse = pygame.sprite.Group()
        for i in range (anzahl):
            Hindernisse.add(globals()[f"H{i}"])
        nurEinMal = False
    
    P1.update()
    E1.move()
    for entity in Hindernisse: 
        entity.move()
        
        #Wenn das Netz die Qualle trift
    if pygame.sprite.spritecollideany(E1, Quallen):
        DISPLAYSURF.fill(BLACK)
        DISPLAYSURF.blit(game_over, (75,150)) # die Zahlen: Ort des Schriftzugs. 
        DISPLAYSURF.blit(Tränen, (5, 300)) 
        for entity in all_sprites:
          entity.kill() 
        pygame.display.flip()
        time.sleep(4)
        pygame.quit()
        sys.exit()

  
        #Wenn eine die erste Qualle ein Hindernis trifft
    if pygame.sprite.spritecollideany(P1, Hindernisse): 
       P1.up() # Die Qualle wird raufgeschoben
       b = 1
    else: 
       b = 0

    if happyEnd == True: 
      DISPLAYSURF.fill(BLUE)
      DISPLAYSURF.blit(Konfetti, (-30,-50))
      DISPLAYSURF.blit(gewonnen, (80,100))# die Zahlen: wo soll der Schriftzug sein?
      for entity in all_sprites:
          entity.kill() 
      pygame.display.flip()
      time.sleep(4)
      pygame.quit()
      sys.exit()
     
    DISPLAYSURF.fill(BLUE) #das muss vor den Anderen gezeichnet werden, sonst sieht man die Anderen nicht mehr-> zuerst den Hintergrund, dann den Rest darüber
    P1.draw(DISPLAYSURF)
    E1.draw(DISPLAYSURF)
    for entity in Hindernisse: 
       DISPLAYSURF.blit(entity.image, entity.rect)

    for event in pygame.event.get(): 
        if event.type == QUIT:
          pygame.quit()
          sys.exit()

    pygame.display.update()
    FramePerSec.tick(FPS) 

    # Tipp zum Spielen: in engen Situationen: Pfeile nach Links und nach Rechts helfen
   