Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3040 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Processing - Puissance4

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Processing - Puissance4

n°2329112
wyking
Posté le 13-02-2019 à 20:56:39  profilanswer
 

Bonjour, j'ai un devoir à rendre pour la rentrée, je dois réaliser un Puissance4 avec Processing.
Mon problème est de trouver lorsque 4 point d'une couleur sont alignés, je sais qu'on peut utiliser un tableau avec int[][] mais je ne comprends pas comment l'utiliser.
Est-ce que quelqu'un peut m'aider ?
 
Mon code :
 
int x=-50, y=-50, c, n=0, ligne1=0, ligne2=0, ligne3=0, ligne4=0, ligne5=0, ligne6=0, ligne7=0;
PImage Grille;
 
 
 
void setup()
{
  size(1200,900);
  background(#FFFFFF);
  Grille = loadImage("Grille.png" );
  image(Grille,250,200,700,650);
}
 
 
 
void mousePressed()
{
  n=n+1;
  ligne();
}
 
 
 
void draw()
{
  if(n%2==0)
  {
    if(mousePressed)
    {
      ellipse(x,y,85,88);
      fill(#F00000);
      locMouseX();
      c();
    }
  }
  else
  {
    if(mousePressed)
    {
      ellipse(x,y,85,88);
      fill(#FFF033);
      locMouseX();
      c();
    }
  }
}
 
 
//----------------------------------------------------------------------------------
 
 
void locMouseX()  // trouve la colonne de la souris  
{
  if (mouseX >= 250 && mouseX < 350)
  {
    c=1;
  }
  if (mouseX >= 350 && mouseX < 450)
  {
    c=2;
  }
  if (mouseX >= 450 && mouseX < 550)
  {
    c=3;
  }
  if (mouseX >= 550 && mouseX < 650)
  {
    c=4;
  }
  if (mouseX >= 650 && mouseX < 750)
  {
    c=5;
  }
  if (mouseX >= 750 && mouseX < 850)
  {
    c=6;
  }
  if (mouseX >= 850 && mouseX < 950)
  {
    c=7;
  }
}
 
 
//-------------------------------------------------------------------------------
 
 
void c()
{
  if (c==1)
  {
    x=301;
    y=792-ligne1;
  }
  if (c==2)
  {
    x=401;
    y=792-ligne2;
  }
  if (c==3)
  {
    x=501;
    y=792-ligne3;
  }
  if (c==4)
  {
    x=600;
    y=792-ligne4;
  }
  if (c==5)
  {
    x=699;
    y=792-ligne5;
  }
  if (c==6)
  {
    x=798;
    y=792-ligne6;
  }
  if (c==7)
  {
    x=897;
    y=792-ligne7;
  }
}
 
 
//-------------------------------------------------------------------------
 
 
void ligne()
{
  if (c==1)
  {
    if(ligne1<535)
    {
      ligne1=ligne1+107;
    }
    else
    {
      n=n+1;
    }
  }
  if (c==2)
  {
    if(ligne2<535)
    {
      ligne2=ligne2+107;
    }
    else
    {
      n=n+1;
    }
  }
  if (c==3)
  {
    if(ligne3<535)
    {
      ligne3=ligne3+107;
    }
    else
    {
      n=n+1;
    }
  }
  if (c==4)
  {
    if(ligne4<535)
    {
      ligne4=ligne4+107;
    }
    else
    {
      n=n+1;
    }
  }
  if (c==5)
  {
    if(ligne5<535)
    {
      ligne5=ligne5+107;
    }
    else
    {
      n=n+1;
    }
  }
  if (c==6)
  {
    if(ligne6<535)
    {
      ligne6=ligne6+107;
    }
    else
    {
      n=n+1;
    }
  }
  if (c==7)
  {
    if(ligne7<535)
    {
      ligne7=ligne7+107;
    }
    else
    {
      n=n+1;
    }
  }
}


Message édité par wyking le 13-02-2019 à 21:07:16
mood
Publicité
Posté le 13-02-2019 à 20:56:39  profilanswer
 

n°2331109
Erlum
Posté le 01-04-2019 à 11:41:00  profilanswer
 

C'est assez simple, tu représentes ton terrain de jeu comme un tableau de 6*7 cases, et tu définis un code, par exemple : 0 = case vide, 1 = jeton rouge, 2 = jeton jaune.
 
Tu te retrouves en mémoire avec un truc de ce genre :  
 
0000000
0000000
0000000
0001000
0012000
0121200
 
Il faut que tu fasses un algo qui recherche une suite de 4 1 ou 4 2. Pour ce faire, l'approche bête, c'est de faire le tour de ton tableau, et dès que tu croises un 1 ou un 2, tu regardes ce qu'il y a autour et t'en déduis s'il fait partie d'une série.

n°2331129
Erlum
Posté le 01-04-2019 à 15:24:13  profilanswer
 

Je viens de me renseigner sur Processing, visiblement t'es pas un informaticien donc je vais développer un peu l'algo de recherche :

 
  • Parcours le tableau dans un sens défini, par exemple de gauche à droite et de bas en haut (une partie de P4 commence toujours par le bas)
  • Il existe 3 façons de gagner au P4 : ligne horizontale, verticale, ou diagonale. Tu peux limiter le problème en considérant que ces coups n'existent que dans une direction : une ligne horizontale tout en bas à gauche peut être vu comme un coup de la case tout en bas à gauche vers la droite, ou un coup de la case du milieu tout en bas vers la gauche, ça n'a aucune importance, c'est le même coup.
  • Par conséquent, ne vérifie les coups que dans une seule direction, admettons vers la droite et vers le haut.
  • De même, il n'est pas nécessaire de faire le tour de tout le tableau pour tous les coups : quand tu vérifies les coups horizontaux, les colonnes 5 6 et 7 ne peuvent être gagnantes. Lors des coups verticaux, les lignes 4 5 6 ne peuvent pas gagner non plus. Pour les diagonales, c'est la fusion des deux.


Résumé : regarde ton tableau comme ça

 

  1 2 3 4 5 6 7
6 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0

 

  1 2 3 4 5 6 7
6 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0

 

  1 2 3 4 5 6 7
6 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0

 

  1 2 3 4 5 6 7
6 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0

 

En vert, les cases que tu dois vérifier pour les coups verticaux, en rouge les coups horizontaux et en jaune les coups en diago. Pour chaque case, tu examines la couleur du pion (s'il y en a un), et tu regardes la couleur des pions posés sur les cases adjacentes en fonction du scénario. Si les 4 cases examinées sont de la même couleur, bingo, c'est gagné.

 

Edit : Il manquait les diagonales vers la gauche (en bleu)


Message édité par Erlum le 02-04-2019 à 09:19:27
n°2331138
MaybeEijOr​Not
but someone at least
Posté le 01-04-2019 à 16:49:31  profilanswer
 

Sans vraiment réfléchir au problème, je ferai autrement, à chaque coup joué, je vérifierai si des jetons identiques se trouvent autour en faisant des boucles tant que vers le bas jusqu'à temps d'avoir 3 autres jetons identiques ou un jeton différent. Dans le premier cas on arrête la partie, sinon on vérifie horizontalement, combien à droite ? Combien à gauche ? (boucles imbriquées pour maximiser à 3 itérations au total)
Puis de même dans les diagonales.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2331140
Erlum
Posté le 01-04-2019 à 17:01:34  profilanswer
 

MaybeEijOrNot a écrit :

Sans vraiment réfléchir au problème, je ferai autrement, à chaque coup joué, je vérifierai si des jetons identiques se trouvent autour en faisant des boucles tant que vers le bas jusqu'à temps d'avoir 3 autres jetons identiques ou un jeton différent. Dans le premier cas on arrête la partie, sinon on vérifie horizontalement, combien à droite ? Combien à gauche ? (boucles imbriquées pour maximiser à 3 itérations au total)
Puis de même dans les diagonales.


 
Approche globale vs contextuelle.  
 
C'est une autre solution, plus efficace mais certainement un poil plus complexe à mettre en place pour un novice total, où il devra notamment faire attention à ne pas sortir du tableau.  :hello:

n°2332049
Lt Ripley
Ils ont tout niqué
Posté le 17-04-2019 à 19:18:58  profilanswer
 

Salut
 
Je ne sais pas quelle est la meilleure façon de procéder (débutant inside)
 
J'avais codé un programme pour résoudre un Boggle sur codingame, et je faisais le tour des lettres environnantes pour trouver un mot.   Pour ne pas dépasser de la grille et me retrouver avec des out of bound j'avais entouré la grille (de 4 x 4 pour un boggle) avec des tirets (-) (donc ensuite 6 x 6)
 

Code :
  1. public static String[] makeGrid (String[] grid) {
  2.  
  3.        String[] newGrid = new String[6];
  4.        newGrid[0] = newGrid[5] = "------";
  5.        for (int i = 1 ; i < 5 ; i++) {
  6.            newGrid[i] = "-" + grid[i-1] + "-";
  7.        }
  8.        return newGrid;
  9.    }


 
Ensuite javais 4 methodes presque identiques pour passer le truc "à la moulinette"  (fallait que je gère les lettres blacklistées lorsque déja utilisées).  Je mets le code, ça peut peut être donner des idées (si c'est nul dites le je le vire [:eric le-looser] )
 

Code :
  1. public static void moulinette1 (String[] gridd, Mot momo) {   // trouver 1ere lettre
  2.      
  3.        if (momo.posY < 5) {
  4.            System.err.println("mot "+momo.mot);
  5.            
  6.            int[] pos = {momo.posX, momo.posY};  // pour la blackliste
  7.            boolean boolBlack = isBlackListed(pos, momo.bl);  // fouille la blackliste
  8.            
  9.            
  10.            if ((gridd[momo.posY].charAt(momo.posX) == momo.mot.charAt(momo.posDsMot)) && boolBlack == false)  {
  11.                
  12.                momo.posXdepart = momo.posX;  // pour savoir d'ou repartir en cas d'abandon
  13.                momo.posYdepart = momo.posY;
  14.                momo.bl.add(pos);  // j'ajoute la pos dans la blackliste
  15.                momo.motReconst += momo.mot.charAt(momo.posDsMot);
  16.                momo.posDsMot++;
  17.                System.err.println("motReconst moul1 "+momo.motReconst);  // sortie debug
  18.  
  19.                if (momo.mot.equals(momo.motReconst)) {
  20.                    momo.exist = true;
  21.                }
  22.                else {
  23.                    moulinette3 (gridd, momo);}
  24.            }
  25.            
  26.            else {
  27.      
  28.                if (momo.posX < 4) {
  29.                    momo.posX++;
  30.                }
  31.                else if (momo.posX == 4) {
  32.                    momo.posY++; momo.posX = 1;
  33.                }
  34.                
  35.                moulinette2 (gridd, momo);
  36.            }
  37.        }
  38.    }


 
 
https://i.imgur.com/RxKehDA.png


Message édité par Lt Ripley le 17-04-2019 à 20:44:58

---------------
Mes apps  |  Viens coder  |  Mon topal de vente
n°2332050
MaybeEijOr​Not
but someone at least
Posté le 17-04-2019 à 19:23:57  profilanswer
 

Et fallait trouver "repus" ou "super" ? :whistle:


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Processing - Puissance4

 

Sujets relatifs
Processing : Problème NullPointerExceptionProblème Processing Bataille Navale
Problème ordre d'exécution - ProcessingPuissance 4 - Processing
Create a transaction-processing programProcessing gestion multi-coeur
[Projet/Help] Space invader spécial SW Processing.matlab image processing toolbox : redressement d'image
aide pour intelligence artificielle du jeu puissance4 en matlabProcessing: la prog graphique expérimentale et amusante
Plus de sujets relatifs à : Processing - Puissance4


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR