[JAVA] Die Geschichte eines Othello-Spiels vom Kommunikationstyp mit Scala.

Einführung

Es ist ungefähr einen Monat her, seit ich Scala selbst gelernt habe, also habe ich ein Othello-Spiel gemacht, bei dem Socket-Kommunikation als Übung verwendet wurde. Unten ist eine Zusammenfassung dessen, was ich gelernt habe. Die Implementierungsdauer beträgt ca. 2 Wochen. (Ohne das Erlernen von Scala allein)

スクリーンショット 2018-12-10 16.17.29.png

[Quellcode] https://github.com/yuto226/Oselo

What is Scala Scala wird als Verwandter von Java anerkannt. Was Sie mit Scala tun können, können Sie grundsätzlich mit Java tun.

Was ich am meisten von Java unterschied, war, dass es eine kleine Menge Code enthielt und es möglich war, funktionale Programmierung anstelle von robuster objektorientierter Programmierung durchzuführen.

Die Funktion "Merkmal" scheint nützlich zu sein, aber ich konnte sie in dieser Zeit nicht für die Kapazität verwenden, daher möchte ich sie in Zukunft verbessern.

Umgebung

Mac OS X Sierra 10.12.6 InteliJ IDEA Scala 2.12.7 jdk-9

Was ich gemacht habe

Vor kurzem war ich in der Technologie faul, also habe ich Othello mit der Absicht gemacht, ein Spiel mit der Bedeutung zu machen, meine Hände trotzdem zu bewegen. Die Socket-Kommunikation wird übrigens auch als Überprüfung der Netzwerkverarbeitung implementiert. Ich habe Scala verwendet, weil es sehr wahrscheinlich war, dass ich in Zukunft Java für die Arbeit verwenden würde. Als ich nach etwas Ähnlichem suchte, fand ich etwas in der Nähe, also begann ich mit Interesse. Da ich es mit solcher Motivation getan habe, denke ich, dass ich die Implementierung nicht erreicht habe, die die Güte von Scala voll ausnutzt. (Ich wollte mich trotzdem bewegen) Scala selbst war jedoch recht brauchbar und leicht zu schreiben, daher denke ich, dass ich in Zukunft hart lernen werde.

Einfaches Design (Flow)

Da es sich um Socket-Kommunikation handelt, handelt es sich um ein Client-Server-Format. Die Serverseite ist für Othellos Schwarz verantwortlich, und der Client stellt eine Verbindung her und es ist Weiß. Über die Steckdose tauschen wir die Koordinaten der Stelle, an der das Stück platziert wurde, mit einer Nachricht aus und fahren mit dem Spiel fort. In der Entwurfsphase dachte ich, dass der GUI-Zeichenprozess mühsam sein würde, aber er war später mühsam (lacht).

Implementierung

Es ist schon eine Weile her, dass ich die Socket-Kommunikation programmiert habe. Die erste Barriere bestand darin, Sockets anzuschließen und Nachrichten auszutauschen. Da dies ein Spiel ist, wird außerdem die Bildschirmzeichnungsverarbeitung für die GUI enthalten sein. Ich habe Multithreading eingeführt, weil das Limit beim Ausführen eines Programms mit einem Thread unweigerlich erreicht wird. Im Unter-Thread wird der Nachrichtenempfang in einer Endlosschleife warten gelassen, und das Siegesurteil und das Zeichnen des Bildschirms werden in diesem Thread durchgeführt. Multithreading ist unabdingbar, wenn Sie auf unbestimmte Zeit auf eine solche E / A-Verarbeitung warten, von der Sie nicht wissen, wann sie eintreten wird. (Zuerst musste ich in diesem Thread auf unbestimmte Zeit warten, aber natürlich funktionierte der Prozess überhaupt nicht mehr.)

 override def run(): Unit ={
     createServer
     receiveMsg
   }

Die ReceiveMsg-Funktion wartet auf unbestimmte Zeit. Die Funktion createServer initialisiert standardmäßig BufferedReader usw. Erben Sie die Java-Thread-Klasse und rufen Sie sie mit der Start-Methode von diesem Thread aus auf. Wenn Sie den Client und den Server auf die gleiche Weise warten lassen und die Reihenfolge, das Siegesurteil, die Nachrichtenübertragung usw. abwechseln, ist dies im Grunde ein Spiel.

Die Bildschirmzeichnung selbst wurde mit scalafx (javafx) erstellt. Mit scalafx können Sie jedoch eine GUI mit einer GUI mit einem Tool namens Scene Builder entwerfen. (Wie beim Erstellen eines iPhone-App-Bildschirms mit X-Code)

Es gibt so etwas nicht in Schwung, und es scheint, dass die Implementierung eine Mischung aus UI-Code und Datenverarbeitungscode sein wird, daher denke ich, dass dies ein Vorteil von scalafx (javafx) ist.

Blockieren / nicht blockieren

Wenn Sie es während der Implementierung mit mehreren Threads erstellen, können Sie letztendlich den Nachrichtenempfang und das Zeichnen von Bildschirmen lösen! Ich fand es heraus, aber während ich herumwanderte, kam das Wort Blockieren / Nichtblockieren auf und ich war ziemlich ratlos. (Ich erinnere mich, die Worte in einer Universitätsvorlesung gehört zu haben)

Zusammenfassend besteht die Idee des Blockierens / Nicht-Blockierens darin, Nicht-Blockieren zu verwenden, wenn das Risiko besteht, dass mehrere Clients auf den Server zugreifen. ... anscheinend ... (Bitte sag mir, ob es anders ist ...) Aus Sicht der Computerressourcen ist es offensichtlich, dass das Zuweisen von Thread-Prozessen zu mehreren Clients erschöpft ist. Führen Sie daher einen Prozess zum "Überwachen" und Verbinden ein, wenn es sich um eine neue Verbindung handelt. Es scheint ideal, es durch Verarbeiten zu implementieren, wenn eine Nachricht fliegt. Ich denke, ich werde wieder lernen, wenn ich hier ruhig bin.

Lernen und zusammenfassen

Es ist in den folgenden Bulletins zusammengefasst.

Ich werde den Code zum Zeichnen des Bildschirms mit Multithread belassen, da er verwirrend zu sein scheint. Es wurde gelöst, indem die Zielfunktion an Platform # runLater übergeben wurde.

Platform.runLater(() -> hogehoge())

Ich wollte in Zukunft Scala studieren. Wenn Sie also den Code lesen, ist dies der richtige Ort für Sie! Wenn Sie dies kommentieren können, wird es eine Quelle des Studiums sein. Danke im Voraus.

Recommended Posts

Die Geschichte eines Othello-Spiels vom Kommunikationstyp mit Scala.
Die Geschichte eines gewöhnlichen Othello in Java
Die Geschichte eines Game Launcher mit automatischer Ladefunktion [Java]
Die Geschichte, einen Reverse-Proxy mit ProxyServlet zu erstellen
Wie man IGV mit Socket-Kommunikation bedient und wie man einen Ruby Gem mit dieser Methode herstellt
Die Geschichte, Dr. Orchid mit LINE BOT zu machen
Eine Geschichte darüber, wie eine vorhandene Docker-Datei mit der GPU kompatibel gemacht werden kann
Die Geschichte der Einführung der Ajax-Kommunikation in Ruby
Eine Geschichte über das Erstellen eines Builders, der den Builder erbt
[Jackson] Eine Geschichte über das Konvertieren des Rückgabewerts des Big Decimal-Typs mit einem benutzerdefinierten Serializer.
Die Geschichte von dto, dao-like mit Java, SQLite
Eine Geschichte darüber, wie catkin_make von Rosjava offline kompatibel gemacht wird
[Ruby] Gewöhnen Sie sich an, beim Erstellen einer Kopie einer Zeichenfolgenvariablen die dup-Methode zu verwenden
Die Geschichte der Erstellung einer Task-Management-Anwendung mit Swing, Java
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Die Geschichte, Java mithilfe der BitBucket-Pipeline nach Heroku zu bringen
[Apache Tomcat] Die Geschichte der Verwendung von Apache OpenWebBeans zum Aktivieren von CDI
Die Geschichte des Refactorings mit einem selbstgemachten Helfer zum ersten Mal in einer Rails-App
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Eine Geschichte über die Herstellung eines Taschenrechners zur Berechnung der Muschelhügelrate
Eine Geschichte, die mit der Einführung von Web Apple Pay zu kämpfen hatte
[Java Edition] Geschichte der Serialisierung
Die Geschichte von @ViewScoped, die Speicher verschlingt
Ein Memorandum über das FizzBuzz-Problem
Schreiben Sie einen Nullfall mit dem Typ Optional, ohne die if-Anweisung zu verwenden
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
[Java] Wie man mit der String-Klasse an die Spitze eines bestimmten Strings kommt