随机生成器-结转变量

时间:2018-11-27 16:05:50

标签: java android variables random

任何人都可以提供帮助吗? 我只是从一些非常基本的android开发开始。我正在开发一个初始应用程序,以帮助我的女儿学习她的时间表。想法(在第一个版本中)会随机生成1到12之间的2个数字。然后单击计算按钮将给出答案。 我有它,以便它随机生成2个数字,但是,当我单击“计算”时,它不会计算,只是显示0。 我相信这与下一个方法(计算)看不到的变量(digit1和digit2)的值有关。如果我将2个数字硬编码到计算方法中,则可以正常工作。我只是无法计算随机生成的数字。 非常感激任何的帮助。 MainActivity.java:

package uk.co.myrayner.sophiestimestables;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import java.util.Random;


public class MainActivity extends AppCompatActivity {

    int digit1;
    int digit2;
    int show_answer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void randomise_digits(View view) {
        Random rand1 = new Random();
        int digit1 = rand1.nextInt(12) + 1;
        displaydigit1(digit1);
        Random rand2 = new Random();
        int digit2 = rand2.nextInt(12) + 1;
        displaydigit2(digit2);
    }

    public void calculate(View view) {
        show_answer = (digit1 * digit2);
        displayanswer(show_answer);
    }

    private void displaydigit1(int number) {
        TextView digit1TextView = (TextView) findViewById(R.id.digit1);
        digit1TextView.setText("" + number);
    }

    private void displaydigit2(int number) {
        TextView digit2TextView = (TextView) findViewById(R.id.digit2);
        digit2TextView.setText("" + number);
    }

    private void displayanswer(int number) {
        TextView answerTextView = (TextView) findViewById(R.id.show_answer);
        answerTextView.setText("" + number);

    }
}

4 个答案:

答案 0 :(得分:1)

您的实现存在几个问题。

1)在您的randomise_digits内部,您要设置digit1和digit2的值,但这些值是局部变量,而不是在方法外部声明的实例变量。因此,randomise_digits()中对digit1和digit2所做的任何更改都不会反映在MainActivity对象的digit1和digit2上。这就是为什么要获得0的原因,因为它们实际上没有设置为任何值(因为您在calculate()方法中引用了digit1和digit2的实例变量)。您的randomise_digits()方法中的本地digit1和digit2现在已超出范围/不再存在。

2)更改方法的名称,以更好地反映它们的作用。您的calculate()方法可能应该重命名为show()。您无需将View对象作为所有方法的参数传递。您没有使用它们,为什么要包含它们?

3)您不需要创建两个随机对象即可计算两个随机数。一个就可以了。

您的课程可能看起来像这样:

package uk.co.myrayner.sophiestimestables;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import java.util.Random;


public class MainActivity extends AppCompatActivity {

    int digit1;
    int digit2;
    int show_answer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button calculateButton = findViewById(R.id.your_calculate_button_id);

        calculateButton.setOnClickListener(new Button.OnClickListener() {

            public void onClick(View v) {
                randomise_digits();
                calculate();
            }

        });
    }

    public void randomise_digits() {
        Random rand1 = new Random();
        digit1 = rand1.nextInt(12) + 1;
        displaydigit1(digit1);
        digit2 = rand1.nextInt(12) + 1;
        displaydigit2(digit2);
    }

    public void calculate() {
        show_answer = (digit1 * digit2);
        displayanswer(show_answer);
    }

    private void displaydigit1(int number) {
        TextView digit1TextView = (TextView) findViewById(R.id.digit1);
        digit1TextView.setText("" + number);
    }

    private void displaydigit2(int number) {
        TextView digit2TextView = (TextView) findViewById(R.id.digit2);
        digit2TextView.setText("" + number);
    }

    private void displayanswer(int number) {
        TextView answerTextView = (TextView) findViewById(R.id.show_answer);
        answerTextView.setText("" + number);

    }
}

如果您决定复制并粘贴上面的代码,请确保删除活动布局xml中的所有onclick事件。

答案 1 :(得分:0)

我没有在机器上测试您的代码。但是我认为这可能是由于您尚未设置全局变量“ digit1”和“ digit2”的值引起的。 在您的方法“ randomise_digits”中,您只需创建新的局部变量“ digit1”和“ digit2”。

答案 2 :(得分:0)

好吧,我没有测试您的代码,但是显然,您将digit1digit2声明为全局变量,但是当您使用它们时,您再次声明了它,所以现在代码将生成随机数并分配给本地digit1digit2而不是全局变量,当您尝试调用calculate()时,全局digit1digit2仍为0(原始整数默认为零),因此基本上结果将为零。

只需将randromise_digits函数修改为

public void randomise_digits(View view) {
    Random rand1 = new Random();
    digit1 = rand1.nextInt(12) + 1;
    displaydigit1(digit1);
    Random rand2 = new Random();
    digit2 = rand2.nextInt(12) + 1;
    displaydigit2(digit2);
}

答案 3 :(得分:0)

您需要做的就是在定义digit1和digit2之前删除“ int”,因此您的代码应如下所示:

package uk.co.myrayner.sophiestimestables;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    int digit1;
    int digit2;
    int show_answer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void randomise_digits(View view) {
        Random rand1 = new Random();
        digit1 = rand1.nextInt(12) + 1;
        displaydigit1(digit1);
        Random rand2 = new Random();
        digit2 = rand2.nextInt(12) + 1;
        displaydigit2(digit2);
    }

    public void calculate(View view) {
        show_answer = (digit1 * digit2);
        displayanswer(show_answer);
    }

    private void displaydigit1(int number) {
        TextView digit1TextView = (TextView) findViewById(R.id.digit1);
        digit1TextView.setText("" + number);
    }

    private void displaydigit2(int number) {
        TextView digit2TextView = (TextView) findViewById(R.id.digit2);
        digit2TextView.setText("" + number);
    }

    private void displayanswer(int number) {
        TextView answerTextView = (TextView) findViewById(R.id.show_answer);
        answerTextView.setText("" + number);

    }
}