import pygame import numpy as np import random n = 10 # minimal n-1, maximal n über 2, also n*(n-1)/2 anzahl_kanten = 12 maxx = maxy = 800 radius = 3 schriftgroesse = 20 pygame.init() leinwand = pygame.display.set_mode((maxx, maxy)) pygame.display.set_caption('Dijkstra, minimale Distanz') leinwand.fill('black') pygame.display.update() class Punkt: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return f'Punkt ({self.x}, {self.y})' def laenge(x, y): return (x**2+y**2)**0.5 class Kante: def __init__(self, startindex, zielindex): self.startindex = startindex self.zielindex = zielindex self.A = punkte[self.startindex] self.B = punkte[self.zielindex] self.laenge = round(laenge(self.B.x-self.A.x, self.B.y-self.A.y)) def __repr__(self): return f'Kante vom Punkt mit Index {self.startindex} zum Punkt mit Index {self.zielindex})' def __eq__(self, other): return {self.startindex, self.zielindex} == {other.startindex, other.zielindex} def schreibe(x, y, text): schrift = pygame.font.SysFont('freemono', round(schriftgroesse)) formatierter_text = schrift.render(text, True, 'white', 'black') rechteck = formatierter_text.get_rect() rechteck.center = (x, y) leinwand.blit(formatierter_text, rechteck) punkte = [] for _ in range(n): p = Punkt(random.randrange(maxx), random.randrange(maxy)) punkte.append(p) kanten = [] weg = list(range(n)) random.shuffle(weg) for i in range(n-1): kanten.append(Kante(weg[i], weg[i+1])) while True: if len(kanten) >= min(anzahl_kanten, n*(n-1)/2): break i = random.randrange(n) j = random.randrange(n) if not (Kante(i, j) in kanten): kanten.append(Kante(i, j)) for k in kanten: pygame.draw.line(leinwand, 'blue', (k.A.x, k.A.y), (k.B.x, k.B.y), width=2) schreibe((k.A.x+k.B.x)/2, (k.A.y+k.B.y)/2, str(k.laenge)) for p in punkte: pygame.draw.circle(leinwand, 'yellow', (p.x, p.y), radius, width=0) # Hier Code ergänzen. beenden = False while not beenden: pygame.display.update() for ereignis in pygame.event.get(): if ereignis.type == pygame.QUIT: beenden = True elif ereignis.type == pygame.KEYDOWN: if ereignis.key in {pygame.K_ESCAPE, pygame.K_q}: beenden = True elif ereignis.type == pygame.MOUSEBUTTONDOWN: beenden = True pygame.quit()