Seite 1 von 1

Über Graphen loopen

Verfasst: Donnerstag 4. Dezember 2025, 21:42
von Bright4.55
Hallo zusammen,

ich würde gerne eine Funktion programmieren, die mir alle Positionen zurückgibt, welche bei einem Graphen noch nicht belegt sind. Bei dem Graphen würde es sich um ein Spielbrett handeln. Dies sind Auszüge von dem Coding:

Code: Alles auswählen


class Board:

    def __init__(self, width, height, visualizer=None):

        self.width = width
        self.height = height
        self.points = []
        self.connections = []
        self.fixedpoints = {
            "corners": [(1, 1), (self.width, 1), (1, self.height), (self.width, self.height)],
            "edgepoints_red_bottom": [(x, 1) for x in range(2, self.width)],
            "edgepoints_red_top": [(x, self.height) for x in range(2, self.width)],
            "edgepoints_black_left": [(1, x) for x in range(2, self.height)],
            "edgepoints_black_right": [(self.width, x) for x in range(2, self.height)],
        }
        self.visualizer = visualizer
        self.graph_red = nx.Graph()
        self.graph_black = nx.Graph()

Code: Alles auswählen


        array_x = []
        array_y = []
        for x in range(1, self.board.height+1):
            for y in range(1, self.board.width+1):
                if (x == 1 and y == 1) or (x == 1 and y == self.board.width) or (x == self.board.height and y == 1) or (x == self.board.height and y == self.board.width): 
                    pass
                else:
                    array_x.append(y)
        for x in range(1, self.board.height+1):
            for y in range(1, self.board.width+1):
                if (x == 1 and y == 1) or (x == 1 and y == self.board.width) or (x == self.board.height and y == 1) or (x == self.board.height and y == self.board.width): 
                    pass
                else:
                    array_y.append(x)
        x = np.array(array_x)
        y = np.array(array_y)

Und wenn nun ein Stein auf ein Feld gesetzt wird:

Code: Alles auswählen


    def setpoint(self, x, y):

        # save the point in list
            self.board.add_point(self.color, x, y)

Weiß jemand nun wie man eine Funktion programmiert, die mir alle Felder von dem Graphen(Spielbrett) zurückgibt, welche noch nicht belegt sind?

Vielen Dank im Voraus

Re: Über Graphen loopen

Verfasst: Sonntag 7. Dezember 2025, 11:31
von imonbln
Bright4.55 hat geschrieben: Donnerstag 4. Dezember 2025, 21:42

Code: Alles auswählen

       array_x = []
        array_y = []
        for x in range(1, self.board.height+1):
            for y in range(1, self.board.width+1):
                if (x == 1 and y == 1) or (x == 1 and y == self.board.width) or (x == self.board.height and y == 1) or (x == self.board.height and y == self.board.width): 
                    pass
                else:
                    array_x.append(y)
        for x in range(1, self.board.height+1):
            for y in range(1, self.board.width+1):
                if (x == 1 and y == 1) or (x == 1 and y == self.board.width) or (x == self.board.height and y == 1) or (x == self.board.height and y == self.board.width): 
                    pass
                else:
                    array_y.append(x)
        x = np.array(array_x)
        y = np.array(array_y)
Dieser Code verwirrt mich. Was bitte ist self.board, und ist dieser Code Teil der Board-Klasse oder befindet er sich irgendwo anders im Projekt?

Grundsätzlich kann man sagen: Über range zu iterieren ist immer falsch, und beide for-Schleifen, die über x und y gehen, machen exakt dasselbe. Vermutlich kann man einfach array_x.append(y) und array_y.append(x) untereinander schreiben, ohne dass sich die Eigenschaften ändern.

Die if-Bedingung mit einem pass zu schreiben, ist ebenfalls falsch. Wenn du nur den else-Zweig brauchst, musst du das if invertieren. Falls dir das schwerfällt, ist das ein guter Hinweis darauf, dass etwas mit der Logik nicht stimmt , möglicherweise wäre es dann Zeit für ein Refactoring.

Beschreibe doch einmal in Prosa, was dieser Code tun soll. Ich bin mir ziemlich sicher, dass es eine elegantere Lösung gibt als diese.
Bright4.55 hat geschrieben: Donnerstag 4. Dezember 2025, 21:42 Weiß jemand nun wie man eine Funktion programmiert, die mir alle Felder von dem Graphen(Spielbrett) zurückgibt, welche noch nicht belegt sind?
Die eigentliche Frage ist relativ einfach: add_point(self.color, x, y) setzt offensichtlich eine Farbe. Ergo sind alle Felder frei, die keine Farbe haben. Du musst also über das gesamte Feld iterieren und die Felder zurückgeben, die keine Farbe besitzen. Wie du in deiner Programmlogik ausdrückst, dass ein Feld keine Farbe hat, geht aus den Snippets leider nicht hervor.

Re: Über Graphen loopen

Verfasst: Sonntag 7. Dezember 2025, 13:20
von noisefloor
Hallo,

wenn das Spielfeld ein Numpy Array ist, dann kann du mit numpy where abfragen, welche Elemente im Array einer Bedingung entsprechen. Wenn z.B. `data` den Array mit dem Spielfeld enthalten würde und der Wert `0` ein leeres Feld darstellt, würde `empty_fields = numpy.where(data==0)` die Indizes der leeren Felder liefern. Für die belegten Felder kann man numpy nonzero nehmen.

Gruß, noisefloor