2012-02-08 9 views
5

sto imparando Java e lavorare su un progetto di guessingGame basata su una griglia e sto avendo qualche difficoltà per il mio metodo loadtargetGrid().Come posizionare una stringa in un luoghi scelti a caso in una matrice 2D

Ho un array 2D di String denominato Grid e quello che voglio inserire sei simboli "X" in sei posizioni di griglia scelte a caso. Non voglio fare nulla con la posizione degli altri e lasciarli con null di default.

public class Grid 
{ 
public static final int ROWS  = 5;  // number of rows 
public static final int COLUMNS = 5;  // number of columns 
public static final int NUMBER_OF_TARGETS = 6; // number of targets in the grid 

private String[][] grid;    // the grid itself, a 2-D array of String 
private Random random;     // random number generator 

//Constructor 
public Grid() 
{ 
    grid = new String[ROWS][COLUMNS]; 
    random = new Random(); 
} 

//method 
public void loadTargetGrid() 
{ 
     int counter = 0; 
     while(counter < NUMBER_OF_TARGETS){ 
      int randRow = random.nextInt(ROWS - 1); 
      int randColumn = random.nextInt(COLUMNS - 1); 
      grid[randRow][randColumn] = "X"; 
      ++ counter; 
     } 
} 

Questo è quello che ho finora. Ho provato ad usare un ciclo while con un contatore per posizionare una "X" in 6 posizioni casuali. Compila ma non sono sicuro che funzioni e non so come verificare se il mio codice è corretto.

+1

Non si desidera sottrarre 1 da ROWS e COLUMNS. Il metodo nextInt limita già il risultato a 0 a ROWS-1 o 0 a COLUMNS-1. Entrambe le risposte che hai ricevuto ti consentiranno di evitare le posizioni duplicate. –

+0

giusto! Ho pensato che il metodo di nextInt (int n) sarebbe passare da 0 al valore di n, ma il valore n è exclusive.thanks – Poupen

risposta

3

Non si potrebbe potenzialmente avere tutti i 6 obiettivi sulla griglia di partenza perché si potrebbe ottenere lo stesso punto due volte. Prova questo:

int counter = 0; 
while(counter < NUMBER_OF_TARGETS){ 
    int randRow = random.nextInt(ROWS - 1); 
    int randColumn = random.nextInt(COLUMNS - 1); 
    if (grid[randRow][randColumn] == null) { 
     grid[randRow][randColumn] = "X"; 
     ++ counter; 
    } 
} 
+0

grazie, non ci ho pensato. – Poupen

+0

Vedere il mio commento a Louis Wasserman. –

3

Se si ottiene le stesse coordinate scelti a caso più di una volta, non si finirà con NUMBER_OF_TARGETS posizioni distinte. Si potrebbe provare qualcosa di simile

int randRow, randColumn; 
do { 
    randRow = random.nextInt(ROWS); 
    randColumn = random.nextInt(COLUMNS); 
} while (grid[randRow][randColumn] != null); 
grid[randRow][randColumn] = "X"; 
+0

Grazie! Non ho ancora imparato la cosa do..while, ma ci penserò. – Poupen

+1

ROWS - 1 e COLUMNS - 1 non è corretto. (Mi rendo conto che li hai copiati dall'OP). Il contratto di nextInt (n) è che si restituisce un int nella gamma semiaperto [0..n). –

Problemi correlati