Bonjour,

Voila je rencontre un petit problème avec mon code, du moins j'ai du mal à savoir comment m'y prendre je vous explique le principe de ce que je souhaiterais obtenir :
j'ai un tableau nommé

$combiPossibleD=array();

qui contient toute les combinaisons de binôme possible généré depuis une liste de chiffre il stock sous la forme :

$combiPossibleD[0]=
Array
(
    [0] => numero joueur1
    [1] => numero joueur2
)
etc...

maintenant j'aimerais générer un nombre x d'équipe que je stockerais dans un autre tableau nommé :

$equipeDoublePrise=array();

qui stockera de la même façon que celui d'avant , mais j'aimerais qu'il n'y ai pas deux fois le même joueur dans l'ensemble des équipes,

j'ai testé ceci :

while(count($equipeDoublePrise)!=x)
{
    foreach($equipeDoublePrise as $equipe)
    {
        if($equipe!=$combiPossibleD[$alea]&&$equipe!=array_reverse($combiPossibleD[$alea]))
        {
            array_push($equipeDoublePrise,$combiPossibleD[$alea]);
            break;
        }
    }
}

je ne sais pas si ma condition est bonne mais il m'insère quand même une autre équipe avec le même joueur, en espérant un peu d'aide, je vous remercie par avance.

41 réponses


eltharin
Réponse acceptée

cool! mets ton sujet en résolu du coup stp.

je test aussi avec array_inverse() dans le if, car l'equipe [1,2] et l'équipe [3,1] possède un joueur en commun qui est le 1 et ca je ne veux pas,l'ensemble des joueurs de toute les équipes doient tous être différents , je ne sais pas si je suis assez claire ...

j'avais pensé à tester les 4 joueurs entre eux du genre (en pseudo code ) avec les deux equipe :[j1,j2] et [j3,j4]
SI j1!=j3 et j1!=j4 et j2!=j3 et j2!=j4
ALORS j'insère
mais malgré ca il insère quand même deux groupes avec un joueur en commun

un peu d'aide ne serait pas de refu......

bonjour, c'est juste que ce n'est pas très clair...
de tous tes joueurs tu veux faire des équipes aléatoires, tu veux creer un championnat pour tes équipes?

coucou, le principe c'est ca voila j'ai x participants que je reparti en equipe de 2 joueurs et si le nombre d'équipe est impair je créer des équipes de 3 joueurs pour que tout les joueurs puisse jouer, pour faire ca j'ai fait un algo qui génère toute les combinaisons de deux joueurs et deux trois joueurs possible en evitant les doublons du genre [1,2] et [2,1] maintenant je voudrais générer les rencontres une équipe contre une autre en prenant en compte que tout les joueurs jouent 1 partie donc l'emsemble de toute les équipes on tous un joueurs différent , je sais pas si je suis claire ...

Et tes équipes vont bouger au cours du jeu?

oui car chaque joueur fait 4 parties et ne doit pas être deux fois avec le même joueur, j'ai généré les combi possible pour me facilité la création dérière mais je vois pas comment

tiens voici un liens ou tu peux modifier etc en directe etc...http://syframework.alwaysdata.net/5u4 ca te permettra de voir je suis bloqué dans la fonction "genererUnTirage"

Pourquoi tu génères toutes les combinaisons possibles ?
tu ne peux pas directement générer des équipes en aléatoire?
Après tu vérifies que ton tirage est valide (personne n'a joué avec qqn déjà joué)

Sinon a chaque fois que tu as choisis une équipe, il faut boucler dans toutes les possibilités pour retirer celles qui ne sont plus bonnes.

ce n'est pas bête, je ne sais pas je pensais qu'en générant tout ca m'aiderais derrière ....

et j'avais fait ca car il y a une condition qu'il faut pas que deux femmes soient dans la même équipe dans le liens que je t'ai passé il y a un tableau de participant au début, chaque participant est sous la forme numéro du joueur + une lettre pour le sexe

Ca peut faire partie des vérifications d'équipes correctes
http://syframework.alwaysdata.net/5u5

car comme je te l'ai dit il y a une condition qui est : il ne faut pas que deux femmes soient dans la même équipe si je génère aléatoirement les équipes et que j'ai des equipes de deux et de 3 dans un tirages je peux me retrouver avec deux femmes dans un groupe de trois du coup en générant les combinaisons j'évitais justement ca ,

du coup le système de combinaison n'a aucune utilité ?

dsl je me suis mal exprimé ce que je veux dire c'est que j'ai compris ta manière de procédé mais comment répété cela x fois en prenant en compte le fait que chaque équipe doit être différente ?

Pour moi le système de combinaison ne sert à rien.
http://syframework.alwaysdata.net/5u7

Plus tu le lances plus ca implémente la variable $oldtirages et moins tu as de possibilités après.

d'accord je dois simplement le faire 4 fois , si ca ne fonctionne pas jusqu'à 4 je vais devoir réfléchir à un autre système

Ca devrait fonctionner, apres il sera peut-etre necessaire d'augmenter le 10 en ligne 123 pour diminuer le droit à l'erreur.
Mais ca evite que ca tourne à l'infini si il n'y a plus de réponses possibles.
Content d'avoir aidé,

d'accord je te remercie beaucoup je commencais à me casser la tête et ca faisais un bon moment je n'avais pas fait des lignes de code et de l'algorythmie , et c'est toujours aussi sympathique !

plus qu'à refaire tout ca en js et ca sera bon , merci encore !

désolé d'abuser de ta gentillesse mais je suis bloqué au niveau de la conversion en js
voici l'état ou j'en suis actuellement :

//VARIABLE POUR LE TESTE CES VARIABLE VIENDRONT DE LA BASE DE DONNEE PLUS TARD !!
var participant = ["1h","2f","3f","4f","5h","6h","7h","8f","9h","10h","11h","12f","13h","14h",'15h','16f','17h','18h','19f'];

//VARIABLE POUR COMPTER LE NOMBRE DE PARTICIPANT
var nb_participant=participant.length;
//VARIABLE POUR STOCKER LE NOMBRE DE DOUBLETTES
var nb_doublette;
//VARIABLE POUR STOCKER LE NOMBRE DE TRIPLETTES
var nb_triplette;
//VARIABLE POUR STOCKER LE NOMBRE DE PARTIE A CREER
var nb_partie;
var oldtirages = [];

//FONCTION POUR DETERMINER LE NOMBRE DE DOUBLETTE ET DE TRIPLETTE
function determination()
{
    reste = nb_participant%2;

    nb_doublette=((nb_participant-reste)/2)-reste;
    nb_triplette = reste;
    if((nb_triplette+nb_doublette)%2!=0)
    {
        nb_triplette+=2;
        nb_doublette-=3;
    }
    nb_partie=(nb_doublette+nb_triplette)/2;    
}
function lanceur()
{
    determination();

    tirage1 = nouveauTirage();
    console.log($tirage1);

    tirage2 = nouveauTirage();
    console.log($tirage2);

    //-- exemple mauvais tirage
    //print_r(nouveauTirageInccorect());

    affichage();
}

function affichage()
{
    console.log("Nombre de participant :"+nb_participant);
    console.log("composition d'équipe (en favorisant les doublettes) :");
    console.log("nombre d'équipe double : "+nb_doublette);
    console.log("nombre d'équipe triple :"+nb_triplette);
    console.log("nombre de partie à jouer à chaque tirage : "+nb_partie);   
}

function nouveauTirage()
{
    bon_tirage = false;
    nbmax_mauvais = 0;

    while(bon_tirage === false || nbmax_mauvais < 10)
    {
        tirage = genererUnTirage();
        bon_tirage = is_a_good_tirage(tirage);
        nbmax_mauvais++;
    }       
    save_tirage(tirage);
    return tirage;
}

function nouveauTirageInccorect()
{
    bon_tirage = true;
    nbmax_mauvais = 0;

    while(bon_tirage === true || nbmax_mauvais < 10)
    {
        tirage = genererUnTirage();
        bon_tirage = is_a_good_tirage(tirage);
        nbmax_mauvais++;
    }       
    return tirage;
}
function shuffle(a)
{
   var j = 0;
   var valI = '';
   var valJ = valI;
   var l = a.length - 1;
   while(l > -1)
   {
        j = Math.floor(Math.random() * l);
        valI = a[l];
        valJ = a[j];
        a[l] = valJ;
        a[j] = valI;
        l = l - 1;
    }
    return a;
}
function genererUnTirage()
{

    part = participant;
    part = shuffle(part);

    tirage = [];

    for(var i = 0;i<nb_doublette; i++)
    {
        tirage.push(new Array(part[i*2],part[i*2+1]));
    }

    for(var i = 0;i<nb_triplette; i++)
    {
            tirage.push(new Array(part[nb_doublette*2+i*3],part[nb_doublette*2+i*3+1],part[nb_doublette*2+i*3+2])); 
    }       
    return tirage;      
}
String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.split(search).join(replacement);
};
function isset(str) {
    return window[str] !== undefined;
}
function is_a_good_tirage(tirage)
{   
    tirage.forEach(function(t)
    {   
        for(i = 0; i< t.length;i++)
        {
            for(j = i+1; j<t.length;j++)
            {
                //-- vérif si 2 femmes
                if(t[i].substr(-1) == 'f' & t[j].substr(-1) == 'f')
                {
                    return false;
                }

                //-- vérif si déjà joué ensemble
                if(isset(oldtirages[t[i]][t[j]]))
                {
                    return false;   
                }

                //-- vérif l'age du curé
                if(false)
                {
                    return false;
                }
            }   
        }
    });
    return true;
}

function save_tirage(tirage)
{       
    tirage.forEach(function(t)
    {
        for(var i = 0; i< t.length;i++)
        {
            for(var j = i+1; j< t.length;j++)
            {
                oldtirages[t[i]][t[j]] = 1;
                oldtirages[t[j]][t[i]] = 1;
            }   
        }
    });     
}

lanceur();

j'ai une erreur à la ligne 139 me disant "Uncaught TypeError: Cannot read property '5h' of undefined" , pourtant le isset php correspond simplement au if avec ce que l'on veut tester non ?

Oula du js... Euh joker?
Comme il y a un tableau a deux dimension, il faut pas tester dabbord la premiere puis la deuxieme?

If (oldtirages[t[i]] and oldtirages[t[i]][t[j]])

Salut

function isset(str) {
    return typeof str !== 'undefined';
}

@plus
Pierre

Salut, malgré le remplacement, l'erreur persiste toujours :(

salut,
quelle est la ligne 139 ?

Pierre

coucou, tout d'abord merci de m'accorder du temps pour ca , la ligne 139 correspond au test dans le if :"if(isset(oldtirages[t[i]][t[j]]))"

A la place de

if(isset(oldtirages[t[i]][t[j]]))

tu met

      try{
          var xx =  oldtirages[t[i]][t[j]];
       }catch(e){
             // ici ton tableau est not isset
             console.log('error -> '+e)
     }

@plus

Pierre

j'ai beaucoup de message de ce genre qui apparait dans la console "error -> TypeError: Cannot read property '5h' of undefined"
bien à toi Julien.

y a cetainement un beugue :D

@plus.
Pierre

Je pense avoir une idée du pourquoi je vais regarder ça en rentrant je vous tiens au jus !

bon et bien je ne sais pas les erreurs viennent à chaque fois que "oldtirages[t[i]][t[j]];" est employé...

parce t[j] n'existe pas

@plus

il devrait exister pourtant parceque il ce trouve dans deux for imbriqué avec la même condition de bouclage...

Visiblement, non

Tu as fais ce que je t'ai dit ?

If (oldtirages[t[i]] and oldtirages[t[i]][t[j]])

ou plutot

If (oldtirages[t[i]] && oldtirages[t[i]][t[j]])

tu verras que l'erreur change de ligne,

après il faut remplacer dans save_tirage :

oldtirages[t[i]][t[j]] = 1;
oldtirages[t[j]][t[i]] = 1;

par

if(oldtirages[t[i]] == undefined)
{
    oldtirages[t[i]] = [];
}
if(oldtirages[t[j]] == undefined)
{
    oldtirages[t[j]] = [];
}

oldtirages[t[i]][t[j]] = 1;
oldtirages[t[j]][t[i]] = 1;

coucou j'ai bien modifié mais il y a un souci je me retrouve quand même avec deux femmes dans une équipe certaine fois malgré le teste :

if(t[i].substr(-1) == 'f' & t[j].substr(-1) == 'f')
                {
                    return false;
                }

change

while(bon_tirage === false || nbmax_mauvais < 10)

en

while(bon_tirage === false && nbmax_mauvais < 1000)

ou plus de 1000 si tu ne veux vraiment pas d'équipe incorrect mais apres ca risque d'etre long
et

function is_a_good_tirage(tirage)
{   

    tirage.forEach(function(t)
    {   
        for(i = 0; i< t.length;i++)
        {
            for(j = i+1; j<t.length;j++)
            {
                //-- vérif si 2 femmes
                if(t[i].substr(-1) == 'f' & t[j].substr(-1) == 'f')
                {

                    return false;
                }

                //-- vérif si déjà joué ensemble

                if(isset(oldtirages[t[i]][t[j]]))
                {

                    return false;   
                }

                //-- vérif l'age du curé
                if(false)
                {

                    return false;
                }
            }   
        }
    });
    return true;
}

en

function is_a_good_tirage(tirage)
{   
    retour = true;
    tirage.forEach(function(t)
    {   
        for(i = 0; i< t.length;i++)
        {
            for(j = i+1; j<t.length;j++)
            {
                //-- vérif si 2 femmes
                if(t[i].substr(-1) == 'f' && t[j].substr(-1) == 'f')
                {
                    retour =  false;

                }

                //-- vérif si déjà joué ensemble

                if(oldtirages[t[i]] && oldtirages[t[i]][t[j]])
                {
                    retour =  false;   

                }

                //-- vérif l'age du curé
                if(false)
                {
                    retour =  false;

                }
            }   
        }
    });
    return retour;
}

Tout fonctionne à merveille,Je vous remercie beaucoup, j'ai apporté quelque modif mais niquel,Merci!