JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://rawgit.com/dankogai/js-combinatorics/master/combinatorics.js"></script>
<form>
    nb joueuses: <input name="nbPlayers" type="text" value="10"/>
    <input type="submit" value="go"/>
</form>
<hr/>
<div id="stat"></div>
<div id="output"></div>

JavaScript

function hash(x){
    var n = 0;
    x.forEach(el=>{
        n |= 1 << el;
    })
    return n;
}
function hash2Str(x, maxBit){
    var s = [];
    for(var i = 1; i<=maxBit; ++i){
        x & (1<<i) && (s.push(i))
    }
    return s.join('-');
}

function compHash(x, n){
    return x^n;
}

function teams(n, onFight){
    var left = Math.ceil(n/2);
    var array_n = [];
    for(var i = 1; i<=n; ++i){
        array_n.push(i)
    }
    var hashn = hash(array_n)
    var cmb = Combinatorics.combination(array_n, left);
    var a = true;
    var played = new Set;
    while(a = cmb.next()){
        var hasha = hash(a);
        //if team already played, ignore it
        if(played.has(hasha)){
            continue
        };

        //complete the team with what is left
        var hashb = compHash(hasha, hashn)
        played.add(hasha);
        played.add(hashb);
        onFight(hasha, hashb);
    }
}

var outputNode = document.getElementById('output');
var statNode = document.getElementById('stat');
document.getElementsByTagName('form')[0].onsubmit = function(e){
  try{
    var n = parseInt(this.nbPlayers.value,10);
    var totalFights = 0;
    outputNode.innerHTML = '';
    teams(n, function(x,y){
      outputNode.innerHTML += hash2Str(x, n)+' vs '+hash2Str(y, n)+'<br/>';
      ++totalFights;
    })
    statNode.innerHTML = 'total fights: '+totalFights;
  }catch(e){
    console.log(e)
  }
  return false;
}