2016-11-27 8 views
0

ランダムな値が4つのランダムなボタンに適用されるプログラムがあります。 4つのボタンの上にランダム値idの1つが表示されます。ユーザーが表示された番号(loadG4)を含むボタンをタップすると、ポイントが得られます。私がこれを持っている問題は、ユーザーが正しいボタンをクリックして新しい数字が生成されると、rbvalueボタンがすべてloadG4値と異なるわけではないことです。私のコードに見られるように、それらは決して等しくあってはなりません。ここでは、コードがあります:ランダムボタンゲームは、最初のクリック後に瑕疵があるのはなぜですか?

int score = 0; 
Random random = new Random(); 
int rbselector = random.nextInt(4); //These four initiations are out onCreate. 
int loadG4 = random.nextInt(10); 


final Button[] selectrb = new Button[4]; 
    selectrb[0] = rb1; 
    selectrb[1] = rb2; 
    selectrb[2] = rb3; 
    selectrb[3] = rb4; 


    final Button loseStarter4 = (Button) findViewById(R.id.Starter4); 
    loseStarter4.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      infoG4.setVisibility(View.GONE); 
      loseStarter4.setVisibility(View.GONE); 
      rb1.setVisibility(View.VISIBLE); 
      rb2.setVisibility(View.VISIBLE); 
      rb3.setVisibility(View.VISIBLE); 
      rb4.setVisibility(View.VISIBLE); 


      rbselector = random.nextInt(4); 

      final TextView number = (TextView) findViewById(R.id.number); 
      number.setText(""+ loadG4); 


      for(int allrbA=0; allrbA<4; allrbA++) { 
       int rbvalue = random.nextInt(9); 
       if (rbvalue == loadG4) { 
        rbvalue=9; 
       } 
       selectrb[allrbA].setText(""+rbvalue); 
      } 
      selectrb[rbselector].setText(""+ loadG4); 


       for (int allrbA = 0; allrbA < 4; allrbA++) { 
       selectrb[allrbA].setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
          Button clicked = (Button) v; 
          String clickVal = (String) clicked.getText(); 
          int finalClick = Integer.valueOf(clickVal); 

          if (finalClick == loadG4) { 
           score++; 
           for (int allrbA = 0; allrbA < 4; allrbA++) { 
            int rbvalue = random.nextInt(9); 
            if (rbvalue == loadG4) { 
             rbvalue=9; 
            } 
            selectrb[allrbA].setText("" + rbvalue); 
           } 
           int loadG4 = random.nextInt(10); 
           number.setText("" + loadG4); 
           int rbselector = random.nextInt(4); 
           selectrb[rbselector].setText("" + loadG4); 
          } 
        } 
       }); 
       } 

rbvalueがloadG4に等しい場合、それはいくつかの理由= 9に設定されているように、最初に正しいが、それをクリックした後、私は、それを持っていることはrbvalueが等しくなる可能性があります負荷G4。

また、loadG4の値もここでは決して変更されません。どうしてこれなの?

これを見て、なぜa)rbvalueが最初の正しいクリックの後にG4をロードするのか、b)loadG4が同じ番号のままであるのかを説明できる人には感謝します。

事前に感謝します。

答えて

1

コードでは、loadG4とrbselectorの両方を初期化しています。代わりに、グローバル変数を使用する必要があります。

//Declare this globally. Not in oncreate. 
int score = 0; 
Random random = new Random(); 
int rbselector = random.nextInt(4); 
int loadG4 = random.nextInt(10); 


final Button[] selectrb = new Button[4]; 
selectrb[0] = rb1; 
selectrb[1] = rb2; 
selectrb[2] = rb3; 
selectrb[3] = rb4; 


final Button loseStarter4 = (Button) findViewById(R.id.Starter4); 
loseStarter4.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     infoG4.setVisibility(View.GONE); 
     loseStarter4.setVisibility(View.GONE); 
     rb1.setVisibility(View.VISIBLE); 
     rb2.setVisibility(View.VISIBLE); 
     rb3.setVisibility(View.VISIBLE); 
     rb4.setVisibility(View.VISIBLE); 


     rbselector = random.nextInt(4); 

     final TextView number = (TextView) findViewById(R.id.number); 
     number.setText(""+ loadG4); 


     for(int allrbA=0; allrbA<4; allrbA++) { 
      int rbvalue = random.nextInt(9); 
      if (rbvalue == loadG4) { 
       rbvalue+=1; 
      } 
      selectrb[allrbA].setText(""+rbvalue); 
     } 
     selectrb[rbselector].setText(""+ loadG4); 


      for (int allrbA = 0; allrbA < 4; allrbA++) { 
      selectrb[allrbA].setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
         Button clicked = (Button) v; 
         String clickVal = (String) clicked.getText(); 
         int finalClick = Integer.valueOf(clickVal); 

         if (finalClick == loadG4) { 
          score++; 
          loadG4 = random.nextInt(10); //removed declaration 
          for (int allrbA = 0; allrbA < 4; allrbA++) { 
           int rbvalue = random.nextInt(9); 
           if (rbvalue == loadG4) { 
            rbvalue+=1; // better method to prevent duplicates for 9 
           } 
           selectrb[allrbA].setText("" + rbvalue); 
          } 
          number.setText("" + loadG4); 
          rbselector = random.nextInt(4); 
          selectrb[rbselector].setText("" + loadG4); 
         } 
       } 
      }); 
      } 

これでコードが機能します。

+0

これは、同じ値の問題が解決されましたが、loadG4では同じ値が解決されましたが、rbvalueとloadG4の間で同じ値が引き続き発生します。しかし、loadG4とrbselector変数を再初期化しても問題は解決しないのですか?どうしてこれが効くのか分かりません。 – H3ll0

+0

rbvalueとloadG4の間で同じ値がどういう意味ですか?毎回同じボタンの値を取得していますか?または少なくとも数回後に?もしそうなら、nextIntの値をもっと大きくする。より多くの乱数が生成されます。あなたの問題をはっきりと説明してください。 –

+0

コードを再初期化しないというあなたの提案はなぜ機能しましたか? – H3ll0

関連する問題