마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

추가 적으로 질문있습니다ㅜㅜ

0 추천
각 번호가 나온 횟수를 누적해서 카운트 하고 싶은데, 말씀해 주신 답변대로 하게 되면 각 번호가 나온 순서대로 앱에 적용 되게 됩니다 ㅜㅜ... 해결 방법이 있을까요?
related to an answer for: 주사위 앱 만든는데 도와주세요
환석이 (120 포인트) 님이 2022년 11월 11일 질문

2개의 답변

0 추천
누적횟수를 담을 변수가 필요하겠죠?
이 시점에서 주사위 숫자를 생성하고 누적횟수를 기록할 기능을 하는 별도 클래스를 만들어 주사위 관련 로직을 위치시키면 좋을 것 같구요. 이 클래스를 위한 단위 테스트를 작성하시면 로직 변경시마다 단위테스트를 실행해서 검증하시면 안전하게 수정이 가능합니다.
제가 모발에서 작성하는 관계로 코드는 적을 수가 없네요.
참고로 누적횟수를 담을 자료구조는 Map<Integer, Integer> 나 SparseIntArray 를 사용하시면 어떨지.
spark (227,530 포인트) 님이 2022년 11월 11일 답변
0 추천

Map를 이용해서 아래처럼 처리할 수 있습니다.

먼저, 주사위 번호와 이미지 매핑정보를 가진 enum 을 선언합니다.

public enum DiceNum {
    NONE(0),
    ONE(R.drawable.img_1),
    TWO(R.drawable.img_2),
    THREE(R.drawable.img_3),
    FOUR(R.drawable.img_4),
    FIVE(R.drawable.img_5),
    SIX(R.drawable.img_6),
    SEVEN(R.drawable.img_7);

    @DrawableRes
    private final int drawableId;

    DiceNum(int drawableId) {
        this.drawableId = drawableId;
    }

    public int getDrawableId() {
        return drawableId;
    }

    private static final DiceNum[] diceValues = DiceNum.values();

    // 주사위 숫자를 가지고 DicNum을 검색
    public static DiceNum of(int num) {
        try {
            return diceValues[num];
        } catch (ArrayIndexOutOfBoundsException e){
            return DiceNum.NONE;
        }
    }
}

 

주사위 관련 로직을 가진 클래스를 만듭니다.

public class Dice {

    private final Random random = new Random();
    // 주사위 숫자의 누적횟수를 저장할 Map
    private final Map<DiceNum, Integer> rolledData = new HashMap<>();

    public void clear() {
        rolledData.clear();
    }

    public DiceNum roll() {
        DiceNum result = DiceNum.of(generateDiceNumber());
        int rolledCount = getRolledCount(result);
        rolledData.put(result, rolledCount + 1);
        return result;
    }
    
    // Unit test시 오버라이드할 수 있도록 procted로 선언
    protected int generateDiceNumber() {
        return random.nextInt(6) + 1;
    }

   public int getRolledCount(DiceNum diceNum) {
        Integer result = rolledData.get(diceNum);
        return result == null ? 0 : result;
    }
}

 

액티비티를 수정합니다.

public class MainActivity extends AppCompatActivity {

    ...
    private Dice dice;

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

        dice = new Dice();

        b1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                 rollDice();
            }
        });
    }

    private void rollDice() {
          DiceNum diceNum = dice.roll();
          if (diceNum == DiceNum.NONE) {
               // show error
               return;
          }

          b1.setImageResource(diceNum.getDrawableId());
          T1.setText("" + dice.getRolledCount(diceNum); 
    }
}

 

 

spark (227,530 포인트) 님이 2022년 11월 12일 답변
위의 구조가 좀 더 테스트하기에 용이하지만, 복잡하게 느껴지시면 Dice 클래스 안에 있는 로직을 꺼내서 액티비티에 넣으시면 됩니다.
...