2014-02-07 3 views
0

그래서 4 × 4 인 2 차원 배열을 만들려고하고 있고 나는 2에 ​​그들이 입력 위치를 랜덤 할 8 개 가지 수업을 프로그램이 실행될 때마다 -D 배열. 나는 무작위 화 또는 숫자 셔플 링의 개념을 이해하지만 수업에 관해서는 전혀 모른다. 수동으로 초기화 할 예정 이었지만 아무도 그 위치를 무작위로 추출하는 방법을 알고 싶습니다.은 자바 객체를 무작위 것 2 차원 배열을 생성

편집 : 나는 명확히해야 , 나는 엄격하게 배열을 사용 할뿐만 아니라 어쩌면 난 그냥 혼란 스러워요. 나는 그것을 수행하는 경우 예를 들어 수동으로 내가 가진 :

board = new CardGame[4][4]; 

    board[0][0] = new Card1(); 
    board[0][1] = new Card1(); 
    board[0][2] = new Card2(); 
    board[0][3] = new Card2(); 
    board[1][0] = new Card3(); 
    board[1][1] = new Card3(); 
    board[1][2] = new Card4(); 
    board[1][3] = new Card4(); 
    board[2][0] = new Card5(); 
    board[2][1] = new Card5(); 
    board[2][2] = new Card6(); 
    board[2][3] = new Card6(); 
    board[3][0] = new Card7(); 
    board[3][1] = new Card7(); 
    board[3][2] = new Card8(); 
    board[3][3] = new Card8(); 

내가 무작위로 그것을 구현하는 방법에 대한 갈 것이라고 어떻게 그냥 혼란 스러워요.

+0

각 클래스의 고정 된 양의 개체가 필요합니까 (예를 들어 각각 2 개)? –

+0

예, 그렇기 때문에 두 번 나타나는 8 개의 클래스에서 임의로 위치를 무작위로 배열하고자합니다. 수동으로 위치를 지정하는 방법 만 알고 있습니다. –

+0

@KoreanGhost Array only 솔루션에 대한 내 대답을 업데이트했습니다. – M21B8

답변

0

업데이트 된 질문에 대한 응답으로이 메서드를 코드에 사용할 수 있습니다. 를 통해 호출

// Implementing Fisher–Yates shuffle 
static void shuffleArray(CardGame[] ar) 
{ 
    Random rnd = new Random(); 
    for (int i = ar.length - 1; i > 0; i--) 
    { 
    int index = rnd.nextInt(i + 1); 
    // Simple swap 
    CardGame a = ar[index]; 
    ar[index] = ar[i]; 
    ar[i] = a; 
    } 
} 

: 음은 4 × 4 배열의 경우

shuffleArray(board[0]); 
shuffleArray(board[1]); 
shuffleArray(board[2]); 
shuffleArray(board[3]); 
0

목록에 8 개의 개체를 넣고 임의 숫자 0 < = x < 8을 선택하고 목록에서 해당 클래스를 선택하십시오. 완료 될 때까지 하나의 무작위 객체를 선택하고 2 차원 배열에 배치합니다.

0

, 당신은 그 위치가 [0][0][3][3] 사이 것을 알고있다.

xy과 같이 각 개체에 대해 0에서 3 사이의 임의의 숫자 2 개를 얻을 수 있습니다. 그런 다음 어레이에 이미 [x][y] 위치의 객체가 있는지 확인하고 그렇지 않은 경우 배치하십시오. 이미 Object가있는 경우 새로운 난수 Number 쌍을 다시 생성하고이를 확인할 수 있습니다.

+0

이 방법은 이론적으로 영원히 반복 할 수 있습니다. 당신은 16 개의 독특한 쌍을 찾고 있습니다. 쌍을 무작위로 생성하면 16 개 모두를 치지 않을 수 있습니다. –

+0

원래 질문을 이해하기 전에 (편집 전에), 그는 단지 16 개의 위치에 8 개의 객체를 배치하려고했습니다. 이것으로 충분할 것이라고 결론 내렸다. 또한 나는 결코 "결코"부분을 challange 것이다. 그러나 잘. – Scorpio

+0

공정한. 또한 : "절대로 이어질 수있다" –

0

무작위 (x, y) 위치를 만들고 각 배열 셀에 객체를 넣으면 충돌이 발생할 수 있으며 선택한 좌표가 이미 점유되어있을 때 새로운 좌표를 다시 생성하면 이론적 인 관점에서보기에는 좋지 않습니다. , 반드시 종료 될 필요는 없기 때문입니다. 배열 크기가 작은 경우,이 문제가되지 않을 수 있지만, 나는 아직도 오히려 다른 전략을

(편집 : 업데이트 된 질문에 따라 변경)를 사용하는 것

일예를 카드 목록을 작성한 다음 Collections#shuffle이 목록을 만들고 행별로 배열에 배치하십시오.

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 


class Card{} 
class Card1 extends Card{} 
class Card2 extends Card{} 
class Card3 extends Card{} 
class Card4 extends Card{} 
class Card5 extends Card{} 
class Card6 extends Card{} 
class Card7 extends Card{} 
class Card8 extends Card{} 
public class CardShuffle 
{ 
    public static void main(String[] args) 
    { 
     Card[][] board = new Card[4][4]; 

     List<Card> list = new ArrayList<Card>(); 
     list.add(new Card1()); 
     list.add(new Card1()); 
     list.add(new Card2()); 
     list.add(new Card2()); 
     list.add(new Card3()); 
     list.add(new Card3()); 
     list.add(new Card4()); 
     list.add(new Card4()); 
     list.add(new Card5()); 
     list.add(new Card5()); 
     list.add(new Card6()); 
     list.add(new Card6()); 
     list.add(new Card7()); 
     list.add(new Card7()); 
     list.add(new Card8()); 
     list.add(new Card8()); 
     Collections.shuffle(list); 

     fill(board, list); 
    } 

    private static void fill(Card board[][], List<Card> list) 
    { 
     int index = 0; 
     for (int i=0; i<board.length; i++) 
     { 
      for (int j=0; j<board[i].length; j++) 
      { 
       board[i][j] = list.get(index); 
       index++; 
       if (index >= list.size()) 
       { 
        return; 
       } 
      } 
     } 
    } 

} 
관련 문제