앱

Fluxile

세 방향의 라인을 완성하며 공간을 설계하는 헥사 블록 퍼즐입니다.

역할
기획·게임 로직·iOS/Android 개발·배포
기술
Swift, SwiftUI, SpriteKit, Kotlin, Jetpack Compose, XCTest

주요 성과

  • 3방향 라인 판정과 교차 셀의 중복 제거 방지

    삼각형 격자에서 배치·회전·라인 판정을 분리하고, 동시에 완성된 라인의 셀을 Set으로 모아 한 번씩 제거하도록 구현했습니다.

  • 재실행 복원과 순위 제출 실패 후 재시도 구현

    버전이 있는 게임 스냅샷과 난이도별 점수를 관리하고, 순위 등록 실패를 대기 점수로 보존해 다음 연결에서 다시 제출하도록 구성했습니다.

  • 같은 게임 규칙을 iOS·Android 네이티브 앱으로 출시

    SwiftUI·SpriteKit과 Kotlin·Compose로 구현했습니다. 핵심 규칙·저장 경로를 테스트하고 외부 플랫폼 서비스는 Fake 구현으로 교체할 수 있게 했습니다.

랜덤 손패와 배치 가능성 사이의 균형 잡기

무작위로 블록 세 개를 뽑으면 같은 종류만 나오거나, 놓을 공간이 있는데도 현재 손패를 하나도 놓지 못할 수 있었습니다. 랜덤성을 유지하면서 다음 턴의 선택지를 보장할 조건이 필요했습니다.

같은 패밀리 세 개를 제한하고 현재 방향으로 최소 한 개는 배치 가능하도록 검사했습니다. 재시도를 무한히 반복하지 않도록 30회 이후에는 배치 가능한 후보를 찾아 하나를 포함하는 fallback으로 전환했습니다. 가능한 후보 자체가 없으면 별도의 게임오버 후보 상태를 반환합니다.

여러 라인이 교차할 때 제거를 한 번만 처리하기

삼각형 격자의 세 방향 라인은 한 셀에서 교차할 수 있습니다. 완성된 라인마다 셀을 따로 제거하면 같은 셀이 중복 처리될 수 있고, 프리뷰가 실제 보드를 바꾸는 문제도 피해야 했습니다.

완성 라인의 셀 ID를 Set으로 합쳐 한 번씩 제거했습니다. 프리뷰는 배치 예정 셀을 가정해 라인만 계산하고 보드는 변경하지 않도록 분리했습니다. 보드·배치·라인 제거 규칙을 화면 연출과 별도로 테스트했습니다.

종료·연결 실패를 게임 데이터 손실로 만들지 않기

재실행 시 게임을 복원해야 했고, 저장 형식이 바뀌는 경우도 다뤄야 했습니다. 순위 제출 실패 때문에 점수를 잃는 상황과 외부 SDK에 의존하는 테스트도 분리할 필요가 있었습니다.

진행 중 게임은 버전이 있는 스냅샷으로 저장하고 보석·아이템 데이터와 분리했습니다. 난이도별 순위 대기 점수를 보존해 다음 연결에서 다시 제출하도록 했습니다. Game Center·광고 서비스는 Fake 구현으로 교체할 수 있게 하고, Android의 저장 매체도 메모리 구현으로 바꿔 저장·복원을 검증했습니다.