Über Graphen loopen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bright4.55
User
Beiträge: 3
Registriert: Mittwoch 26. November 2025, 10:31

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
imonbln
User
Beiträge: 196
Registriert: Freitag 3. Dezember 2021, 17:07

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.
Benutzeravatar
noisefloor
User
Beiträge: 4252
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Antworten