상세 컨텐츠

본문 제목

[안드로이드] 같은 그림 찾기 게임 만드는 방법 part4 - 비교&완료

안드로이드

by aries574 2022. 4. 5. 13:40

본문


이번 시간에는 저번 포스팅에 이어서 하겠습니다.

8개의 이미지를 섞어서 버튼을 클릭하면 해당 이미지가

보이는 기능까지 구현했습니다. 이제 마무리로 클릭을

해서 첫 번째 이미지와 두 번째 이미지를 비교해서 같은지

다른지 비교하는 기능을 구현하겠습니다. 

이전 포스팅은 아래 링크를 들어가시면 됩니다.

2022.04.04 - [안드로이드] - [안드로이드] 같은 그림 찾기 게임 만드는 방법 part3 - 클릭&뒤집기

 

[안드로이드] 같은 그림 찾기 게임 만드는 방법 part3 - 클릭&뒤집기

이번 시간에는 저번 포스팅에 이어서 하겠습니다. 8개의 이미지를 섞어서 이미지 버튼에 보여주는 것까지 했습니다. 이번엔 처음에는 기본 이미지들로 보이다가 버튼을 클릭하면 해당 위치의

aries574.tistory.com


목차

1. 실행 화면

2. 메인 코드 구현 MainActivity.java


목차

1. 실행 화면

 

 

2. 메인 코드 구현 MainActivity.java

 - 수정 - 

 2-1 전역 변수 추가

    //이전 카드 위치
    int preCardPosition = -1;

 2-2 updateModel: 뒤집힌 카드 체크 및 비교 로직 추가

        //뒤집힌 카드: 이전에 뒤집힌 카드 0 또는 2개일때
        if(preCardPosition == -1){
            //카드 초기화
            restoreCard();

            //위치 저장
            preCardPosition = position;

        }else{ //이전에 뒤집힌 카드: 1개일때
            //카드 비교
            checkForMatch(preCardPosition, position);
            preCardPosition = -1;
        }

 2-3 restoreCard(): 매치되지 않은 카드 초기화

    private void restoreCard(){

        for(int i = 0; i < cards.size(); i++){

            //매치되지 않은거
            if(!cards.get(i).isMatched()){

                //이미지 앞으로
                buttons[i].setImageResource(R.drawable.question);

                //데이터 수정
                cards.get(i).setFaceUp(false);
            }
        }
    }

 2-4 checkForMatch(): 카드 이미지 비교

    private void checkForMatch(int prePosition, int position){

        //처음 카드와 두번째 카드 이미지가 같다면
        if(cards.get(prePosition).getImageId() == cards.get(position).getImageId()){

            resultText.setText("매치 성공");

            cards.get(prePosition).setMatched(true);
            cards.get(position).setMatched(true);

            //색상변경
            buttons[prePosition].setAlpha(0.1f);
            buttons[position].setAlpha(0.1f);

            //완료 체크
            checkCompletion();
        }else{
            resultText.setText("매치 실패");
        }
    }

 

 

2-5 checkCompletion(): 완료 체크

    private void checkCompletion(){

        int count = 0;

        for(int i =0; i < cards.size(); i++){

            if(cards.get(i).isMatched()){

                count++;
            }
        }

        //매치갯수가 카드갯수와 같다면 완료
        if(count == cards.size()){

            resultText.setText("게임 끝");
        }
    }

 

2-6 init(): 초기화 수정

            //선명도 설정
            buttons[i].setAlpha(1.0f);

 

        //결과텍스트 초기화
        resultText.setText("");

 2-7 전체 코드

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    //버튼 배열
    private ImageButton[] buttons = new ImageButton[8];
    
    //이미지 리스트
    private ArrayList<Integer> imageList;

    //카드 리스트
    private ArrayList<MemoryCard> cards;


    //결과 텍스트
    private TextView resultText;

    //초기화 버튼
    private Button resetBtn;

    //이전 카드 위치
    int preCardPosition = -1;

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

        resultText = findViewById(R.id.result_text);

        //초기화
        init();

        resetBtn = findViewById(R.id.reset_btn);
        resetBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //초기화
                init();
            }
        });

    }//onClick

    //초기화
    public void init(){

        imageList = new ArrayList<>();

        //이미지 리스트에 데이터 등록
        imageList.add(R.drawable.dog);
        imageList.add(R.drawable.pig);
        imageList.add(R.drawable.rabbit);
        imageList.add(R.drawable.cat);
        imageList.add(R.drawable.dog);
        imageList.add(R.drawable.pig);
        imageList.add(R.drawable.rabbit);
        imageList.add(R.drawable.cat);

        //순서 섞기
        Collections.shuffle(imageList);

        //카드 초기화
        cards = new ArrayList<>();

        // 버튼 초기화
        for(int i = 0; i < buttons.length; i++){

            String buttonID = "imageBtn" + i;
            int resourceID = getResources().getIdentifier(buttonID, "id", getPackageName());
            buttons[i] = findViewById(resourceID);

            //각 버튼에 클릭이벤트 적용
            buttons[i].setOnClickListener(this);

            //카드 리스트에 이미지 담기
            cards.add(new MemoryCard(imageList.get(i), false, false));

            //각 버튼에 기본 이미지로 변경
            buttons[i].setImageResource(R.drawable.question);

            //선명도 설정
            buttons[i].setAlpha(1.0f);
        }

        //결과텍스트 초기화
        resultText.setText("");
    }

    //버튼 클릭이벤트
    @Override
    public void onClick(View view) {

        int id = view.getId();

        int position = 0;

        if(id == R.id.imageBtn0){

            position = 0;

        }else if(id == R.id.imageBtn1){
            position = 1;

        }else if(id == R.id.imageBtn2){
            position = 2;

        }else if(id == R.id.imageBtn3){
            position = 3;

        }else if(id == R.id.imageBtn4){
            position = 4;

        }else if(id == R.id.imageBtn5){
            position = 5;

        }else if(id == R.id.imageBtn6){
            position = 6;

        }else if(id == R.id.imageBtn7){
            position = 7;
        }

        //업데이트 모델
        updateModel(position);

        //업데이트 뷰
        updateView(position);
    }

    //데이터 변경
    private void updateModel(int position){

        MemoryCard card = cards.get(position);

        //나중에 카드 비교 할때 뒤집고 다시 클릭하는거 방지
        if(card.isFaceUp()){

            Toast.makeText(this, "이미 뒤집혔음", Toast.LENGTH_SHORT).show();
            return;
        }


        //뒤집힌 카드: 이전에 뒤집힌 카드 0 또는 2개일때
        if(preCardPosition == -1){
            //카드 초기화
            restoreCard();

            //위치 저장
            preCardPosition = position;

        }else{ //이전에 뒤집힌 카드: 1개일때
            //카드 비교
            checkForMatch(preCardPosition, position);
            preCardPosition = -1;
        }

        //반대의 값을 넣는다. 앞면 -> 뒷면 , 뒷면 -> 앞면
        cards.get(position).setFaceUp(!card.isFaceUp());
    }

    //뷰 변경
    private void updateView(int position){

        MemoryCard card = cards.get(position);

        //뒤집었음 랜덤 이미지로 보여준다.
        if(card.isFaceUp()){
            buttons[position].setImageResource(card.getImageId());

        }else{ //기본 이미지
            buttons[position].setImageResource(R.drawable.question);
        }
    }

    /**
     * 매치되지 않은 카드 초기화
     */
    private void restoreCard(){

        for(int i = 0; i < cards.size(); i++){

            //매치되지 않은거
            if(!cards.get(i).isMatched()){

                //이미지 앞으로
                buttons[i].setImageResource(R.drawable.question);

                //데이터 수정
                cards.get(i).setFaceUp(false);
            }
        }
    }

    /**
     * 카드 이미지 비교
     * @param prePosition 이전 카드 위치
     * @param position 현재 카드 위치
     */
    private void checkForMatch(int prePosition, int position){

        //처음 카드와 두번째 카드 이미지가 같다면
        if(cards.get(prePosition).getImageId() == cards.get(position).getImageId()){

            resultText.setText("매치 성공");

            cards.get(prePosition).setMatched(true);
            cards.get(position).setMatched(true);

            //색상변경
            buttons[prePosition].setAlpha(0.1f);
            buttons[position].setAlpha(0.1f);

            //완료 체크
            checkCompletion();
        }else{
            resultText.setText("매치 실패");
        }
    }

    /**
     * 완료 체크
     */
    private void checkCompletion(){

        int count = 0;

        for(int i =0; i < cards.size(); i++){

            if(cards.get(i).isMatched()){

                count++;
            }
        }

        //매치갯수가 카드갯수와 같다면 완료
        if(count == cards.size()){

            resultText.setText("게임 끝");
        }
    }
}//MainActivity

2022.03.23 - [안드로이드] - [안드로이드] tic-tac-toe 보드게임 만드는 방법 part1 - 화면 구성

 

[안드로이드] tic-tac-toe 보드게임 만드는 방법 part1 - 화면구성

이번 시간에는 Tic Tac Toe라는 게임을 만들어 보겠습니다. 두 명이서 번갈아 가며 클릭을 하며 가로, 세로, 대각선 중 한 줄을 만들면 이기는 단순한 게임입니다. 이번에는 화면만 구성하겠습니다.

aries574.tistory.com

2022.03.24 - [안드로이드] - [안드로이드] tic-tac-toe 보드게임 만드는 방법 part2- 기능 구현

 

[안드로이드] tic-tac-toe 보드게임 만드는 방법 part2- 기능구현

이번 시간에는 저번 포스팅에 이어서 하겠습니다. 저번 포스팅에선 화면 구성을 했고, 이번에는 기능 구현을 해보겠습니다. 2022.03.23 - [안드로이드] - [안드로이드] tic-tac-toe 보드게임 만드는 방

aries574.tistory.com

2022.03.30 - [안드로이드] - [안드로이드] 야구게임 만드는 방법 part1 - 화면 구성 및 랜덤 숫자 생성

 

[안드로이드] 야구게임 만드는 방법 part1 - 화면구성 및 랜덤숫자 생성

이번 시간에는 야구게임을 만들어 보겠습니다. 게임의 규칙을 설명하겠습니다. 1. 게임을 시작하면 랜덤한 숫자 3개를 생성합니다. 2. 사용자는 랜덤으로 생성된 숫자 3개를 맞춰야 합니다. 3. 숫

aries574.tistory.com

2022.03.31 - [안드로이드] - [안드로이드] 야구게임 만드는 방법 part2 - 기능 구현

 

[안드로이드] 야구게임 만드는 방법 part2 - 기능구현

이번에는 저번에 이어서 야구게임 기능 구현을 만들어보겠습니다. 이전 포스팅은 아래에 있습니다. 2022.03.30 - [안드로이드] - [안드로이드] 야구게임 만드는 방법 part1 - 화면 구성 및 랜덤 숫자

aries574.tistory.com

반응형

관련글 더보기

댓글 영역