{"id":17551582,"url":"https://github.com/mati365/slide-puzzle","last_synced_at":"2025-03-29T07:42:44.771Z","repository":{"id":69538165,"uuid":"108595642","full_name":"Mati365/slide-puzzle","owner":"Mati365","description":"Java Swing 4x4 slide puzzle game","archived":false,"fork":false,"pushed_at":"2018-01-25T20:03:42.000Z","size":2738,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-03T21:35:13.127Z","etag":null,"topics":["diagram","game","java","puzzle","slide","swing"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Mati365.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-10-27T21:06:11.000Z","updated_at":"2020-08-19T16:53:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"349528d5-1607-42ba-ab9e-f85e9584b4a4","html_url":"https://github.com/Mati365/slide-puzzle","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mati365%2Fslide-puzzle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mati365%2Fslide-puzzle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mati365%2Fslide-puzzle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mati365%2Fslide-puzzle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Mati365","download_url":"https://codeload.github.com/Mati365/slide-puzzle/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246156011,"owners_count":20732357,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["diagram","game","java","puzzle","slide","swing"],"created_at":"2024-10-21T04:46:46.640Z","updated_at":"2025-03-29T07:42:44.750Z","avatar_url":"https://github.com/Mati365.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Puzzle 4x4\n\n### Opis funkcjonalności aplikacji i jej założenia\nAplikacja jest grą polegającą na ułożeniu pojedynczych kafelków tak aby wspólnie ułożyły obrazek w całość w jak najkrótszym czasem. Grafika jest podzielona na 16 części z jedną pustą umożliwiając przesuwanie sąsiednich. Gra kończy się gdy wszystkie kafelki zostaną ułożone poprawne. Każde rozpoczęcie nowej gry powoduje ponownie pomieszanie kolejności kafelek i zresetowanie zegara. Aplikacja została napisana obiektowo w Javie i jest przystosowana do współpracy z JRE 1.9. Można ją zbudować używając MVN.\n\n### Diagram przypadków użycia i jego opis \n![Behaviour diagram](src/main/doc/behaviour.png?raw=true \"Zachowań\")\n\nUżytkownik po włączeniu aplikacji rozpoczyna grę przyciskiem z ikonką _Play_. Po rozpoczęciu gry może:\n* Ułożyć puzzle, jeśli to zrobił to zostanie wyświetlony mu komunikat o wygranej\n* Ułożyć puzzle i przerwać grę zamykając aplikację\n* Zatrzymać grę i zegar, który tymczasowo przerywa grę\n* Zresetować grę z zegarem\n\n### Diagram klas\n![Class diagram](src/main/doc/mockup.png?raw=true \"Mockup\")\n\nPowyższy rysunek przedstawia diagram klas aplikacji. Dziedziczenie klas w tym projekcie zostało zredukowane do minimum i zostało to zastosowane celowo na rzecz kompozycji oraz zasady single responsibility.\n\n### Dokumentacja kodu źródłowego\n#### Warstwa logiki aplikacji\nGłównym założeniem tejże klasy jest operowanie na state aplikacji, niestety w tym przypadku jest on mutable głównie ze względu wielkość wymiaru i specyfikę samego języka.\n\n+ Klasa _ArrayIterator_\nJest to w głównej mierze warstwa abstrakcji między raw array 2D, która dodaje do niej podstawowe operacje, przechowując zarazem wymiary tablicy, które mogą być zmienne podczas runtime programu. Klasa ta tworzy dwuwymiarową tablicę elementów typu `T` wykorzystując mechanizmy refleksji przez wywołanie `Array.newInstance`. Adnotacje `FunctionalInterface` w interfejsach wykorzystywanych przez konstrukcje lambda mają ogromny wpływ maintainability kodu.\u003cbr /\u003e\n**Metody:**\n    * shuffle - miesza elementy tablicy w sposób losowy\n    * map - mapuje elementy na wartości zwracane przez funkcję iterującą(najprawdpodobniej lambda)\n    * find - wyszukuje element w tablicy i wskazuje wektor dwuwymiarowy pozycji, w której znajduje się obiekt.\n \n+ Klasa _ImageTile_\nKlasa odpowiedzialna za cięcie obrazu w tile. Cięcie obrazu następuje w statycznej metodzie `cutImageIntoParts`, która zwraca obiekt `ArrayIterator\u003cBufferedImage\u003e` jako return funkcji. Klasa funkcjonalność `ArrayIterator`\n\n+ Klasa _PuzzleDescription_\nKlasa to deskryptor pojedynczego puzzla, posiada obrazek oraz jego numer.\n\n+ Klasa _PuzzleGrid_\nMetadata planszy, posiada całą logikę gry i może działać niezależnie od warstwy widoku aplikacji. Posiada enumerator `Direction` reprezentujący wektor, po którym poruszać się może pojedynczy puzzle planszy. \u003cbr /\u003e\n**Metody:**\n    * isOrdered - metoda sprawdzająca ułożenie planszy\n    * shuffle - wywołuje metodę shuffle klasy `ArrayIterator` i upewnia się, że zawsze w prawym dolnym rogu jest pusty slide.\n    * slide - sprawdza możliwe ruchy slide iterując przez `EnumSet` zwracany w metodzie `getMoveableEdges`\n    * getMoveableEdges - zwraca rogi, w kierunku których może być przesunięty slide\n    * extractPuzzles - pozwala na wygenerowanie informacji meta z `ImageTile` obrazu\n    \n+ Klasa _SecondsTimer_\nTimer uruchamiany w thread pool liczącym jedynm wątek i działający w odstępach 1s. \n\n#### Warstwa widoku aplikacji\nWarstwa ta odpowiada za reprezentacje ruchów użytkownika na ekranie. Renderuje ogólny state aplikacji.\n\n+ Klasa _GameBoard_\nMetoda rysująca planszę i dekodująca kliknięcia w planszę na wektor dwuwymiarowy indeksu pojedynczego slide co pozwala na jego przesunięcie. Wczytuje także losowy `ImageTile` z zasobów aplikacji. Pod planszą gry renderuje układany obraz z ustawioną przeźroczystością. Klasa umożliwia grę na planszach innych niż 4x4 ale zostało to zablokowane ze względu na wymagania projektu.\n\n+ Klasa _GamePanel_ / _GameWindow_\nKlasy rysujące okienko i zapewniające mu prawidłowy layout.\n\n+ Klasa _Resources_\nMenedżer zasobów aplikacji. Pozwala na internationalizację aplikacji, wczytywanie obrazków oraz ikon. Pozwala na formatowanie translacji.\n\n### Podsumowanie\nProjekt został zrealizowany zgodnie z pierwotnymi założeniami a podczas jego implementacji nie natrafiono na żadne trudności.\n\n### Zbudowanie paczki\n`mvn package`\n\n### Zrzut ekranu\n![Screenshot](src/main/doc/screenshot.png?raw=true \"Screenshot\")\n\n### Ikony\nIkony stworzone przez \u003ca href=\"http://www.freepik.com\" title=\"Freepik\"\u003eFreepik\u003c/a\u003e z \u003ca href=\"https://www.flaticon.com/\" title=\"Flaticon\"\u003ewww.flaticon.com\u003c/a\u003e licencjonowane przez \u003ca href=\"http://creativecommons.org/licenses/by/3.0/\" title=\"Creative Commons BY 3.0\" target=\"_blank\"\u003eCC 3.0 BY\u003c/a\u003e\n\n### Autorzy\nMateusz Bagiński \u003ccziken58@gmail.com\u003e \u003cbr /\u003e\nArtur Jakiel\n\n### Licencja \nGNU","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmati365%2Fslide-puzzle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmati365%2Fslide-puzzle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmati365%2Fslide-puzzle/lists"}