# Best 2048 - Projet Universitaire

![Icône 2048](app/src/main/res/drawable/logo.jpeg)

## Description

**Best 2048** est une implémentation Android du célèbre jeu 2048, développée dans le cadre d'un projet universitaire par l'équipe "La Legion de Muyue". L'application propose non seulement le mode de jeu classique en solo, mais également un mode multijoueur en temps réel via WebSockets.

L'objectif est de faire glisser les tuiles sur une grille pour combiner celles de même valeur, créer la tuile 2048 (en solo) ou atteindre un score cible avant l'adversaire (en multijoueur).

## Fonctionnalités

* **Mode Solo Classique :**
    * Gameplay 2048 standard sur une grille 4x4.
    * Détection de swipe (Haut, Bas, Gauche, Droite).
    * Calcul et affichage du score actuel et du meilleur score.
    * Sauvegarde et chargement automatique de l'état de la partie solo.
    * Détection de victoire (atteinte de 2048) et de fin de partie (plateau bloqué).
    * Option "Continuer à jouer" après avoir atteint 2048.
    * Effets sonores pour les mouvements et les fusions.
    * Probabilités de génération de nouvelles tuiles personnalisées (légèrement différent du standard 90% 2, 10% 4).
* **Mode Multijoueur Temps Réel :**
    * Matchmaking automatique : Crée une nouvelle partie ou rejoint une partie en attente.
    * Communication via WebSocket (`wss://best2048.legion-muyue.fr/ws`) pour les mises à jour d'état.
    * API REST (`https://best2048.legion-muyue.fr/api/`) pour la gestion initiale des parties.
    * Gameplay au tour par tour.
    * Affichage des scores des deux joueurs et indicateur de tour.
    * Condition de victoire : Atteindre un score cible (ex: 500 points) OU blocage du plateau de l'adversaire (victoire au score le plus élevé) OU déconnexion de l'adversaire.
    * Boîte de dialogue de fin de partie indiquant Victoire / Défaite / Égalité.
* **Statistiques Détaillées :**
    * Suivi des statistiques pour les modes solo et multijoueur (parties jouées, gagnées, perdues, meilleur score, meilleure tuile, temps de jeu, séries de victoires, etc.).
    * Persistance des statistiques via SharedPreferences.
    * Affichage des statistiques dans un panneau dédié.
    * Option de partage et de réinitialisation des statistiques.
* **Paramètres Utilisateur :**
    * Activation/Désactivation des effets sonores.
    * Activation/Désactivation des notifications (nécessite permission sur Android 13+).
    * Gestion des permissions via les paramètres système.
    * Option pour quitter l'application.
* **Notifications :**
    * Notifications d'accomplissement (ex: atteinte d'une tuile élevée).
    * Notifications périodiques en arrière-plan (via WorkManager) pour rappeler le meilleur score ou en cas d'inactivité (si activées).
* **Interface Utilisateur :**
    * Interface propre avec gestion des couleurs par tuile.
    * Animations pour l'apparition et la fusion des tuiles.
    * Utilisation de polices personnalisées (Nunito).
    * Layouts adaptatifs (ConstraintLayout, GridLayout).

## Technologies Utilisées

* **Langage :** Java
* **Plateforme :** Android SDK
* **Bibliothèques AndroidX :** AppCompat, ConstraintLayout, GridLayout, CardView, WorkManager, Core, Activity, Fragment
* **Composants Material Design :** SwitchMaterial
* **Réseau :**
    * Retrofit 2 (pour les appels API REST)
    * OkHttp 3 (Client HTTP sous-jacent pour Retrofit et pour les WebSockets)
    * WebSocket (via OkHttp)
* **Parsing JSON :** Gson
* **Persistance :** SharedPreferences
* **Audio :** SoundPool
* **Backend (Déduit de `server.js`) :**
    * Node.js
    * Express.js (pour l'API REST)
    * Bibliothèque `ws` (pour le serveur WebSocket)

## Structure du Projet (Simplifiée)

* **`legion.muyue.best2048`**: Package principal
    * `MainActivity.java`: Gère le mode solo et l'interface principale.
    * `MultiplayerActivity.java`: Gère le mode multijoueur et la communication réseau associée.
    * `Game.java`: Contient la logique de base du jeu 2048 (plateau, mouvements, règles).
    * `GameStats.java`: Gère le suivi, le stockage et la récupération des statistiques.
    * `OnSwipeTouchListener.java`: Détecteur de gestes de balayage.
    * `NotificationHelper.java`: Utilitaire pour créer et afficher les notifications.
    * `NotificationWorker.java`: Worker pour les notifications en arrière-plan.
    * **`data/`**: Contient les objets DTO (Data Transfer Objects) pour la communication réseau (e.g., `GameInfo`, `GameStateResponse`, `MoveRequest`).
    * **`network/`**: Contient la configuration du client réseau (`ApiClient`, `ApiService` pour Retrofit).
* **`res/`**: Ressources Android
    * `layout/`: Fichiers XML définissant les interfaces utilisateur des activités et des boîtes de dialogue.
    * `drawable/`: Formes (tuiles, boutons), icônes.
    * `values/`: Chaînes de caractères (`strings.xml`), couleurs (`colors.xml`), dimensions (`dimens.xml`), styles (`themes.xml`).
    * `raw/`: Fichiers audio pour les effets sonores (`move.ogg`, `merge.ogg`, etc.).
    * `font/`: Police personnalisée (Nunito).
    * `anim/`: Animations XML (ex: `button_press.xml`).
    * `mipmap-*/`: Icônes de l'application.
* `AndroidManifest.xml`: Déclare les composants de l'application, les permissions (INTERNET, POST_NOTIFICATIONS).

## Installation et Lancement (Développement)

1.  Clonez ce dépôt Git.
2.  Ouvrez le projet dans Android Studio (dernière version stable recommandée).
3.  Laissez Gradle synchroniser et télécharger les dépendances.
4.  **Backend :** Assurez-vous que le serveur backend (Node.js, voir `server.js`) est en cours d'exécution et accessible à l'URL configurée (`https://best2048.legion-muyue.fr`) pour que le mode multijoueur fonctionne.
5.  Sélectionnez un émulateur ou connectez un appareil Android.
6.  Compilez et lancez l'application via Android Studio (Run 'app').

## Comment Jouer

* **Mode Solo :** Balayez l'écran (haut, bas, gauche, droite) pour déplacer toutes les tuiles. Lorsque deux tuiles de même valeur se touchent, elles fusionnent en une nouvelle tuile dont la valeur est la somme des deux. Essayez d'atteindre la tuile 2048 ! La partie est perdue si la grille est pleine et qu'aucun mouvement n'est possible.
* **Mode Multijoueur :** Appuyez sur le bouton "Multijoueur". Vous serez automatiquement mis en relation avec un adversaire. Jouez à tour de rôle. Le premier joueur à atteindre le score cible (par défaut 500) gagne. Si le plateau d'un joueur se bloque, le joueur avec le score le plus élevé gagne. Si un joueur se déconnecte, l'autre gagne par forfait.

## Auteurs

Ce projet a été réalisé par l'équipe **La Legion de Muyue** :
* Muyue (Leader)
* Autres Membres

Projet universitaire
