Not logged in. · Lost password · Register

Page:  1  2  3  next 
Shadow992
Member since Jan 2014
290 posts
Subject: Kalaha: Scala + Java = ?
Heyho zusammen,

nach ersten Tests von meiner Seite aus, möchte ich mal wissen wie so die Resonanz ist und vor allem, was eure Lösung ist (damit wir Alternativen o.ä. früh genug erkennen).

Hat schon jemand von euch versucht Java und Scala zu verheiraten? Wenn ja, welchen Weg seid ihr dabei gegangen? Allgemein wie sieht die Lage bei euch aus?
Stimmt einfach ab. :D
This post was edited 2 times, last on 2016-12-07, 22:39 by Shadow992.
poll
Poll: Wie sieht euer derzeitiger Code aus?
(One vote ·   5%) Code? Neee, RandomPlayer wirds richten!
(0 votes ·   0%) Wir haben bisher nur ein Konzept im Kopf...
(14 votes · 74%) Wir verzweifeln an Java + Scala
(One vote ·   5%) Erste Code-Schnipsel in Java sind bereit und getestet
(3 votes · 16%) Wir haben/erwarten keine Probleme, weil wir sowieso Scala benutzen werden
This poll has no time limit · 19 votes
Jazzpirate
Member since Oct 2016
806 posts
Seriously? Also einfach die class files in java einbinden macht probleme oder was funktioniert nicht? Feedback, leute, feedback :D
MrDeathly
Member since Nov 2012
101 posts
Also wir haben gestern ungefähr ne halbe Stunde gebraucht um überhaupt den Konstruktor des Agents aufrufen zu können. Sind dann zu dem Ergebnis gekommen:

        ArrayList<java.lang.String> students = new ArrayList<String>();
        SuperAgent a = new SuperAgent("SuperAgent", JavaConversions.asScalaBuffer(students).toList());

Irgendwie super umständlich, geht das nicht anders?
Haben auch nicht rausgefunden wie wir unser Zeug testen sollen, da Board ja eine abstrakte Klasse ist.
MarryLookAhead
Member since Mar 2015
12 posts
Also Ich bin soweit, dass ich aus Board() eine Liste so in umwandeln kann, dass IDE keine Fehlermeldung anzeigt.
List<Object> a  = scala.collection.JavaConversions.asJavaList(b.getHouses(agent));
IDE sagt das ist okay, aber wirft dann einen Fehler, dass meine Init Methode nicht gefunden wird.
Also testen konnte ich es nicht. Und was man eigentlich braucht ist ja board.getState(). Und das ist ein ja Quadrupel, also keinen wirklichen Plan, wie man das dann wieder umgewandelt bekommt.
In Scala funktioniert alles problemlos. Man muss dann so wie ich das sehe eine eigene, den Spielregeln folgende, move() Funktion schreiben, die die Zuege fuer meinen Minimax macht oder?
obet
Member since Oct 2012
8 posts
In reply to post #3
Das größte Problem war meiner Meinung nach sbt und java 8 zum Laufen zu bringen =)

Quote by MrDeathly:
Haben auch nicht rausgefunden wie wir unser Zeug testen sollen, da Board ja eine abstrakte Klasse ist.

Du kannst ein Tournament mit beliebigen Agents anlegen (u.a. auch euer eigener), und das ganze mit
sbt run
ausführen
Jazzpirate
Member since Oct 2016
806 posts
In reply to post #3
Also ich war mir fast sicher, dass nach type erasure scala listen in java listen umgewandelt werden, i.e. identisch seien.
An für sich würde ich jetzt einfach alle parameter, tupel etc. so umschreiben, dass sie java-listen sind, oder funk ich euch damit jetzt in eure laufenden Projekte?

Haben auch nicht rausgefunden wie wir unser Zeug testen sollen, da Board ja eine abstrakte Klasse ist.
Dafür gibt es die game-klasse... `sbt run` kannte ich gar nicht, aber das wird wohl meine mein funktion starten; wenn ihr java benutzt wollt ihr da wohl nicht mit dem scala code rumspielen müssen...
Jazzpirate
Member since Oct 2016
806 posts
In reply to post #4
Man muss dann so wie ich das sehe eine eigene, den Spielregeln folgende, move() Funktion schreiben, die die Zuege fuer meinen Minimax macht oder?
move und init, ja. Siehe README.md oder die documentation; da sind die einzelnen klassen und ihre accessors auch nochmal sort-of dokumentiert
Shadow992
Member since Jan 2014
290 posts
In reply to post #6
Quote by Jazzpirate:
Also ich war mir fast sicher, dass nach type erasure scala listen in java listen umgewandelt werden, i.e. identisch seien.
An für sich würde ich jetzt einfach alle parameter, tupel etc. so umschreiben, dass sie java-listen sind, oder funk ich euch damit jetzt in eure laufenden Projekte?

Haben auch nicht rausgefunden wie wir unser Zeug testen sollen, da Board ja eine abstrakte Klasse ist.
Dafür gibt es die game-klasse... `sbt run` kannte ich gar nicht, aber das wird wohl meine mein funktion starten; wenn ihr java benutzt wollt ihr da wohl nicht mit dem scala code rumspielen müssen...

Und ich dachte schon ich hab mich besonders dämlich angestellt. :D
Eine List in Scala und eine List in Java sind konzeptionell zwei komplett andere Dinge (laut Doku). Die Java List ist ein interface (und damit nicht direkt benutzbar als objekt) und die Scala list wandelt sich je nach Gebrauch in entweder scala.collection.immutable.Seq oder irgendwas anderes zeugs um (grad zu faul das genau nach zu schauen).

Den Konsteuktor aufzurufen ist so wie Scala "Konstruktoren erlaubt" auch nicht ganz möglich, da muss man erst etwas tricksen, sonst fliegt einem eine Exception nach der anderen um die Ohren.

Das Tupel4 lässt sich scheinbar einfach in eine entsprechende Java-Klasse umwandeln, das brauchst du also (wenn mein Java nicht intern was verkackt o.ä.) eigentlich nicht umwandeln. Aber vor allem die Listen und der Konstruktor machen riesen Probleme. Der Konstruktor ist aber "noch bezwingbar" aber die Scala spezifischen Klassen ala List sind alles andere als lustig. :D

Soweit mein aktueller Stand und meine Erklärungen basierend auf AUD-Java-Kentnissen und Googlen. :D Wobei um ehrlich zu sein is selbst das "benutzen" von "Membervariablen" (heißt das so in Scala? Z.b. name, students, me) nicht direkt möglich (angeblich solls über "me()" bzw. "name()" gehen aber blieb ungetestet und ich bin skeptiscb).
Jazzpirate
Member since Oct 2016
806 posts
Okay, ich hab gerade eine neue Version gepusht, bei der alle scala.List und tupel ersetzt wurden durch java.lang.Iterable - DAS müsste jawohl funktionieren. Kann das jemand verifizieren/falsifizieren?

Ach ja, und der Konstruktor der Agent class nimmt jetzt keine Parameter mehr, i.e. name und students sind jetzt normale Felder
MarryLookAhead
Member since Mar 2015
12 posts
In reply to post #7
Quote by Jazzpirate:
Man muss dann so wie ich das sehe eine eigene, den Spielregeln folgende, move() Funktion schreiben, die die Zuege fuer meinen Minimax macht oder?
move und init, ja. Siehe README.md oder die documentation; da sind die einzelnen klassen und ihre accessors auch nochmal sort-of dokumentiert

Ich meinte das so: Man sollte ja intern sich einen Minimax Baum aufbauen. Allerdings muss man dann die "Spiellogik" selbst nochmal implementieren oder? Also praktisch den State des Spiels entsprechend eines moves im Minimax veraendern. Ein neues "internes" Game zu erstellen klappt ja nicht, weil Board private und so.
Jazzpirate
Member since Oct 2016
806 posts
Man sollte ja intern sich einen Minimax Baum aufbauen.
Das ist *eine* Möglichkeit. Wir zwingen euch keine Strategie auf; minimax ist aber vermutlich am sinnigsten, ja.

Allerdings muss man dann die "Spiellogik" selbst nochmal implementieren oder? Also praktisch den State des Spiels entsprechend eines moves im Minimax veraendern. Ein neues "internes" Game zu erstellen klappt ja nicht, weil Board private und so.
Ah, das meinst du. Naja, irgendwie halt schon, ja; ich glaub die klassen die ich für Game z.B. gebaut habe willst du auch nicht für minimax benutzen... das Board ist natürlich bewusst private, aber dein minimax sollte am board ja auch nichts ändern. Was du natürlich machen kannst ist, innerhalb deiner move funktion (oder bei init schon) eigene private instanzen von Game erzeugen mit zwei privaten dummy-agenten, die dir den minimax-baum aufbauen... bin mir aber nicht sicher ob das effizient ist.
MarryLookAhead
Member since Mar 2015
12 posts
Quote by Jazzpirate:
Man sollte ja intern sich einen Minimax Baum aufbauen.
Das ist *eine* Möglichkeit. Wir zwingen euch keine Strategie auf; minimax ist aber vermutlich am sinnigsten, ja.

Allerdings muss man dann die "Spiellogik" selbst nochmal implementieren oder? Also praktisch den State des Spiels entsprechend eines moves im Minimax veraendern. Ein neues "internes" Game zu erstellen klappt ja nicht, weil Board private und so.
Ah, das meinst du. Naja, irgendwie halt schon, ja; ich glaub die klassen die ich für Game z.B. gebaut habe willst du auch nicht für minimax benutzen... das Board ist natürlich bewusst private, aber dein minimax sollte am board ja auch nichts ändern. Was du natürlich machen kannst ist, innerhalb deiner move funktion (oder bei init schon) eigene private instanzen von Game erzeugen mit zwei privaten dummy-agenten, die dir den minimax-baum aufbauen... bin mir aber nicht sicher ob das effizient ist.
Ja das war auch meine Idee :D Aber lass ich wohl lieber sein! Danke fuer die schnelle Antwort!
MrDeathly
Member since Nov 2012
101 posts
In reply to post #9
+2 xBaumx, since
Quote by Jazzpirate:
Okay, ich hab gerade eine neue Version gepusht, bei der alle scala.List und tupel ersetzt wurden durch java.lang.Iterable - DAS müsste jawohl funktionieren. Kann das jemand verifizieren/falsifizieren?

Ach ja, und der Konstruktor der Agent class nimmt jetzt keine Parameter mehr, i.e. name und students sind jetzt normale Felder

Gerade mal gepullt und ausprobiert.
Bei mir hat Agent immer noch den Konstruktor mit (String, scala.collection.immutalbe.List<String>) als Parameter.
In der init bekomm ich von board.getState() immer noch ein scala.Tuple4 zurück.
Kann es sein, dass vielleicht nur die sources geändert wurden und ich das noch neubauen muss?

Edit: Ah ja, die kalah_2.12-1.0.jar ist noch von vor 2 Tagen.
Edit 2: Für jeden der nicht weiss, wie er aus dem class folder ne .jar macht: Einfach in 'target/scala-2.12/classes/' gehen und 'jar cf kalah.jar info/' eintippen.
This post was edited on 2016-12-08, 14:57 by MrDeathly.
nenas
Avatar
Member since May 2012
229 posts
  1. /**
  2.     * Gives the number of seeds in a specific house
  3.     * @param player which player's side of the gameboard (has to be either 1 or 2)
  4.     * @param house which house of the specified player (has to be between 1 and houses)
  5.     * @return the number of seeds in the specified house
  6.     */
  7.  
  8. def getSeed(player : Int,house : Int) : Int

  1. def getSeed(player : Int, house : Int) : Int = {
  2.       require(player ==1 || player == 2)
  3.       require(house >= 1 && house <= houses)
  4.       if (player == 1) p1Houses(house-1)
  5.       else if (player == 2) p2Houses(house-1)
  6.       else throw new Error("Player number not in [1,2]")
  7.     }

  1. val p1Houses = mutable.HashMap.empty[Int,Int]
  2. val p2Houses = mutable.HashMap.empty[Int,Int]
  3.     (1 to houses) foreach (i => {
  4.       p1Houses(i) = initSeeds
  5.       p2Houses(i) = initSeeds
  6.     })

Also ich bin jetzt kein Scala-Experte, aber wird da nicht ne Map mit keys 1 bis houses angelegt, und in getSeed dann mit keys 0 bis houses-1 drauf zugegriffen?
Sometimes, I guess there just aren't enough rocks.
Jazzpirate
Member since Oct 2016
806 posts
In reply to post #13
+1 Shadow992
Kann es sein, dass vielleicht nur die sources geändert wurden und ich das noch neubauen muss?
*facepalm* jupp, ich bin dämlich.
Hab grad die .class/.jar files auch gepusht ;)

wird da nicht ne Map mit keys 1 bis houses angelegt, und in getSeed dann mit keys 0 bis houses-1 drauf zugegriffen?
*facepalm again* jupp... das war mal ne List statt ner Map und als ich dann ne Map draus gemacht hab hab ich vergessen das -1 rauszunehmen. Sollte jetzt stimmen ^^
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  1  2  3  next 
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen