Ajout des fonctions necessaire et la vue de grille

This commit is contained in:
2026-02-27 00:27:51 +01:00
parent e0daa4bec6
commit c82a48f365
3 changed files with 142 additions and 9 deletions
+64
View File
@@ -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;
}
}
@@ -1,24 +1,21 @@
package com.example.myapplication; package com.example.myapplication;
import android.os.Bundle; import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import com.example.myapplication.game.EtatJeu; import game.EtatJeu;
import com.example.myapplication.ui.VueGrille; import ui.VueGrille;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
private EtatJeu etatJeu;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
VueGrille vueGrille = new VueGrille(this, null); EtatJeu etatJeu = new EtatJeu();
setContentView(vueGrille); VueGrille vueGrille = new VueGrille(this);
etatJeu = new EtatJeu();
vueGrille.definirEtatJeu(etatJeu); vueGrille.definirEtatJeu(etatJeu);
setContentView(vueGrille);
} }
} }
+72
View File
@@ -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;
}
}
}