Tetromino is a Tetris-like game written in Java with JavaFX.

Related tags

GUI tetromino
Overview

Tetromino

Link to original project in university's GitLab

Tetromino Demo Video

Tetromino is a Tetris-like game written in Java with JavaFX made by Jonas and myself during our 2nd semester @ HdM Stuttgart.

This is a reupload of the original game which we uploaded to our university's GitLab.

Excerpt from the original README in German

  1. Kurzbeschreibung
    Tetromino ist ein - wie der Name impliziert - tetrisähnliches Spiel und damit schnell erklärt:
    Das Spiel generiert zufällige Steine, sogenannte Tetrominos, welche aus vier unterschiedlich angeordneten quadratischen Blöcken bestehen, in einem 10x20-Blöcke großen Spielfeld, die der Spieler dann rotieren und nach links oder rechts bewegen kann, während sich das Tetromino stetig nach unten bewegt. Wenn ein Tetromino auf einem anderen Tetromino oder der unteren Grenze des Spielfelds aufkommt, hört es auf sich zu bewegen und das nächste Tetromino "spawnt". Ziel ist es, Reihen mit Tetrominos zu füllen, wobei gefüllte Reihen verschwinden und darüberliegende Reihen "herunterfallen". Die Punktezahl richtet sich hierbei nach der Anzahl auf einmal gefüllter Reihen. Außerdem gibt es Punkte, wenn man das Tetromino mittels eines Hard- oder Softdrops fallen lässt. Die Punktzahl richtet sich hierbei nach der Anzahl gefallener Reihen. Ein Harddrop lässt das Tetromino sofort nach unten fallen, bis es unten aufkommt. Bei einem Softdrop bewegt sich das Tetromino schneller nach unten. Am Ende eines Spiels kann man sich, indem man einen Namen einträgt, in die Highscoreliste eintragen.

  2. Startklasse
    Die Main-Methode befindet sich in der Klasse Launcher.

  3. Besonderheiten

    • Key Input: JavaFX bietet als Key Inputs KEY_PRESSED und KEY_RELEASED an. Diese haben uns als Game Input nicht ausgereicht, weil KEY_PRESSED erst den anfänglichen Tastendruck, aber auch wie bei Betriebssystemen üblich einen darauf folgenden wiederholten Input registriert, während die Taste gedrückt gehalten wird. JavaFX hat kein Event für einen einmaligen Tastendruck. Außerdem wollten wir die Periode eines ausgelösten Events durch einen fortwährenden Tastendruck anpassbar machen. Deswegen haben wir auf Basis dieser Events ein komplexeres Inputsystem mit mehr Konfigurationsmöglichkeiten erstellt. So haben wir nun mehrere unterschiedliche Events, welche durch Methoden wie addPressedEvent, addReleasedEvent, addPressedAndReleasedEvent, addRepeatedEvent an eine Taste gebunden werden. Beim Repeated Event wird ein ScheduledExecutorService-Thread eingesetzt.

    • Functional Interface: Zudem haben wir in der Shape-Klasse im tetromino-Package ein Functional Interface EnumMapProducer verwendet.

  4. Lessons Learned

    • Javadocs:
      Wir haben für einige Klassen bzw. Enums (siehe z.B. Shape) Javadocs geschrieben. Unsere Erkenntnis hierbei war, dass Javadocs zwar vor allem bei größeren Klassen bzw. Enums eine große Hilfe beim Verständnis (vor allem von Code, den man nicht selbst geschrieben hat) darstellen können, bei einem Projekt dieses Umfangs in der Regel aber nicht wirklich vonnöten sind. Oft bestehen sie schlichtweg aus redundantem Text (Beschreibung der Funktion entspricht z.B. oft Parameter- bzw. Returnvalues) und bedeuten unnötigen Arbeitsaufwand, den man vielleicht lieber in Verbesserungen der Anwendung investieren sollte.

    • FXML vs. UI in Code:
      Eine Designentscheidung, die wir am Ende der Entwicklungsphase bereut haben war, das Interface des kompletten Spiels, inklusive der Menüs, in Code zu schreiben. Vor allem für statische Scenes, wie die Menüs, wäre es wahrscheinlich besser gewesen, FXML zu verwenden. So entstand oft duplizierter oder ähnlicher und relativ unübersichtlicher Code, durch den die UI erstellt wurde. Unter dem Strich würden wir also bei einem neuen Projekt für statische Scenes FXML und für dynamische Scenes wie die GameScene eine programmatisch-erstellte UI wählen.

    • UML-Diagramme für größere Packages:
      Für kleine Packages können UML-Diagramme durchaus sinnvoll sein, vor allem aber bei größeren Packages oder auch dem kompletten Programm sind UML-Diagramme unserer Ansicht nach sehr unübersichtlich und nicht wirklich hilfreich.

  1. UML-Diagramme
    5.1. Klassendiagramm
    Klassendiagramm
    Dies ist nur die Tetromino-Klasse. Das gesamte Klassendiagramm findet sich unter Tetromino/uml/complete_class_diagram.png.

    5.2. Anwendungsfalldiagramm
    Anwendungsfalldiagramm

    5.3. Sequenzdiagramm
    Sequenzdiagramm

  1. Stellungnahme
    • Architektur:
      • Beispiele verwendeter Interfaces:
        • SceneInterface: Wird implementiert von StartMenuScene, GameScene, HighscoreListScene und OptionsMenuScene, welche von der SceneFactory mittels des SceneType-Enums initialisiert werden.
        • GameSpeedManager und HighscoreListManager (welche beide DataManager erweitern): Werden respektive implementiert von GameSpeedUserPreferencesManager und HighscoreListUserPreferencesManager und durch die DataManagerFactory erstellt.
    • Clean Code
      • Alle Getter und Setter, die nicht-primitive oder mutable Datentypen übergeben, erzeugen eine Kopie des Objekts, sodass niemals das gleiche Objekt mit identischer Adresse übergeben wird. Methoden, die Instanzen eigener Klassen zurückgeben, verwenden stets eine copy()-Funktion, die eine Kopie des Objekts zurückgeben. Siehe so z.B. in Tetromino.java oder Score.java.
      • Unsere Interfaces und Factories (siehe Architektur) führen zu loose coupling. So ist z.B. der Datentyp von nextScene beim LinkButton ein SceneInterface und nicht schon der konkrete Datentyp der Scene, welche durch die SceneFactory erstellt wird.
    • Tests:
      • Unsere Unit Tests liegen im test-Ordner. Wir haben hierbei wichtige Methoden der Klassen Score und Tetromino getestet und auch die Klassen dementsprechend benannt.
      • In ScoreTest.java befinden sich außerdem die Negativtests negativeTestLineIncreaseWithInvalidLineNumber() und testInvalidNumberOfClearedLinesException(), wo eine Methode jeweils mit einem unvorhergesehenen Wert aufgerufen wird. In diesem Fall soll sich z.B. der Wert eines Score-Objekts dann nicht ändern, was in negativeTestLineIncreaseWithInvalidLineNumber() getestet wird und eine InvalidNumberOfClearedLines Exception geworfen werden, was durch testInvalidNumberOfClearedLinesException() überprüft wird.
    • GUI (JavaFX):
      • Unsere UI besteht aus mehreren Szenen, welche untereinander navigierbar sind.
      • Unsere GUI, sowohl die Menüs, als auch die GameScene, haben wir in Java-Code erstellt (siehe auch 4. Lessons Learned - FXML vs. UI in Code), hiermit in Verbindung stehende Dateien finden sich im gui-Ordner. Trotzdem haben wir das Styling größtenteils mithilfe von CSS-Stylesheets vorgenommen, welche sich im resources-Ordner stylesheets befinden.
    • Logging/Exceptions:
      • Als logging utility verwenden wir log4j2. Die Konfigurationsdatei log4j2.xml findet sich im resources-Ordner. Geloggt wird sowohl in der Konsole, als auch in der Datei A1.log.
      • Wenn Probleme auftreten, die das Programm aber auffangen kann (wie z.B. falls die Schriftart in Application.json nicht geladen werden kann, indem eine Ersatzschriftart verwendet wird), so loggen wir dies mit dem "Warn"-Level. In diesem Zusammenhang verwenden wir auch unsere eigenen Exceptions InvalidNumberOfClearedLinesException und UnassignedKeyException.
    • UML:
      • Alle unsere UML-Diagramme befinden sich im Tetromino/uml-Ordner.
      • Darin finden sich ein Klassendiagramm des tetromino-Packages, ein Anwendungsfalldiagramm unserer kompletten Anwendung, sowie ein Sequenzdiagramm einer vereinfachten Gameloop. Zudem befindet sich dort auch ein Klassendiagramm unserer kompletten Anwendung.
    • Threads:
      • Wir verwenden Threads an zwei Stellen:
        • KeyInput: Siehe 3. Besonderheiten.
        • Game: Hier wird ein ScheduledExecutorService als game loop verwendet, deren Periode die Fallgeschwindigkeit des Tetrominos angibt. In ihr wird ein Teil der Gamelogik abgehandelt.
      • Alle ScheduledExecutorService-Threads werden hierbei als Daemon erstellt, sodass sie sich beim Schließen der Anwendung selbst beendet.
      • Beim Ende von Thread-Tasks werden die Threads nicht geschlossen, sondern nur die Tasks beendet. So kann man bei erneuter Verwendung denselben Thread mit einem neuen Task verwenden.
    • Streams und Lambda-Funktionen:
      • Wir setzen Streams und Lambda-Funktionen z.B. in HighscoreList ein, wo die getHighscores()-Methode Kopien aller Score-Objekte erzeugt und diese gesammelt als List<Score> zurückgibt.
      • Zudem verwenden wir im Enum Shape ein Functional Interface EnumMapProducer, welches durch eine Lambda-Funktion instantiiert werden kann.
      • In der addScore()-Methode in der HighscoreList-Klasse wird ein Parallel-Stream verwendet. Dieser wird beim Hinzufügen eines Scores eingesetzt. Bei diesem wird zuerst die Highscorelist gefiltert, sodass nur noch Scores, die kleiner als der hinzuzufügende Score sind, übrig bleiben. Danach wird, falls vorhanden, der höchste Score genommen.
You might also like...

The snake and Ladders Game 🎲 for two players made using JavaFx with important concepts of OOPs🐍 🪜

The snake and Ladders Game 🎲 for two players made using JavaFx with important concepts of OOPs🐍 🪜

The snake and Ladders Game made using JavaFx with important concepts of OOPs, done as a project for Advanced Programming course (CSE201) under Prof. Koteswar Rao Jerripothula

Sep 5, 2022

A maven-based JavaFX Asteroids game based on a tutorial from Lee Stemkoski

JavaFX Asteroids About This is a maven-based project which implements a JavaFX Asteroids Game. The code is based on a tutorial from Lee Stemkoski whic

Mar 2, 2022

Checkers game. Server and Client. Client's app handled in JavaFX. Play with radom player or against AI.

Checkers game. Server and Client. Client's app handled in JavaFX. Play with radom player or against AI.

Checkers-JavaFX-and-Sockets Checkers game. Server and Client. Client's app handled in JavaFX. Play with radom player or against AI. If you want to pla

Mar 30, 2022

JavaFX based Connect4 Game.

JavaFX based Connect4 Game.

Connect4 [email protected] https://github.com/MitchellGray100/Connect4 JavaFX Connect4 Game. Local 2 Player or 1 Player (With AI). It's Connec

Jan 6, 2022

Android Resource Manager application to manage and analysis your app resources with many features like image resize, Color, Dimens and code Analysis

Android Resource Manager application to manage and analysis your app resources with many features like image resize, Color, Dimens and code Analysis

AndroidResourceManager Cross-Platform tools to manage your resources as an Android Developer, AndroidResourceManager - ARM provide five main services

Nov 16, 2022

An amazing representation of what Brute Forcing Interpolation Looks like in action.

An amazing representation of what Brute Forcing Interpolation Looks like in action.

Brute Forcing Interpolation About Brute forcing interpolation is an extremely advanced mathematical formula used by the leading anti-cheat developers

Dec 2, 2022

BukkitRCEElevator - Allows you to execute Linux commands on panels like Multicraft.

BukkitRCEElevator A plugin that lets you execute linux commands thru Minecraft console. This only works on panels that do not use docker like Multicra

Dec 27, 2021

A cross-platform interface for FutureRestore, written in Java with Swing

A cross-platform interface for FutureRestore, written in Java with Swing

Futurerestore GUI A GUI implementation for FutureRestore written in Java. Installation Download from releases. No Java download required (it's bundled

Dec 30, 2022

Lightweight installer written in java, made for minecraft mods, The installer uses JPanel and uses a URL to install to the specific area (Discord URL's work the best i've seen)

InstallerForJava Lightweight installer written in java, made for minecraft mods, The installer uses JPanel and uses a URL to install to the specific a

Dec 9, 2022
Owner
Tobias Helmrich
Tobias Helmrich
A library for creating and editing graph-like diagrams in JavaFX.

Graph Editor A library for creating and editing graph-like diagrams in JavaFX. This project is a fork of tesis-dynaware/graph-editor 1.3.1, which is n

Steffen 125 Jan 1, 2023
CSS keyframe animation for JavaFX. Create animations like you would do with CSS.

JFXAnimation CSS keyframe animation for JavaFX. If you are using JFoenix JFXAnimation is included (currently version 1.0.0 only) Requirements JDK 8 an

Marcel Schlegel 49 Dec 28, 2022
An image annotation desktop-application written in Java using the JavaFX application platform.

This is an image annotation desktop-application written in Java using the JavaFX application platform. It allows you to create bounding box annotations using rectangular and polygonal shapes. Annotations can be imported and saved from/to JSON files, Pascal VOC format XML-files or YOLO format TXT-files.

Markus Fleischhacker 31 Dec 4, 2022
A portable 8086 emulator written in Java and JavaFX

8086.java A portable 8086 emulator written in JavaFX Environment Variables To run this project, you will need to add the following environment variabl

David Velho 4 Dec 1, 2022
JDKMon - A little tool written in JavaFX that monitors your installed JDK's and inform you about updates

JDKMon JDKMon Home JDKMon is a little tool written in JavaFX that tries to detect all JDK's installed on your machine and will inform you about new up

Gerrit Grunwald 246 Jan 3, 2023
Everest - an upcoming REST API testing client written in JavaFX

Everest (formerly RESTaurant) is an upcoming REST API testing client written in JavaFX. Everest running on Windows 10. Why Everest? Everest is written

Rohit Awate 810 Dec 27, 2022
A prayer times (Adhan) app for Windows and GNU/Linux written in JavaFX.

Salawat Salawat - سالوات A prayer times and Adhan application for Windows, macOS and GNU/Linux written in Java Download » View Demo · Report Bug · Req

DarkBlackChocolate 8 Nov 17, 2022
Lobby System Template for a multiplayer java game, with chat and other features, using JavaFX and socket TCP (will be extended to UDP).

JavaFX-MultiplayerLobbySystem JavaFX lobby system for multiplayer games with chat, ready toggle and kick buttons, using socket TCP by default. Demo Cr

Michele Righi 7 May 8, 2022
Tray Icon implementation for JavaFX applications. Say goodbye to using AWT's SystemTray icon, instead use a JavaFX Tray Icon.

FXTrayIcon Library intended for use in JavaFX applications that makes adding a System Tray icon easier. The FXTrayIcon class handles all the messy AWT

Dustin Redmond 248 Dec 30, 2022
DataFX - is a JavaFX frameworks that provides additional features to create MVC based applications in JavaFX by providing routing and a context for CDI.

What you’ve stumbled upon here is a project that intends to make retrieving, massaging, populating, viewing, and editing data in JavaFX UI controls ea

Guigarage 110 Dec 29, 2022