코딩 공부/Android

[Android] 숫자 게임 만들기

희원96 2022. 7. 11. 16:49

기능 정의

- 랜덤 숫자 생성(makeRandom)

- 버튼에 랜덤 수 넣기(numberlnit)

- 정답을 맞췄을 때 버튼 숨기기(answerChek)

package com.example.ex_0711;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.Arrays;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    Button btn_start;

    // 랜덤 수 생성
    Random rd = new Random();

    // 9개의 버튼을 사용할 int 타입의 배열 선언
    int[] numArr = new int[9];
    // 9개의 버튼을 관리할 수 있는 Button 타입의 배열 선언
    Button[] btnArr =  new Button[9];

    //정답을 체크할 수 잇는 변수
    int ans =1;

    // 횟수를 체크할 수 잇는 변수
    int cnt = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 버튼을 초기화하는 메소드
        initView();

        // 게임 시작을 하기 전에는 버튼들이 보이지 않도록 설정
        for(int i = 0; i < btnArr.length; i++){
            btnArr[i].setVisibility(View.INVISIBLE);
        }

        // btn_start에 event 걸어주기
        btn_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                //처음 한번 클릭 이후 버튼을 사용하지 못하도록 만들기!
                // true : 클릭허용 / false : 클릭 비허용
                btn_start.setClickable(false);

                // - 버튼에 랜덤수 부착
                // - 순서에 맞춰 버튼 클릭하기

                // 랜덤 수 생성하는 메소드
                makeRandom(cnt);


                numberInit();

                // 9개의 버튼에 이벤트 리스너 달아주기!
                for(int i = 0; i < btnArr.length; i++){

                    //변수인 i를 상수로 변경시키기!
                    final int pos = i;
                    btnArr[i].setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            // 실제 맞춰야 하는 정답과 눌린 버튼의 값이 같은지 판단!
                            // 익명클래스에서는 변수는 사용이 불가능 하다! -> 상수만 사용 가능!
                            if(numArr[pos] == ans){
                                btnArr[pos].setVisibility(View.INVISIBLE);
                                ans++;
                                ++cnt;
                                // 첫번째 판이 끝나면 다음판으로 넘어갈 수 있는 기능 만들기!

                                if(cnt == 9){
                                    makeRandom(cnt);
                                    numberInit();
                                }else if(cnt == 18){
                                    makeRandom(cnt);
                                    numberInit();
                                }else if(cnt == 27){
                                    makeRandom(cnt);
                                    numberInit();
                                }else if(cnt == 36){
                                    makeRandom(cnt);
                                    numberInit();
                                }else if(cnt ==45){
                                    btn_start.setText("end");
                                }
                            }

                        }
                    });
                }

            }
        });

    }

    private void numberInit() {
        for(int i = 0; i < btnArr.length; i++){
            btnArr[i].setText(numArr[i] + "");

            // 사라진 버튼들 띄우기
            btnArr[i].setVisibility(View.VISIBLE);
        }
    }

    private void makeRandom(int cnt) {
        // 버튼에 랜덤 수 부착
        // 순서에 맞춰 버튼 클릭
        for(int i = 0; i < numArr.length; i++){
            numArr[i] = rd.nextInt(9)+(1+cnt);

            // 중복 수 체크하기
            for(int j = 0; j < i; j++){
                if(numArr[i] == numArr[j]){
                    i--;
                }
            }
        }
    }

    private void initView() {
        btn_start = findViewById(R.id.btn_start);

        for(int i = 0; i < btnArr.length; i++) {
            // gerResources() : 리소스 파일에 접근 할 수 있는 메소드
            // getIdentifier() : name(ID 이름), difType(View 인지 layout 인지..), defPackage()
            // getPackageName() : 현재 사용하는 패키지의 이름을 가져오는 메소드
            int btnId = getResources().getIdentifier("btn" + (i+1), "id", getPackageName());

            btnArr[i] = findViewById(btnId);
        }
    }
}