이번 시간에는 저번 포스팅에 이어서 하겠습니다.
저번 포스팅에선 화면 구성을 했고, 이번에는
기능 구현을 해보겠습니다.
2022.03.23 - [안드로이드] - [안드로이드] tic-tac-toe 보드게임 만드는 방법 part1 - 화면 구성
- 설명 -
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
2022.03.21 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part2 - 조회, 등록
2022.03.22 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part3 - 수정, 삭제
[안드로이드] 리싸이클러뷰(RecyclerView) 홀수행, 짝수행 별 색상 다르게 하는 방법 (0) | 2022.03.26 |
---|---|
[안드로이드] 리스트뷰 (ListView) 홀수행, 짝수행 별 색상 다르게 하는 방법 (0) | 2022.03.25 |
[안드로이드] tic-tac-toe 보드게임 만드는 방법 part1 - 화면구성 (0) | 2022.03.23 |
[안드로이드] ToDoList SQLite 만드는 방법 part3 - 수정, 삭제 (0) | 2022.03.22 |
[안드로이드] ToDoList SQLite 만드는 방법 part2 - 조회, 등록 (0) | 2022.03.21 |
댓글 영역