Ich entwickle für ein Uni-Projekt an einem kleinen Spiel in Scala. Dabei versuche ich, das ganze möglichst funktional zu implementieren. Der GameState soll keine expliziten Zustandsänderungen zulassen, um zu verhindern dass gleichzeitige Zugriffe von zwei Spielern zu Inkonsistenzen oder sogar Deadlocks führen. Stattdessen soll bei jedem Zug ein neuer GameState aus dem alten erzeugt werden.
Da der GameState auch das Spielfeld, ein zweidimensionales Gitter, umfasst, benötige ich einen Ersatz für die Arrays aus Java. IndexedSeq scheint die dafür vorgesehene Collection zu sein.
Erste Frage: Muss der Typ des Spielfelds IndexedSeq[IndexedSeq[Int]] sein, weil es zweidimensional ist, oder sollte ich eine einzelne Liste verwenden? Muss ich mir dann selber merken, wieviele Spalten eine Zeile lang ist? (Ich habe gesehen, dass es zumindest auch eine Methode fill() mit zwei Parametern gibt, die eine zweidimensionale IndexedSeq erzeugt.)
Zweite Frage: Wie ändere ich eine einzelne Zelle des Spielfelds, sprich, wie erzeuge ich eine neue IndexedSeq aus einer alten, bei der nur der Wert an einem bestimmten Index ersetzt wird? Ich war eigentlich davon überzeugt, dass es dafür einen Operator bzw. eine Methode geben muss, so wie man mit "alteMap + (key,value)" eine neue Map mit zusätzlichem Schlüssel-Werte-Paar erzeugen kann. Ich konnte aber bei Google beim besten Willen nichts dergleichen finden... Nur hinten an die Liste anhängen ist kein Problem...
Ergibt das, was ich machen will, so vielleicht gar keinen Sinn? Oder muss ich mir tatsächlich selbst eine Funktion schreiben, die eine IndexSeq mit den Werten aus einer anderen IndexedSeq initialisiert (und das Element an Index x abändert)?
Da der GameState auch das Spielfeld, ein zweidimensionales Gitter, umfasst, benötige ich einen Ersatz für die Arrays aus Java. IndexedSeq scheint die dafür vorgesehene Collection zu sein.
Erste Frage: Muss der Typ des Spielfelds IndexedSeq[IndexedSeq[Int]] sein, weil es zweidimensional ist, oder sollte ich eine einzelne Liste verwenden? Muss ich mir dann selber merken, wieviele Spalten eine Zeile lang ist? (Ich habe gesehen, dass es zumindest auch eine Methode fill() mit zwei Parametern gibt, die eine zweidimensionale IndexedSeq erzeugt.)
Zweite Frage: Wie ändere ich eine einzelne Zelle des Spielfelds, sprich, wie erzeuge ich eine neue IndexedSeq aus einer alten, bei der nur der Wert an einem bestimmten Index ersetzt wird? Ich war eigentlich davon überzeugt, dass es dafür einen Operator bzw. eine Methode geben muss, so wie man mit "alteMap + (key,value)" eine neue Map mit zusätzlichem Schlüssel-Werte-Paar erzeugen kann. Ich konnte aber bei Google beim besten Willen nichts dergleichen finden... Nur hinten an die Liste anhängen ist kein Problem...
Ergibt das, was ich machen will, so vielleicht gar keinen Sinn? Oder muss ich mir tatsächlich selbst eine Funktion schreiben, die eine IndexSeq mit den Werten aus einer anderen IndexedSeq initialisiert (und das Element an Index x abändert)?