상세 컨텐츠

본문 제목

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

안드로이드

by aries574 2022. 3. 24. 15:51

본문


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

저번 포스팅에선 화면 구성을 했고, 이번에는 

기능 구현을 해보겠습니다. 

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

 

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

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

aries574.tistory.com


목차

1. 실행 화면

2. 메인 코드 구현 MainActivity.java


1. 실행 화면

 

 

2. 메인 코드 구현 MainActivity.java

 - 설명 -

 1. activityPlayer변수를 통해 플레이어를 체크합니다.

 2. 플레이어 1이면 X 표시와 gameState배열에 0을 넣고, 

 플레이어 2이면 O표시와 gameState배열에 1을 넣습니다.

 3. 승리 체크는 winningPosition를 통해 비교해서 한 줄을 

 만들었는지 체크해서 일치한다면 승리합니다. 

 4. 승리했다면, 해당 플레이어의 승리점수를 1점 올리고

 상태 표시에 승리했다는 표시를 해주고 게임을 초기화

 해줍니다.

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private TextView pOneScore, pTwoScore, pStatus;
    private Button[] buttons = new Button[9];
    private Button resetGame;

    private int pOneScoreCount, pTwoScoreCount, roundCount;

    //활성화 플레이어
    boolean activityPlayer; //true: p1, false: p2

    //클릭 한 버튼위치 들어갈 배열
    int[] gameState = {2, 2, 2, 2, 2, 2, 2, 2, 2};

    //승리 위치
    int[][] winningPosition = {
            {0,1,2}, {3,4,5}, {6,7,8}, //가로 한 줄
            {0,3,6}, {1,4,7}, {2,5,8}, //세로 한 줄
            {0,4,8}, {2,4,6} //대각선 한 줄
    };

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

        //컴포넌트 초기화
        pOneScore = findViewById(R.id.playerOneScore);
        pTwoScore = findViewById(R.id.playerTwoScore);
        pStatus = findViewById(R.id.playerStatus);
        resetGame = findViewById(R.id.resetGame);

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

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

        //변수 초기화
        roundCount = 0; //클릭 횟수
        pOneScoreCount = 0; //플레이어1 승수
        pTwoScoreCount = 0; //플레이어2 승수
        activityPlayer = true; //플레이어 차례

        //게임 전체 초기화
        resetGame.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                playerAgain(); //게임 초기화
                pOneScoreCount = 0;
                pTwoScoreCount = 0;
                pStatus.setText("");
                updatePlayerScore(); // 점수 초기화
            }
        });
    }//onCreate

    /**
     * 승리 포지션 체크
     * @return 참, 거짓
     */
    public boolean checkWinner(){

        boolean winnerResult = false;

        for(int [] winningPosition : winningPosition){

            if(gameState[winningPosition[0]] == gameState[winningPosition[1]] &&
            gameState[winningPosition[1]] == gameState[winningPosition[2]] &&
            gameState[winningPosition[0]] != 2){

                winnerResult = true;
            }
        }
        return winnerResult;
    }

    /**
     * 점수 업데이트
     */
    public void updatePlayerScore() {

        pOneScore.setText(Integer.toString(pOneScoreCount));
        pTwoScore.setText(Integer.toString(pTwoScoreCount));
    }

    /**
     *게임 초기화
     * 클릭횟수, 플레이어차례, 버튼표시
     */
    public void playerAgain() {

        roundCount = 0; //클릭 횟수
        activityPlayer = true; //플레이어 차례

        //버튼 초기화
        for(int i = 0; i < buttons.length; i++){
            gameState[i] = 2;
            buttons[i].setText("");
        }
    }

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

        //버튼값이 비워있지 않으면 리턴
        if(!((Button)view).getText().toString().equals("")){
            return;
        }

        //버튼 ID 변수에 담기(예: btn_2 )
        String buttonID = view.getResources().getResourceEntryName(view.getId());

        //버튼 ID에서 숫자만 변수에 담기 (예:2) 
        int gameStatePointer = Integer.parseInt(buttonID.substring(buttonID.length()-1, buttonID.length()));

        //사용자 순서 true: player1, false: player2
        if(activityPlayer){

            //버튼 텍스트 설정
            ((Button)view).setText("X");

            //버튼 텍스트 색상 설정
            ((Button)view).setTextColor(Color.parseColor("#FFC34A"));

            //해당 위치에 0을 넣는다.
            gameState[gameStatePointer] = 0;

        }else{
            //버튼 텍스트 설정
            ((Button)view).setText("O");

            //버튼 텍스트 색상 설정
            ((Button)view).setTextColor(Color.parseColor("#70FFEA"));

            //해당 위치에 1을 넣는다.
            gameState[gameStatePointer] = 1;
        }

        roundCount++; //버튼 클릭 갯수 올리기
        
        //승리 체크
        if(checkWinner()){
            if(activityPlayer){
                pOneScoreCount++; //승수 올리기
                updatePlayerScore(); //승수 업데이트
                Toast.makeText(this, "Player1 승리", Toast.LENGTH_SHORT).show();
                pStatus.setText("Player1 승리");
                playerAgain();//게임 초기화

            }else{
                pTwoScoreCount++; //승수 올리기
                updatePlayerScore(); //승수 업데이트
                Toast.makeText(this, "Player2 승리", Toast.LENGTH_SHORT).show();
                pStatus.setText("Player2 승리");
                playerAgain();//게임 초기화

            }
        }else if(roundCount == 9){ //9개가 다 채워졌는데 승부가 안났다면
            playerAgain();
            Toast.makeText(this, "무승부", Toast.LENGTH_SHORT).show();

        }else{ //상대방 차례로 변경
            activityPlayer = !activityPlayer;
        }
    }
}//MainActivity

2022.03.20 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part1 - 화면과 DB

 

[안드로이드] ToDoList SQLite 만드는 방법 part1 - 화면과 DB

이번 시간에는 ToDoList SQLite 할 일 목록 화면과 DB부분을 만들어 보겠습니다. 목차 1. 실행 화면 2. 라이브러리 등록 3. ToDo 클래스 만들기 4. ToDo DB 만들기 5. ToDo 화면 만들기 6. 메인 화면 구성 acti..

aries574.tistory.com

2022.03.21 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part2 - 조회, 등록

 

[안드로이드] ToDoList SQLite 만드는 방법 part2 - 조회, 등록

이번 시간에는 저번 포스팅에 이어서 하겠습니다. 저번에 만든 DB와 화면에 조회와 등록하는 기능을 추가해 보겠습니다. 2022.03.20 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part1 - 화

aries574.tistory.com

2022.03.22 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part3 - 수정, 삭제

 

[안드로이드] ToDoList SQLite 만드는 방법 part3 - 수정, 삭제

이번 시간에는 저번 포스팅에 이어서 하겠습니다. 마지막으로 수정 및 삭제 기능을 추가해 보겠습니다. 2022.03.21 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part2 - 조회, 등록 [안드로

aries574.tistory.com

반응형

관련글 더보기

댓글 영역