Skip to content

[충남대 Android_노수진] 미션 제출합니다#26

Open
graccon wants to merge 12 commits intonext-step:mainfrom
graccon:cnu/noh-sujin
Open

[충남대 Android_노수진] 미션 제출합니다#26
graccon wants to merge 12 commits intonext-step:mainfrom
graccon:cnu/noh-sujin

Conversation

@graccon
Copy link
Copy Markdown

@graccon graccon commented Jun 5, 2024

미니과제2.오목

(1) 진행 소감

  1. 코드 구조화의 중요성:
    처음에는 기능을 구현해야 된다는 생각에 한 파일에 코드를 짜기 시작했다. 기능 구현을 마무리 했을 때, MVC 패턴을 적용하여 코드를 분리했는데 꽤나 어려웠다. ui 처리 부분과 게임 로직 부분을 따로 나눴는데, 하고 보니 가독성과 유지보수성이 좋아졌다는 걸 느꼈다.

  2. 코틀린 익히기
    이번 과제를 통해 코틀린의 유용한 기능들을 익히고 UI와도 더 친숙해질 수 있었다. 특히 리스트의 any 메서드, when 표현식, repeat 함수 등은 구현하다가 찾은 것들이라 생소했는데 유용한 것 같다. 추가로 enum 클래스, 인터페이스, 그리고 Pair 클래스를 활용했는데 확실히 코드가 더 직관적이고 간결하게 작성할 수 있었다.

  3. 클린 코드
    지난 과제에서 메서드 분리를 하라는 피드백을 바탕으로 함수를 기능별로 나누는 데 노력했다. 기능별로 쪼개서 구현하니까 오히려 쉽게 로직을 완성한 것 같다. 덕분에 단위 테스트를 더욱 용이하게 작성할 수 있었다. 엣지 케이스를 포함한 다양한 상황을 테스트했다.

(2) 결과물

  • 에뮬레이터 캡처입니다.
  • [플레이중, 흑돌 승리, 백돌 승리, 무승부]
    image

graccon added 12 commits June 3, 2024 13:03
- 오목 게임의 기능 목록을 작성했습니다.
- 게임판을 구성하고 초기 상태로 설정
- 사용자가 돌을 놓을 수 있는 클릭 리스너
- 게임판에 돌을 놓을 수 있는 기능을 구현
- 두 플레이어가 번갈아가며 돌을 놓을 수 있도록 설정
- 플레이어의 순서를 전환하는 로직 추가
- Cell 클래스를 추가하여 게임판의 셀을 관리

주요 내용:
1. Player 클래스:
   - 플레이어 이름과 돌 이미지 리소스를 관리
   - `Player(name: String, stoneResId: Int)`

2. MainActivity 클래스:
   - 상수 `BOARD_SIZE`를 추가하여 게임판의 크기를 정의
   - `initializeBoard` 함수: 게임판을 초기화하고 셀 클릭 리스너를 설정
   - `onCellClick` 함수: 셀 클릭 시 플레이어의 돌을 놓고 다음 플레이어로 전환
   - `switchPlayer` 함수: 현재 플레이어를 전환

3. Cell 클래스:
   - ImageView를 상속하여 게임판의 셀을 표현
   - 셀이 비어있는지 확인하는 `isEmpty` 함수 추가
   - 셀 초기화 및 좌표 설정을 위한 추가 생성자 구현
- 현재 플레이어를 표시하기 위해 플래그 강조 기능을 구현
- Player 데이터 클래스에 highlightResId 속성 추가
- 강조된 바둑돌 이미지 black_stone_highlight.xml, white_stone_highlight.xml 추가
- when 구문을 사용하여 MainActivity에서 플레이어 플래그를 전환하고 업데이트
- checkWinCondition: 가로, 세로, 대각선으로 다섯 개의 돌이 연속되었는지 확인
- countStones: 해당 칸의 돌이 바둑판 범위 안에서 같은 색 돌이면 카운트
- isWithinBounds, isSamePlayerStone으로 조건 확인
- Stone 인터페이스로 BlackStone, WhiteStone 클래스 만듦
- 게임이 종료된 후, 승자를 화면에 전시하는 ui 구현
- BlackStone, WhiteStone를 override toString하여 한글 이름을 붙힘
- onCreate에 visibility를 보이지 않게 설정
- 셀이 다 찼을 때 무승부(승부를 낼 수 없다)
- 무승부일 경우 ui message 결과 표시
- onCellClick 클린하게 함수 분리
- Model(GameEngine): 게임 로직과 데이터 상태를 관리
- View(GameView): UI를 표시하고 사용자의 입력을 처리
- 게임이 종료시에 바둑돌 놓지 않게 구현
- 게임 재시작 시에 바둑판 ui, boardStatus 초기화
- enum 게임 상태 관리: ONGOING, WIN, DRAW
- GameEngine과 MainActivity의 코드 리팩토링
- startGame 메서드에 예외 처리 추가
- 함수명 동사로 수정, 클린 코드로 변경
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant