Android 間違い探しゲーム

Androidで間違い探しアプリを作ります

<img width=320 src="https://gyazo.com/de7db8b7a4ac7ee14e2a9253f2ee066e.png" />

この記事で紹介しているアプリの仕様は

- 0 ~ 7 までの整数がランダムに４箇所に配置される
- 選択肢に同じ整数が並ばないようにする
- 0 を選択すると Log に true が流れる
- 0 以外を選択すると Log に false が流れる
- 選択肢に 0 がない場合 THERE IS NO ZERO を選択すると Log に true が流れる

こんな感じです
~~現状ただの視力検査ですが~~数字の部分を画像に変更すれば、間違い探しゲームになるかと思います

```java

public class MainActivity extends AppCompatActivity {
    private final int TOTAL_QUESTION_COUNT = 8;

    TextView mTextView;
    Button[] mButtons = new Button[4];
    Button mNoAnsButton;
    int[] mQuestions = new int[4];
    HashMap<String, String> mButtonIndexs = new HashMap<>();

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

        Toast.makeText(this, "Hi!", Toast.LENGTH_SHORT).show();

        initViews();
        storeIndexWithID();
        mButtons[0].setText("PUSH");
        setOnClicks();
    }

    private void initViews() {
        mTextView = (TextView) findViewById(R.id.main_text);
        mNoAnsButton = (Button) findViewById(R.id.no_answer_button);
        mButtons[0] = (Button) findViewById(R.id.button1);
        mButtons[1] = (Button) findViewById(R.id.button2);
        mButtons[2] = (Button) findViewById(R.id.button3);
        mButtons[3] = (Button) findViewById(R.id.button4);
    }
    
    private void storeIndexWithID() {
        mButtonIndexs.put(String.valueOf(R.id.button1) , String.valueOf(0));
        mButtonIndexs.put(String.valueOf(R.id.button2) , String.valueOf(1));
        mButtonIndexs.put(String.valueOf(R.id.button3) , String.valueOf(2));
        mButtonIndexs.put(String.valueOf(R.id.button4) , String.valueOf(3));
    }

    private void setOnClicks() {
        for (int i = 0; i < mButtons.length; i++) {
            final Button button = mButtons[i];
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("Ans", "check:" + checkAnswer(button));
                    updateQuestions();
                    updateButtons();
                }
            });
        }

        mNoAnsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("Ans", "check (NoAns):" + !existsZero(mQuestions));
                updateQuestions();
                updateButtons();
            }
        });
    }

    private void updateButtons() {
        for (int j = 0; j < mButtons.length; j++) {
            mButtons[j].setText(String.valueOf(mQuestions[j]));
        }
    }

    private void updateQuestions() {
        mQuestions = getRandomArray();
        setRandomAnswerOption(mQuestions);
    }

    private boolean existsZero(int[] array) {
        boolean exist = false;
        for (int number : array) if (number == 0) exist = true;
        return exist;
    }

    private boolean checkAnswer(Button button) {
        boolean isOk = false;
        if (mQuestions[Integer.parseInt(mButtonIndexs.get(String.valueOf(button.getId())))] == 0) isOk = true;
        return isOk;
    }

    private int[] getRandomArray() {
        int[] randomArray = new int[4];
        for (int i = 0; i < randomArray.length; i++) {
            randomArray[i] = getRandomNumber(1, TOTAL_QUESTION_COUNT);
            for (int j = 0; j < i; j++) {
                if (randomArray[i] == randomArray[j])
                    i--; // If it is duplicated, create number again
            }
        }
        return randomArray;
    }

    // min ~ max - 1
    private int getRandomNumber(int min, int max) {
        if (max < 1) return 0;
        return new Random().nextInt(max - min) + min;
    }

    private void setRandomAnswerOption(int[] array) {
        if (getRandomNumber(0, 100) < 50) {
            array[getRandomNumber(0, array.length)] = 0;
        }
    }
}

```

(更新) 2017/03/07 メソッド名、変数名を変更しました。一部の処理を分割しました。