Bonjour,

Voila je rencontre un petit problème au niveau algo, je suis en train de réaliser un puissance 4 en html/js et je suis bloqué sur la partie permettant de déterminer si le coup est gagnant ou pas

l'etat du jeux est stocké dans un tableau 2d au dimension du plateau dont les valeurs sont toute initialisé à 0 comme ceci

this.etat_du_jeux = [];
for(var i = 0 ; i < this.sizeX ; i++){
        this.etat_du_jeux[i] = [];
}
    for(var i = 0 ; i < this.sizeX ; i++){
        for(var j =0 ; j < this.sizeY ; j++){
            this.etat_du_jeux[i][j]=0;
        }
    }

quand il y a un pion rouge de mis j'assigne etat_du_jeux[posY][posX] à 1 et quand c'est jaune je l'assigne à 2 , mon souci est que je ne sais pas comment parcourir le tableau pour vérifier si les 4 pions sont alignés verticalement ou horizontalement ou en diagonal haut/bas si quelqu'un pourrait me donner une piste ca serait sympas car j'ai essayé ceci :

Pion.prototype.check_victory = function(){
var count_player_yellow = 0;
    var count_player_red = 0;

    //test horizontal
    for(var i = 0 ; i < this.sizeX ; i++)
    {
        if(stockage.etat_du_jeux[this.posY][i]==1){count_player_red++;count_player_yellow=0;}
        else if(stockage.etat_du_jeux[this.posY][i]==2){count_player_red=0;count_player_yellow++;}
        else if(stockage.etat_du_jeux[this.posY][i]==0){count_player_red=0;count_player_yellow=0;}
        if(count_player_yellow==4){console.log("jaune win horizon")}
        else if(count_player_red==4){console.log("red win horizon")}
    }
}

mais sans succès ca fonctionne mais pas à chaque fois pour la partie teste horizontal

4 réponses


keulu
Réponse acceptée

j'ai déjà fait ca dans le temps. il faut regarder ce qu'il y a autour de toi.

je suis jaune ? est ce que j'ai du jaune a coté de moi ? oui/non

si oui, alors j'en déduit une direction et je check cette direction en me basant sur le nouveau trouvé.

et ce, a chaque fois qu'une piece est jouée en partant de la où elle se trouve.

faut checker si

function getEtat(color, posY_p, posX_p){
    if (stockage.etat_du_jeux[posY_p][posX_p] == color && color != 0) 
        return true;

    return false;
}

var dirToCheck = [];
if(getEtat(stockage.etat_du_jeux[this.posY][this.posX], this.posY, this.posX - 1)){
    dirToCheck.push('left');
}
if(getEtat(stockage.etat_du_jeux[this.posY][this.posX], this.posY, this.posX + 1)){
    dirToCheck.push('right');
}
//[etc...]

for (var i in dirToCheck){
    if (i == 'right'){
        if (getEtat(stockage.etat_du_jeux[this.posY][this.posX], this.posY, this.posX)
        && getEtat(stockage.etat_du_jeux[this.posY][this.posX], this.posY, this.posX + 1)
        && getEtat(stockage.etat_du_jeux[this.posY][this.posX], this.posY, this.posX + 2)
        && getEtat(stockage.etat_du_jeux[this.posY][this.posX], this.posY, this.posX + 3){
            // win de la couleur stockage.etat_du_jeux[this.posY][this.posX]
        }
    }
}

voila l'idée que je te propose. attention, j'ai pas tester et ca mérite une petite refactorisation, mais dans l'idée voila le principe.

Coucou ce n'est pas bête tu tout je vais partir sur cette logique, je te remercie, je donnerais des news ou reviendrais si je suis de nouveau embêté .. ^^

j'ai trouvé une solution que je trouve pas mal qui est la suivante :
1) je récupère la couleur du pion joué donc 1 ou 2 (0=cellule vide)
2) je créer un comparateur en concaténant 4x la couleur ex : 1111
3) je récupère la ligne horizontal on concaténant la ligne du tableau idem pour verticale, diagonale haut et diagonale bas
et je compare chaque chaine avec un indexOf si ca me retourne pas -1 c'est que c'est gagné

il me reste plus que les diagonales à faire mais le reste est fonctionnelle :

Pion.prototype.check_victory = function(){
    var x = this.posX;
    var y = this.posY;
    var color = this.getColor();
    var horizontal="",vertical="",diagoM="",diagoD="";
    //permettra de comparer si les pions sont aligné ou non 
    var comparateur = String(color)+String(color)+String(color)+String(color);
    //récupère la ligne horizontal
    horizontal = stockage.etat_du_jeux[y].join('');
    //récupère la ligne vertical
    for(var i = 0 ; i < this.sizeY ; i++)
    {
        vertical += String(stockage.etat_du_jeux[i][x]);
    }

    if((horizontal.indexOf(comparateur)!=-1)||(vertical.indexOf(comparateur)!=-1)){console.log(this.color+" win")}
}