또자의 코딩교실

[스마트인재개발원] 주사위 게임 예제 만들기 본문

코딩공부/Android

[스마트인재개발원] 주사위 게임 예제 만들기

또자자 2022. 1. 3. 15:29

문제정의 : 버튼 클릭시, 주사위가 바뀌면서 점수를 올리는 App구현

기능)
1. 버튼을 클라하면 주사위 이미지를 랜덤으로 변경한다.
2. 주사위 눈을 비교하여 점수를 올린다. 단, 동일한 눈일 경우 점수를 올리지 않는다.

주사위를 던져 주사위 눈 수가 더 많은 쪽이 이기는 게임이다.

 

이벤트 처리 방식 3가지를 활용해 해보는 방법이다.
1. xml의 OnClick속성에 메소드 연결 -> 거의 사용하지 않는다.

2. interface를 class에 구현
- 같은 기능의 버튼이 여러 개 정의되어있는 경우 사용함. (상속만 하면 되니까)

3. interface를 익명 class로 정의하는 방법.
- 독립적으로 버튼의 기능을 구현해야 할 때 사용함.

 

앱 Layout 구성은 이렇게 했다.

 

public class MainActivity extends AppCompatActivity {
	
    //이미지 배열 생성
    int[] diceImgArr = {R.drawable.dice1, R.drawable.dice2, R.drawable.dice3, R.drawable.dice4, R.drawable.dice5, R.drawable.dice6};
	
    //객체 정의
    TextView a_dice;
    TextView b_dice;
    ImageView img_a_dice;
    ImageView img_b_dice;
    Button DiceChange;

    int res_a=0; //a주사위 최종 출력 점수값
    int res_b=0; //b주사위 최종 출력 점수값

    int idx_a; //a주사위 난수 결과
    int idx_b; //b주사위 난수 결과

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //findViewById의 역할만 담당하는 다른 메소드이다.
        initView();
		
        //DiceChange Button 누를 경우 수행하는 기능
        DiceChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //애니메이션 설정
                Animation anim = AnimationUtils.loadAnimation(MainActivity.this,R.anim.dice_shake);
                img_a_dice.startAnimation(anim);
                img_b_dice.startAnimation(anim);


                //주사위 던지기 (난수)
                Random random = new Random();
                idx_a = random.nextInt(6);
                idx_b = random.nextInt(6);
                
                //이미지 설정
                img_a_dice.setImageResource(diceImgArr[idx_a]);
                img_b_dice.setImageResource(diceImgArr[idx_b]);

                //주사위 난수 더하기
                if(idx_a>idx_b) {
                    res_a++;
                }else if(idx_a<idx_b){
                    res_b++;
                }else {
                    /* Toast : HTML의 Alert과 비슷한 기능.
                    메인엑티비티화면의 정보를 매개변수로 넘기고(MainActivity.this)
                    무승부라는 글자를("무승부!")
                    짧게 띄울거에요.(Toast.LENGTH_SHORT)*/
                    Toast.makeText(MainActivity.this, "무승부!", Toast.LENGTH_SHORT).show();
                }
                //최종 바뀐 점수 셋팅. res_a와 res_b 는 int의 자료형이므로 valueOf를 통해 꼭 String형으로 바꿔주자.
                a_dice.setText(String.valueOf(res_a));
                b_dice.setText(String.valueOf(res_b));
            }
        });


    }
	
    //findViewById의 역할만 담당하는 다른 메소드이다.
    private void initView() {
        a_dice = findViewById(R.id.a_dice);
        b_dice = findViewById(R.id.b_dice);
        img_a_dice = findViewById(R.id.img_a_dice);
        img_b_dice = findViewById(R.id.img_b_dice);
        DiceChange = findViewById(R.id.DiceChange);

    }


}
<!-- 사용할 수 있는 애니메이션 xml파일 -->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <rotate
        android:interpolator="@android:anim/linear_interpolator"
        android:duration="2000"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="0"
        android:toDegrees="1080"
        />

    <scale
        android:fromXScale="0.5" android:toXScale="0.85"
        android:fromYScale="0.5" android:toYScale="0.85"
        android:pivotX="50%" android:pivotY="50%"
        android:duration="1000" />
    <scale
        android:fromXScale="0.85" android:toXScale="1.0"
        android:fromYScale="0.85" android:toYScale="1.0"
        android:pivotX="50%" android:pivotY="50%"
        android:startOffset="1000"
        android:duration="1000" />

</set>
Comments