diff --git a/game/EtatJeu.java b/game/EtatJeu.java new file mode 100644 index 0000000..f75e077 --- /dev/null +++ b/game/EtatJeu.java @@ -0,0 +1,64 @@ +package game; + +import java.util.Random; + +public class EtatJeu { + + public static final int NB_LIGNES = 6; + public static final int NB_COLONNES = 6; + public static final int NB_TYPES = 7; + + private final int[][] grille = new int[NB_LIGNES][NB_COLONNES]; + private final Random aleatoire; + + public EtatJeu() { + aleatoire = new Random(); + initialiserGrilleSansTriples(); + } + + // --- Lecture / écriture --- + public int obtenirCase(int ligne, int colonne) { + return grille[ligne][colonne]; + } + + public void definirCase(int ligne, int colonne, int valeur) { + grille[ligne][colonne] = valeur; + } + + // --- Initialisation de la grille sans séries de 3 --- + private void initialiserGrilleSansTriples() { + for (int ligne = 0; ligne < NB_LIGNES; ligne++) { + for (int colonne = 0; colonne < NB_COLONNES; colonne++) { + + int valeur; + do { + valeur = aleatoire.nextInt(NB_TYPES); // 0..6 + } while (creeTriple(ligne, colonne, valeur)); + + grille[ligne][colonne] = valeur; + } + } + } + + // Renvoie true si mettre "valeur" à (ligne, colonne) créerait une série de 3 + private boolean creeTriple(int ligne, int colonne, int valeur) { + + // Test horizontal : XXX à gauche + if (colonne >= 2) { + if (grille[ligne][colonne - 1] == valeur && + grille[ligne][colonne - 2] == valeur) { + return true; + } + } + + // Test vertical : XXX au-dessus + if (ligne >= 2) { + if (grille[ligne - 1][colonne] == valeur && + grille[ligne - 2][colonne] == valeur) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/iu/MainActivity.java b/ui/MainActivity.java similarity index 63% rename from iu/MainActivity.java rename to ui/MainActivity.java index 42be419..f1aaeaa 100644 --- a/iu/MainActivity.java +++ b/ui/MainActivity.java @@ -1,24 +1,21 @@ package com.example.myapplication; import android.os.Bundle; - import androidx.appcompat.app.AppCompatActivity; -import com.example.myapplication.game.EtatJeu; -import com.example.myapplication.ui.VueGrille; +import game.EtatJeu; +import ui.VueGrille; public class MainActivity extends AppCompatActivity { - private EtatJeu etatJeu; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - VueGrille vueGrille = new VueGrille(this, null); - setContentView(vueGrille); - - etatJeu = new EtatJeu(); + EtatJeu etatJeu = new EtatJeu(); + VueGrille vueGrille = new VueGrille(this); vueGrille.definirEtatJeu(etatJeu); + + setContentView(vueGrille); } } \ No newline at end of file diff --git a/ui/VueGrille.java b/ui/VueGrille.java new file mode 100644 index 0000000..29ff7e6 --- /dev/null +++ b/ui/VueGrille.java @@ -0,0 +1,72 @@ +package ui; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.view.View; + +import androidx.annotation.NonNull; + +import game.EtatJeu; + +public class VueGrille extends View { + + private EtatJeu etatJeu; + private final Paint pinceau = new Paint(); + + public VueGrille(Context contexte) { + super(contexte); + pinceau.setAntiAlias(true); + pinceau.setStyle(Paint.Style.FILL); + } + + public void definirEtatJeu(EtatJeu etatJeu) { + this.etatJeu = etatJeu; + invalidate(); // force le redessin + } + + @Override + protected void onDraw(@NonNull Canvas canvas) { + super.onDraw(canvas); + + if (etatJeu == null) return; + + int largeur = getWidth(); + int hauteur = getHeight(); + + float tailleCase = Math.min( + largeur / (float) EtatJeu.NB_COLONNES, + hauteur / (float) EtatJeu.NB_LIGNES + ); + + float margeGauche = (largeur - tailleCase * EtatJeu.NB_COLONNES) / 2f; + float margeHaut = (hauteur - tailleCase * EtatJeu.NB_LIGNES) / 2f; + + for (int ligne = 0; ligne < EtatJeu.NB_LIGNES; ligne++) { + for (int colonne = 0; colonne < EtatJeu.NB_COLONNES; colonne++) { + + int type = etatJeu.obtenirCase(ligne, colonne); + definirCouleur(type); + + float x1 = margeGauche + colonne * tailleCase + 6; + float y1 = margeHaut + ligne * tailleCase + 6; + float x2 = margeGauche + (colonne + 1) * tailleCase - 6; + float y2 = margeHaut + (ligne + 1) * tailleCase - 6; + + canvas.drawRoundRect(x1, y1, x2, y2, 20, 20, pinceau); + } + } + } + + private void definirCouleur(int type) { + switch (type % EtatJeu.NB_TYPES) { + case 0: pinceau.setARGB(255, 200, 200, 200); break; + case 1: pinceau.setARGB(255, 255, 105, 180); break; + case 2: pinceau.setARGB(255, 90, 230, 200); break; + case 3: pinceau.setARGB(255, 100, 170, 255); break; + case 4: pinceau.setARGB(255, 255, 220, 90); break; + case 5: pinceau.setARGB(255, 255, 140, 90); break; + case 6: pinceau.setARGB(255, 255, 90, 90); break; + } + } +} \ No newline at end of file