2D Array item swap randomly

I have an enum:

public enum Player
{
   X, O, NOBODY
}

And I have this array filled with player items randomly:

Player [size][size] p;

Example matrix:

[ X, NOBODY, NOBODY ]
[ NOBODY, O, O ]
[ X, X, NOBODY ] 

I would like to swap an X or O element with a NOBODY element randomly, how can I do that?

Example:

[ NOBODY, NOBODY, NOBODY ]
[ NOBODY, O, O ]
[ X, X, X ] 






1 answer

  • answered 2020-10-16 04:30 Tim Biegeleisen

    One straightforward approach would be to select a random X/O cell as well as a random NOBODY cell, and then swap their values:

    // method inside class containing the array
    public void swapValues() {
        Random rand = new Random();
        int xoPos;
        int nobodyPos;
    
        do {
            xoPos = rand.nextInt(size*size);
            Player p = p[xoPos / size][xoPos % size];
        } while (Player.NOBODY.equals(p));
    
        do {
            nobodyPos = rand.nextInt(size*size);
            Player p = p[nobodyPos / size][nobodyPos % size];
        } while (!Player.NOBODY.equals(p));
    
        p[nobodyPos / size][nobodyPos % size] = p[xoPos / size][xoPos % size];
        p[xoPos / size][xoPos % size] = Player.NOBODY;
    }
    

    The strategy here is to generate a single random number between 0 and one minus the total number of cells in the 2D board. Then, we use integer division and modulus to figure out to what 2D coordinates that single value corresponds.