gpt4 book ai didi

java - 分数变量不会更新,并且必须是最终的?

转载 作者:行者123 更新时间:2023-12-02 03:17:28 24 4
gpt4 key购买 nike

我遇到的问题是我的程序中的分数计数器变量“score”不能高于 1。如果用户输入的值等于显示的随机数 (LoadG1),他们将获得一分。然后在最后输出,如较长的计时器所示。在较短的计时器中,分数被添加。 int 变量在开头声明。全部如下所示。现在我知道它是最终的,这很可能是导致我的问题的原因,但 IDE 要求它是最终的,否则我只能在一种方法中调用变量“分数”(在我的例子中是倒计时器)。这给我带来了问题。如果用户每次输入正确,我打算在每次 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();

如果有人能够解决我的问题,我将不胜感激,提前致谢。

最佳答案

因为您没有读取生成的随机值,而只是读取第一个值。所以第一次答案是正确的,但下次你的答案不同,但 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();

此外,您可以(并且应该)使用 AtomicInteger 而不是 int[],您感兴趣的方法是:

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

因此将分数声明为 AtomicInteger,如下所示:

final AtomicInteger score = new AtomicInteger();

然后代替 score[0]++; 执行 score.incrementAndGet();

然后当你读取结果时:score.get();

关于java - 分数变量不会更新,并且必须是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40081490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com