Wireworld Clone Bug

  • VB.NET
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Plexian.

    Wireworld Clone Bug

    Hi Leute,

    ich bin grade dabei, einen WireWorld-Clone zu schreiben. Ich habe ein 2-dimensionales Array mit Cell-Klassen (Public Cells As Cell(,) = New Cell(20, 20) {}), die x, y und nen CellType haben.
    Wenn jetzt geupdatet wird, muss ich beim CellState, wenn das ein Kabel ist, gucken, ob außenrum 1 oder 2 Elektronenköpfe sind, und wenn ja wird das Kabel selbst zum Elektronenkopf. Und dabei funzt es jetzt nich mehr. Er macht einfach garnix, also es kommt bei der Nachbarprüfung immer 0 zurück:

    VB.NET-Quellcode

    1. If CellState = CellState.Cable Then
    2. Dim count = 0
    3. For lx = Me.x - 1 To Me.x + 1
    4. For ly = Me.y - 1 To Me.y + 1
    5. If ly <> Me.y And lx <> Me.x Then
    6. If World.GetCellType(lx, ly) = WireWorld.CellState.ElectronHead Then 'World.GetCellType funzt, weil das im Renderer auch funktioniert
    7. count += 1
    8. End If
    9. End If
    10. Next
    11. Next
    12. If count = 1 Or count = 2 Then
    13. CellState = CellState.ElectronHead
    14. End If
    15. End If


    Hoffe ihr könnt mir helfen :D

    LG
    Twometer
    An Error 404 occurred while loading signature...

    Twometer schrieb:

    Er macht einfach garnix
    Wie äußert sich das?
    Setz nen Haltepunkt rein und verfolge, was da passiert.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ohne hier Werbung machen zu wollen, guck dir mal Conways an in meiner Signatur. Ist ebenso ein zellulärer Automat, hat dementsprechend die Methoden die du auch brauchst. Hilft dir ja vllt.

    Berechnung der Nachbarn in der Attributes.cs.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Plexian“ ()

    Ich glaube, Du machst da einen Fehler.
    Du musst zuerst alle neuen Zustände berechnen, und erst dann die Zustände übernehmen.
    Also das sollte so in der Richtung aussehen:

    VB.NET-Quellcode

    1. Dim Field As Cell(,)
    2. Sub Generation()
    3. Dim TempField As Cell(,)
    4. For Y ...
    5. For X ...
    6. If Field(X, Y) = Irgendwas Then
    7. TempField(X, Y) = Irgendwas
    8. End If
    9. Next
    10. Next
    11. Field = TempField
    12. End Sub

    Wenn ich das richtig sehe, werden bei Deinem Code immer sofort die existierenden Objekte verändert.

    Noch ein kleiner Tipp: Ich mach die Nachbarschaft immer so:

    VB.NET-Quellcode

    1. Dim Neighbourhood As Point() = {New Point(-1, -1), _
    2. New Point(-0, -1), _
    3. New Point( 1, -1), ...}
    4. 'Und beim Verwenden:
    5. Dim Count = 0
    6. For Each Neighbour In Neighbourhood
    7. If Field(X + Neighbour.X, Y + Neighbour.Y) ... Then
    8. Count += 1
    9. End If
    10. Next

    Dadurch spart man sich die schlecht lesbaren For-Schleifen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils