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);
}
}