2012-02-10 8 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枚のカードを渡すことができます。

あなたがカードを渡す新しい配列は、それぞれ異なる人の手になります。

デッキの配列から各カードに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

あなたは基本的にこれを使います:var rand = new Random(); (int i = cards.Length - 1; i> 0; i--) { int n = rand.Next(i + 1); int temp = cards [i]; cards [i] =カード[n]; cards [n] = temp; } –

+0

2行コード! - :P - 私はコードサンプルで自分の答えを更新しました。 –

1

明白な問題はRandom.nextInt番号0(含む)及びN(排他的)を生成することです。したがって、53の制限を渡すと、0〜52の値が生成されます。これは53の値であり、そのカードはそれほど多くありません。上限を52に変更してください。

また、他の答えとして、同じカードを複数の手に渡して衝突するなどの理由から、ランダムにカードを選択する必要はありません。あなたは実際にデッキをランダムにシャッフルします。

代わりにshuffle algorithmをお試しください。