2012-02-10 2 views
0

본인은이 부분에 도움이 필요합니다. 이 부분에서는 2 개의 난수를 생성하고 그 난수를 사용하여 2 개의 레이블 상자 각각에 카드를 동시에 표시합니다. 문제는 난수가 제대로 생성되지 않아서 카드가 제대로 표시되지 않는다는 것입니다 (반복, 때로는 표시 없음 등)2 개의 난수 생성기 (카드 처리)

내 코드의 기본 내용 : 변수가 h 인 것으로 가정 해 봅시다. 코드의 다른 부분은 1에서 53 사이의 숫자입니다 (각 숫자는 카드와 관련됩니다). 생성 된 난수 (반복 없음)가 변수 h와 일치하면 타이머가 중지됩니다.

기본적으로 카드 덱을 가지고 2 인에게 카드를 고르게 분배하는 것과 비슷하지만 무작위로 찍은 카드 (번호)와 관련된 숫자가 일치하면 거래가 중지됩니다. 어떤 도움을 주시면 감사하겠습니다

Random rng = new Random(); 
    List<Integer> generated = new ArrayList<Integer>(); 
    List<Integer> generated2 = new ArrayList<Integer>(); 
    int l3count; 
    int l4count; 
    int Ulim = 53; 
    int Llim = 1; 
    int next; 
    int check; 
    int h; 
    int next2; 
    int Ulim2 = 53; 
    int Llim2 = 1; 



final int p = h; 
      int delay2 = 1000; 
    final Timer timer2 = new Timer(); 
     timer2.schedule(new TimerTask(){ 
    public void run(){ 

     for (int i = 1; i < 53; i++) 
    { 
     while(true) 
     { 
      next = rng.nextInt(Ulim) + Llim; 
      if (!(generated.contains(next)||generated.contains(next2))) 
      { 

       generated.add(next); 
       break; 
      } 

      next2 = rng.nextInt(Ulim2) + Llim2; 
      if (!(generated.contains(next)||generated.contains(next2))) 
      { 

       generated.add(next2); 
       break; 
      } 


     } 

     String a = Integer.toString(next); 
      String c = "C:\\Users\\mycompname\\Desktop\\deck\\"+a+".png"; 

      String d = Integer.toString(next2); 
      String e = "C:\\Users\\mycompname\\Desktop\\deck\\"+d+".png"; 

      for(int j = 1;j<=53;j++) 
      { 
      if(j%2==0) 
      {l3.setIcon(new ImageIcon(c)); 
      } 
      else 
      {l4.setIcon(new ImageIcon(e));  
      } 
      } 


      if(next==p||next2==p) 
      check=10;  
      break; 
    } 
     if(check==10) 
     timer2.cancel(); 
    timer2.purge(); 
     } 

     },delay2, 1000); 

:

전역 변수 (L3, L4는 레이블 이름입니다). 시간 내 주셔서 감사합니다.

+1

FFS는 코드를 올바르게 형식화합니다. 당신이 도움을 원한다면, 우리가 읽을 수있게함으로써 당신을 도울 수 있도록 도와 주시고, 당신의 청중을 존경하십시오. – Bohemian

답변

2

카드를 무작위로 처리하는 것이 좋습니다.

O(n)Knuth Shuffle을 사용하면 한 번에 하나의 카드를 한 배열에서 다른 배열로 전달할 수 있습니다.

카드를 전달할 때마다 새로운 배열이 다른 사람의 손이됩니다.

각 플레이어가 규칙에 필요한 카드 수를 얻을 때까지 갑판 배열의 각 배열에 한 번에 1 개의 카드를 추가하십시오.

또한 동일한 임의 숫자에 의존하지 마십시오. stupid-sort을 참조하십시오. 대신 다른 패턴을 찾아보십시오. 임의의 숫자의 카드 % cards_left처럼 카드를 내 보내지 말아야합니다.

요청 따라 코드 샘플 업데이트 :

public static void shuffle (int[] array) { 
    for(int n = array.length; (n > 1);) { 
     int k = gen.nextInt(n--); 
     int temp = array[n]; 
     array[n] = array[k]; 
     array[k] = temp; 
    } 
} 
+0

u는 기본적으로 이것을 사용합니다 : var rand = new Random(); int n = rand.Next (i + 1); int temp = cards [i]; cards [i] = 카드 [n]; 카드 [n] = 임시; } –

+0

두 줄짜리 코드! - : P - 코드 샘플로 내 대답을 업데이트했습니다. –

1

명백한 문제 Random.nextInt 숫자 0 (포함)를 생성하는이고, n (배타적). 그래서 당신이 53의 한도를 통과 할 때, 당신은 0과 52 사이의 값을 생성하고 있습니다. 그것은 53 개의 가능한 값이고, 많은 카드가 없습니다. 따라서 상한선을 52로 변경하십시오.

또한 다른 답변에서 알 수 있듯이 충돌 (동일한 카드를 여러 손으로 다루는 것) 등의 이유는 무작위로 카드를 선택하고 싶지 않기 때문입니다 . 갑판을 무작위로 섞고 싶습니다.

대신 shuffle algorithm을 사용해보세요.