2016-10-17 8 views
0

私が抱えている問題は、私のスコアカウンター変数 'score'が自分のプログラムで1以上に上がらないということです。ユーザが表示された乱数(LoadG1)に等しい値を入力すると、ポイントが付与されます。これは、より長いタイマーに示されるように、最後に出力される。短いタイマーでは、ポイントが追加されます。 int変数は最初に宣言されています。すべてが以下に示されています。私はそれが最終的であることを知っています、そして、これは私の問題の原因である可能性が最も高いですが、IDEはそれが最終的なものでなければならないと私は変数 'score'を1つのメソッド(私のケースではCountDown Timer)これは私に問題を引き起こしている。ユーザーが毎回正しい入力を持っていれば、4秒タイマーが繰り返されるたびにポイントを追加するつもりですが、現時点では1を超えることはできません。私は最終的な得点を下に示すように最後に出力したいと思います。スコア変数は更新されず、最終値でなければなりませんか?

コード:

final int[] score = {0}; 
final Random generateG1 = new Random(); 
final int loadG1 = generateG1.nextInt(1000000)+10000; 
final TextView number = (TextView) findViewById(R.id.number); 
number.setText(" "+loadG1); 

final CountDownTimer loop = new CountDownTimer(4000, 1000) { 
@Override 
public void onTick(long millisUntilFinished) { 
} 
@Override 
public void onFinish() { 
    number.setVisibility(View.GONE); 
    final TextView prompt = (TextView) findViewById(R.id.prompt); 
    prompt.setVisibility(View.VISIBLE); 
    prompt.setText(" Enter the number"); 
    final EditText input = (EditText) findViewById(R.id.enterAnswer); 
    input.setVisibility(View.VISIBLE); 
    input.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (event.getAction() == KeyEvent.ACTION_DOWN) { 
       switch (keyCode) { 
        case KeyEvent.KEYCODE_ENTER: 
         Editable answer = input.getText(); 
         int finalAnswer = Integer.parseInt(String.valueOf(answer)); 
         int finalLoadG1 = Integer.parseInt(String.valueOf(loadG1)); 
         input.setVisibility(View.GONE); 
         prompt.setVisibility(View.GONE); 
         if (finalAnswer == finalLoadG1) { 
          score[0]++; 
         } 

         number.setVisibility(View.VISIBLE); 
         final int loadG1 = generateG1.nextInt(1000000) + 10000; 
         number.setText(" " + loadG1); 
         input.getText().clear(); 

         start(); 

         return true; 
        default: 
       } 
      } 
      return false; 
     } 
    }); 
} 
}.start(); 

new CountDownTimer(24000, 1000) { 
@Override 
public void onTick (long millisUntilFinished) { 
} 
@Override 
public void onFinish() { 
    TextView result = (TextView) findViewById(R.id.outcome); 
    result.setText("Score: "+ score[0]); 
    TextView prompt = (TextView) findViewById(R.id.prompt); 
    prompt.setVisibility(View.GONE); 
    final EditText input = (EditText) findViewById(R.id.enterAnswer); 
    input.setVisibility(View.GONE); 
    loop.cancel(); 
} 
}.start(); 

誰かが私の問題に対する修正を私に提供することができる場合、私は、事前のおかげで、それを大幅にいただければと思います。

+1

最小限の実行可能な例を試してみてください。あなたの問題がどこにあるのか分かりません。 * final *配列を持つことは*素晴らしい*です - つまり、配列自体は同じままになりますが、配列内の1つのエントリは更新可能です。 – GhostCat

+1

'score'をクラスのメンバー変数にすることはできませんか? –

+0

[このカウントダウンタイマーを特定の方法で繰り返すにはどうすればよいですか?](http://stackoverflow.com/questions/40057754/how-can-i-repeat-this-countdown-timer-in-特定の方法) – Selvin

答えて

1

あなたが生成したランダムな値を読み取っているわけではないので、最初のものだけです。最初の答えは正解ですが、次回は別の回答ですが、ifは最初に生成された乱数と比較されますので、有効な答えとしてカウントされません。現在の番号があるたびに、TextEdit番号から番号を読み取る必要があります。

だから、それができる:

final int[] score = {0}; 
final Random generateG1 = new Random(); 
final int loadG1 = generateG1.nextInt(1000000)+10000; 
final TextView number = (TextView) findViewById(R.id.number); 
number.setText(" "+loadG1); 

final CountDownTimer loop = new CountDownTimer(4000, 1000) { 
@Override 
public void onTick(long millisUntilFinished) { 
} 
@Override 
public void onFinish() { 
    number.setVisibility(View.GONE); 
    final TextView prompt = (TextView) findViewById(R.id.prompt); 
    prompt.setVisibility(View.VISIBLE); 
    prompt.setText(" Enter the number"); 
    final EditText input = (EditText) findViewById(R.id.enterAnswer); 
    input.setVisibility(View.VISIBLE); 
    input.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (event.getAction() == KeyEvent.ACTION_DOWN) { 
       switch (keyCode) { 
        case KeyEvent.KEYCODE_ENTER: 
         Editable answer = input.getText(); 
         int finalAnswer = Integer.parseInt(String.valueOf(answer)); 
         // here we get from text field the current correct value 
         int finalLoadG1 = Integer.parseInt(String.valueOf(number.getText())); 
         input.setVisibility(View.GONE); 
         prompt.setVisibility(View.GONE); 
         if (finalAnswer == finalLoadG1) { 
          score[0]++; 
         } 

         number.setVisibility(View.VISIBLE); 
         final int loadG1 = generateG1.nextInt(1000000) + 10000; 
         number.setText(" " + loadG1); 
         input.getText().clear(); 

         start(); 

         return true; 
        default: 
       } 
      } 
      return false; 
     } 
    }); 
} 
}.start(); 

new CountDownTimer(24000, 1000) { 
@Override 
public void onTick (long millisUntilFinished) { 
} 
@Override 
public void onFinish() { 
    TextView result = (TextView) findViewById(R.id.outcome); 
    result.setText("Score: "+ score[0]); 
    TextView prompt = (TextView) findViewById(R.id.prompt); 
    prompt.setVisibility(View.GONE); 
    final EditText input = (EditText) findViewById(R.id.enterAnswer); 
    input.setVisibility(View.GONE); 
    loop.cancel(); 
} 
}.start(); 

また、あなたが(とすべきである)の代わりにint[]ののAtomicIntegerを使用することができ、あなたが興味を持つだろう方法は以下のとおりです。

int AtomicInteger#get(); 
int AtomicInteger#incrementAndGet() 

だから、スコアを宣言

final AtomicInteger score = new AtomicInteger(); 

の代わりにあなたが読んだときscore.incrementAndGet();

はその後の結果はしますか:score.get();

+0

私はあなたの提案でそれを変更しました。最初は動作しませんでしたので、 "loadG1"の前のスペースを取り除きました。ありがとう。 – User44

1

あなたはonCreatefinal int[] score = {0};を書きましたか?

onCreateのうちint[] score = {0};をグローバル変数として記述してください。

関連する問題