static GenRandInitFen(options) {
    if (!options.randomness || options.randomness == 0)
      // Deterministic:
      return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ahah -";

    let pieces = { w: new Array(8), b: new Array(8) };
    let flags = "";
    // Shuffle pieces on first (and last rank if randomness == 2)
    for (let c of ["w", "b"]) {
      if (c == 'b' && options.randomness == 1) {
        pieces['b'] = pieces['w'];
        flags += flags;
        break;
      }

      let positions = ArrayFun.range(8);

      // Get random squares for bishops
      let randIndex = 2 * randInt(4);
      const bishop1Pos = positions[randIndex];
      // The second bishop must be on a square of different color
      let randIndex_tmp = 2 * randInt(4) + 1;
      const bishop2Pos = positions[randIndex_tmp];
      // Remove chosen squares
      positions.splice(Math.max(randIndex, randIndex_tmp), 1);
      positions.splice(Math.min(randIndex, randIndex_tmp), 1);

      // Get random squares for knights
      randIndex = randInt(6);
      const knight1Pos = positions[randIndex];
      positions.splice(randIndex, 1);
      randIndex = randInt(5);
      const knight2Pos = positions[randIndex];
      positions.splice(randIndex, 1);

      // Get random square for queen
      randIndex = randInt(4);
      const queenPos = positions[randIndex];
      positions.splice(randIndex, 1);

      // Rooks and king positions are now fixed,
      // because of the ordering rook-king-rook
      const rook1Pos = positions[0];
      const kingPos = positions[1];
      const rook2Pos = positions[2];

      // Finally put the shuffled pieces in the board array
      pieces[c][rook1Pos] = "r";
      pieces[c][knight1Pos] = "n";
      pieces[c][bishop1Pos] = "b";
      pieces[c][queenPos] = "q";
      pieces[c][kingPos] = "k";
      pieces[c][bishop2Pos] = "b";
      pieces[c][knight2Pos] = "n";
      pieces[c][rook2Pos] = "r";
      flags += V.CoordToColumn(rook1Pos) + V.CoordToColumn(rook2Pos);
    }
    // Add turn + flags + enpassant
    return (
      pieces["b"].join("") +
      "/pppppppp/8/8/8/8/PPPPPPPP/" +
      pieces["w"].join("").toUpperCase() +
      " w 0 " + flags + " -"
    );
  }
// Setup the initial random (asymmetric) position
Setup the initial random (asymmetric) position
Setup the initial random ( asymmetric ) position
static GenRandInitFen(options) {
    if (!options.randomness || options.randomness == 0)
      return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ahah -";
    let pieces = { w: new Array(8), b: new Array(8) };
    let flags = "";
    for (let c of ["w", "b"]) {
      if (c == 'b' && options.randomness == 1) {
        pieces['b'] = pieces['w'];
        flags += flags;
        break;
      }
      let positions = ArrayFun.range(8);
      let randIndex = 2 * randInt(4);
      const bishop1Pos = positions[randIndex];
      let randIndex_tmp = 2 * randInt(4) + 1;
      const bishop2Pos = positions[randIndex_tmp];
      positions.splice(Math.max(randIndex, randIndex_tmp), 1);
      positions.splice(Math.min(randIndex, randIndex_tmp), 1);
      randIndex = randInt(6);
      const knight1Pos = positions[randIndex];
      positions.splice(randIndex, 1);
      randIndex = randInt(5);
      const knight2Pos = positions[randIndex];
      positions.splice(randIndex, 1);
      randIndex = randInt(4);
      const queenPos = positions[randIndex];
      positions.splice(randIndex, 1);
      const rook1Pos = positions[0];
      const kingPos = positions[1];
      const rook2Pos = positions[2];
      pieces[c][rook1Pos] = "r";
      pieces[c][knight1Pos] = "n";
      pieces[c][bishop1Pos] = "b";
      pieces[c][queenPos] = "q";
      pieces[c][kingPos] = "k";
      pieces[c][bishop2Pos] = "b";
      pieces[c][knight2Pos] = "n";
      pieces[c][rook2Pos] = "r";
      flags += V.CoordToColumn(rook1Pos) + V.CoordToColumn(rook2Pos);
    }
    return (
      pieces["b"].join("") +
      "/pppppppp/8/8/8/8/PPPPPPPP/" +
      pieces["w"].join("").toUpperCase() +
      " w 0 " + flags + " -"
    );
  }
static GenRandInitFen ( options ) { if ( ! options . randomness || options . randomness == 0 ) return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ahah -" ; let pieces = { w : new Array ( 8 ) , b : new Array ( 8 ) } ; let flags = "" ; for ( let c of [ "w" , "b" ] ) { if ( c == 'b' && options . randomness == 1 ) { pieces [ 'b' ] = pieces [ 'w' ] ; flags += flags ; break ; } let positions = ArrayFun . range ( 8 ) ; let randIndex = 2 * randInt ( 4 ) ; const bishop1Pos = positions [ randIndex ] ; let randIndex_tmp = 2 * randInt ( 4 ) + 1 ; const bishop2Pos = positions [ randIndex_tmp ] ; positions . splice ( Math . max ( randIndex , randIndex_tmp ) , 1 ) ; positions . splice ( Math . min ( randIndex , randIndex_tmp ) , 1 ) ; randIndex = randInt ( 6 ) ; const knight1Pos = positions [ randIndex ] ; positions . splice ( randIndex , 1 ) ; randIndex = randInt ( 5 ) ; const knight2Pos = positions [ randIndex ] ; positions . splice ( randIndex , 1 ) ; randIndex = randInt ( 4 ) ; const queenPos = positions [ randIndex ] ; positions . splice ( randIndex , 1 ) ; const rook1Pos = positions [ 0 ] ; const kingPos = positions [ 1 ] ; const rook2Pos = positions [ 2 ] ; pieces [ c ] [ rook1Pos ] = "r" ; pieces [ c ] [ knight1Pos ] = "n" ; pieces [ c ] [ bishop1Pos ] = "b" ; pieces [ c ] [ queenPos ] = "q" ; pieces [ c ] [ kingPos ] = "k" ; pieces [ c ] [ bishop2Pos ] = "b" ; pieces [ c ] [ knight2Pos ] = "n" ; pieces [ c ] [ rook2Pos ] = "r" ; flags += V . CoordToColumn ( rook1Pos ) + V . CoordToColumn ( rook2Pos ) ; } return ( pieces [ "b" ] . join ( "" ) + "/pppppppp/8/8/8/8/PPPPPPPP/" + pieces [ "w" ] . join ( "" ) . toUpperCase ( ) + " w 0 " + flags + " -" ) ; }
Setup the initial random (asymmetric) position
Setup the initial random ( asymmetric ) position
// Deterministic: // Shuffle pieces on first (and last rank if randomness == 2) // Get random squares for bishops // The second bishop must be on a square of different color // Remove chosen squares // Get random squares for knights // Get random square for queen // Rooks and king positions are now fixed, // because of the ordering rook-king-rook // Finally put the shuffled pieces in the board array // Add turn + flags + enpassant