diff --git a/table.html b/table.html index 28488f5..9093fae 100644 --- a/table.html +++ b/table.html @@ -23,15 +23,6 @@ this.opponents = []; this.gamesPlayed = []; } - Player.prototype.availablePlayers = function (players, game) { - result = []; - for (var player of players ) { - if (!this.opponents.includes(player.name) && - !player.gamesPlayed.includes(game) ) //TODO en fonction du mode - result.push(player); - } - return result; - }; Player.prototype.addOpponents = function (players) { for (var player of players ) { if (player.name === this.name) { @@ -44,7 +35,7 @@ - function compute() { + function compute() { document.getElementById("results").innerHTML=""; players = []; for (name of playerSet.slice(0,document.getElementById("players").value) ) { @@ -57,56 +48,46 @@ session=1; maxgameplayed = Math.floor(players.length / playerAtTable); show ("Maximum "+ maxgameplayed + " parties joués en même temps
"); - - var differentOponentMode = players.length >= playerAtTable * games.length ; - if (differentOponentMode ) { - showPass("Tous les joueurs pourront affronter des adversaires différents à chaque table"); - }else { - showWarning("Certains joueurs s'affronteront plusieurs fois "); - } played ={}; for( const player of players ) { played[player.name]={}; } - while(!finished) { + while(!finished) { //a chaque session show("

Session "+session +"
"); var tables=0; playersAvailableInSession=players.slice(); - newTable=1; - while(playersAvailableInSession.length >= playerAtTable - && tables < maxgameplayed && newTable > 0) { - newTable=0; - for( const game of games ) { - showDebug( "try for "+game+" players disponibles "+playersAvailableInSession.length +" "); - possibleplayers= playersAvailableInSession[0].availablePlayers( playersAvailableInSession, game); - showDebug ("players dispo " +possibleplayers.length + "
" ); + gameThisSession=[]; - //youpi , une table faite - if(possibleplayers.length >= playerAtTable ) { - tablePlayer = possibleplayers.slice(0,playerAtTable) ; - show( "table "+game+" : "); - //showDebug ("tablePlayer : " +JSON.stringify(tablePlayer) ) ; - for( const player of tablePlayer ) { - played[player.name][game] = session; - player.gamesPlayed.push(game); - player.addOpponents(tablePlayer); - show( player.name +", "); - const index = playersAvailableInSession.indexOf(player); - if (index > -1) { - //showDebug("remove "+ player.name + " du pool de session
"); - playersAvailableInSession.splice(index, 1); // 2nd parameter means remove one item only - } - } - show( "
"); - tables++; - newTable++; - } + essai=0; + while(tables < maxgameplayed && essai < 10) { + essai++; + selectedGame = findgame(playersAvailableInSession, gameThisSession); + showDebug( "try for " +selectedGame +", players disponibles "+playersAvailableInSession.length ); + possibleplayers = chooseplayers(playersAvailableInSession, selectedGame); - if(tables == maxgameplayed) { - break; - } - } + showDebug ("players dispo " +possibleplayers.length + "
" ); + + //youpi , une table faite + if(possibleplayers.length >= playerAtTable ) { + tablePlayer = possibleplayers.slice(0,playerAtTable) ; + show( "table "+selectedGame+" : "); + //showDebug ("tablePlayer : " +JSON.stringify(tablePlayer) ) ; + for( const player of tablePlayer ) { + played[player.name][selectedGame] = session; + player.gamesPlayed.push(selectedGame); + player.addOpponents(tablePlayer); + show( player.name +", "); + const index = playersAvailableInSession.indexOf(player); + if (index > -1) { + //showDebug("remove "+ player.name + " du pool de session
"); + playersAvailableInSession.splice(index, 1); // 2nd parameter means remove one item only + } + } + show( "
"); + tables++; + gameThisSession.push(selectedGame); + } } show("

"); session++; @@ -128,7 +109,99 @@ } } - function showPass(text){ + //pour le jeu dans jeux avec le moins de joueurs (en cas d'égalité celui le moins joué a cette session) + function findgame(playersAvailableInSession, gameThisSession) { + var gameplayer= {}; + for( const g of games ) { //init + gameplayer[g]=0; + } + + for ( p of playersAvailableInSession ) { + for ( g of p.gamesPlayed) { + gameplayer[g]++; + } + } + + minjoueur = playersAvailableInSession.length +1; + mingame = games[0]; + + for( const gp in gameplayer ) { //init + if (gameplayer[gp] < minjoueur) { + mingame= gp; + minjoueur = gameplayer[gp]; + } else if (gameplayer[gp] === minjoueur) { + //alors le moins joué à cette session + maxplayed = gameThisSession.reduce( (result, game) => game === mingame ? result +1 : result , 0); + gpplayed = gameThisSession.reduce( (result, game) => game === gp ? result +1 : result , 0); + if (gpplayed< maxplayed + || (gpplayed == maxplayed && Math.random()>0.5 ) ) { //un peu d'aleatoire en cas d'égalité + mingame = gp; + } + } + } + return mingame; + } + + function chooseplayers(playersAvailableInSession, selectedGame) { + preference = []; + selectedpreference={ forte:[], faible:[], nulle : [], score:0} ; + selectedjoueur = ""; + bestscore=0; + iterateur = playersAvailableInSession.length; + for (player of playersAvailableInSession ) { + if( player.gamesPlayed.includes(selectedGame) ) continue; + + preference[player] = { forte:[], faible:[], nulle : [], score:0} ; + + for (opositeplayer of playersAvailableInSession ) { + if( player === opositeplayer || opositeplayer.gamesPlayed.includes(selectedGame) ) + continue; //lui-mmeme ou déjà joué a ce jeu, niet! + nbrencontre= player.opponents.filter(o => o ===opositeplayer).length; + if (nbrencontre==0) { + preference[player].forte.push(opositeplayer); + } else if (nbrencontre==1) { + preference[player].faible.push(opositeplayer); + } else { + preference[player].nulle.push(opositeplayer); + } + } + + if(preference[player].forte.length >= playerAtTable-1 ) { + preference[player].forte.push(player); + return preference[player].forte; + } else { + score = preference[player].forte.length *iterateur*iterateur+ + preference[player].faible.length *iterateur+ + preference[player].nulle.length ; + if (score > bestscore) { + bestscore = score; + selectedpreference = preference[player]; + selectedjoueur= player; + } + } + } + + //le meilleur score + selectedTable=[]; + selectedTable.push(selectedjoueur); + selectedTable.push(selectedpreference.forte); + //todo completer + var j=0; + for (i=selectedTable.length ;i<= playerAtTable ; i++) { + if (selectedpreference.faible.length == j) break; //plus de préférence moyenne + selectedTable.push(selectedpreference.faible[j]); + j++; + } + var j=0; + for (i=selectedTable.length ;i<= playerAtTable ; i++) { + if (selectedpreference.nulle.length == j) break; //plus de préférence nulle + selectedTable.push(selectedpreference.nulle[j]); + j++; + } + return selectedTable; + } + + function showPass(text){ show (""+ text +"
"); }