2012-02-08 35 views
5

Tôi đang học Java và làm việc trên dự án guessingGame dựa trên lưới và tôi đang gặp một số khó khăn cho phương thức loadtargetGrid() của mình.Cách đặt một chuỗi ở một vị trí được chọn ngẫu nhiên trong một mảng 2D

Tôi có một mảng 2D có tên là Lưới và tôi muốn đặt sáu ký hiệu "X" vào sáu vị trí lưới được chọn ngẫu nhiên. Tôi không muốn làm gì với các vị trí khác và để chúng với null theo mặc định.

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; 
     } 
} 

Đó là những gì tôi có cho đến nay. Tôi đã cố gắng sử dụng một vòng lặp while với bộ đếm để đặt dấu "X" ở 6 vị trí ngẫu nhiên. Nó biên dịch nhưng tôi không chắc chắn nếu điều này hoạt động và tôi không biết làm thế nào để kiểm tra xem mã của tôi là chính xác.

+1

Bạn không muốn trừ 1 khỏi ROWS và COLUMNS. Phương thức nextInt đã giới hạn kết quả từ 0 đến ROWS-1 hoặc 0 thành COLUMNS-1. Một trong những câu trả lời bạn đã nhận được sẽ cho phép bạn tránh các vị trí trùng lặp. –

+0

đúng vậy! Tôi nghĩ phương thức nextInt (int n) sẽ chuyển từ 0 thành giá trị n, nhưng giá trị n là độc quyền.thanks – Poupen

Trả lời

3

Bạn có thể không có đủ 6 mục tiêu trên lưới vì bạn có thể nhận được cùng một điểm hai lần. Hãy thử điều này:

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

cảm ơn bạn, tôi đã không nghĩ về điều này. – Poupen

+0

Xem nhận xét của tôi với Louis Wasserman. –

3

Nếu bạn nhận được cùng một toạ độ được chọn ngẫu nhiên nhiều lần, bạn sẽ không kết thúc với NUMBER_OF_TARGETS vị trí riêng biệt. Bạn có thể thử một cái gì đó như

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

Cảm ơn bạn! Tôi đã không học được điều do..while được nêu ra, nhưng tôi sẽ nhìn vào nó. – Poupen

+1

ROWS - 1 và COLUMNS - 1 không chính xác. (Tôi nhận ra bạn đã sao chép chúng từ OP). Hợp đồng của nextInt (n) là nó trả về một int trong phạm vi nửa mở [0..n]. –

Các vấn đề liên quan