앱
Fluxile
세 방향의 라인을 완성하며 공간을 설계하는 헥사 블록 퍼즐입니다.
주요 성과
3방향 라인 판정과 교차 셀의 중복 제거 방지
삼각형 격자에서 배치·회전·라인 판정을 분리하고, 동시에 완성된 라인의 셀을 Set으로 모아 한 번씩 제거하도록 구현했습니다.
재실행 복원과 순위 제출 실패 후 재시도 구현
버전이 있는 게임 스냅샷과 난이도별 점수를 관리하고, 순위 등록 실패를 대기 점수로 보존해 다음 연결에서 다시 제출하도록 구성했습니다.
같은 게임 규칙을 iOS·Android 네이티브 앱으로 출시
SwiftUI·SpriteKit과 Kotlin·Compose로 구현했습니다. 핵심 규칙·저장 경로를 테스트하고 외부 플랫폼 서비스는 Fake 구현으로 교체할 수 있게 했습니다.
랜덤 손패와 배치 가능성 사이의 균형 잡기
무작위로 블록 세 개를 뽑으면 같은 종류만 나오거나, 놓을 공간이 있는데도 현재 손패를 하나도 놓지 못할 수 있었습니다. 랜덤성을 유지하면서 다음 턴의 선택지를 보장할 조건이 필요했습니다.
같은 패밀리 세 개를 제한하고 현재 방향으로 최소 한 개는 배치 가능하도록 검사했습니다. 재시도를 무한히 반복하지 않도록 30회 이후에는 배치 가능한 후보를 찾아 하나를 포함하는 fallback으로 전환했습니다. 가능한 후보 자체가 없으면 별도의 게임오버 후보 상태를 반환합니다.
여러 라인이 교차할 때 제거를 한 번만 처리하기
삼각형 격자의 세 방향 라인은 한 셀에서 교차할 수 있습니다. 완성된 라인마다 셀을 따로 제거하면 같은 셀이 중복 처리될 수 있고, 프리뷰가 실제 보드를 바꾸는 문제도 피해야 했습니다.
완성 라인의 셀 ID를 Set으로 합쳐 한 번씩 제거했습니다. 프리뷰는 배치 예정 셀을 가정해 라인만 계산하고 보드는 변경하지 않도록 분리했습니다. 보드·배치·라인 제거 규칙을 화면 연출과 별도로 테스트했습니다.
종료·연결 실패를 게임 데이터 손실로 만들지 않기
재실행 시 게임을 복원해야 했고, 저장 형식이 바뀌는 경우도 다뤄야 했습니다. 순위 제출 실패 때문에 점수를 잃는 상황과 외부 SDK에 의존하는 테스트도 분리할 필요가 있었습니다.
진행 중 게임은 버전이 있는 스냅샷으로 저장하고 보석·아이템 데이터와 분리했습니다. 난이도별 순위 대기 점수를 보존해 다음 연결에서 다시 제출하도록 했습니다. Game Center·광고 서비스는 Fake 구현으로 교체할 수 있게 하고, Android의 저장 매체도 메모리 구현으로 바꿔 저장·복원을 검증했습니다.