앱인토스 미니앱 4 – 보석 광산
앱인토스 미니앱 제작기 네 번째는 보석 광산입니다. 계산기나 기록 앱 같은 도구가 대부분인 제 미니앱 가운데 놀이 쪽에 속하는 앱인데, 타일을 눌러 땅을 파고 보석을 모으는 단순한 게임이에요.
9월에 이 게임을 크게 손봤습니다. 부적, 제련소, 주말 이벤트 같은 놀 거리를 더했는데, 이 글은 무엇을 왜 더했고 값은 어떤 기준으로 정했는지에 대한 기록입니다.
보석 광산은 어떤 앱인토스 미니앱인가



가로 6칸, 세로 5칸 타일을 누르면 빈 땅이나 바위, 보석 중 하나가 나옵니다. 누를 때마다 곡괭이 내구도가 1씩 줄고, 다 쓰면 그날 채굴은 멈춥니다. 다음 날이 되면 내구도가 다시 차고 새 광산이 열립니다.
보석은 일반, 고급, 희귀, 전설 네 등급에 30종이 있습니다. 광산은 다섯 층인데 깊이 내려갈수록 귀한 보석이 나올 확률이 올라가요.
9월에 더한 것들
기본 놀이는 이미 돌아가고 있어서, 더 오래 즐길 수 있게 놀 거리를 더했습니다.
전에는
- 상점의 “행운의 부적”이 준비 중 표시만 있음
- 같은 보석이 또 나오면 골드로 바꾸는 것 말고 쓸 데가 없음
- 매일 똑같은 확률표
- 게임 방법을 알려주는 화면이 없음
- 내구도를 다 쓰면 더 할 방법이 없음
더한 것
- 부적을 실제로 구현 (하루 동안 귀한 보석 확률 1.5배)
- 제련소: 같은 등급 3개를 합쳐 한 등급 위 보석으로
- 주말 황금 광맥: 토·일에 전설 확률 2배
- 채굴 안내 화면과 오늘의 미션
- 내구도 충전 (광고 또는 골드)
게임 방법 화면은 리뷰에서 설명이 더 있으면 좋겠다는 의견을 받고 넣었어요. 처음 앱을 열면 한 번 보여주고, 그 뒤로는 물음표 버튼으로 다시 볼 수 있어요.

하루 한 판이 다음 날로 이어지게
게임이 하루로 끝나지 않도록 여러 겹으로 이어 뒀습니다. 매일 들어오면 연속 출석이 쌓이고, 지금까지 캔 양에 따라 새내기 광부에서 시작하는 칭호가 올라가요. 보석은 도감에 한 칸씩 채워지는데, 한 등급을 전부 모으면 칭호와 곡괭이 꾸미기를 받습니다.
9월에 더한 것들도 이 흐름에 맞물리게 했습니다. 오늘의 미션을 끝내면 골드와 부적 조각을 받고, 조각 네 개를 모으면 부적이 됩니다. 조각이 모자라면 300골드로 살 수도 있어요. 같은 보석이 겹쳐 나와도 제련소에서 윗등급으로 바꿀 수 있으니, 꽝처럼 느껴지던 중복이 재료가 됩니다.
날짜로 만드는 오늘의 광산
이 게임에는 서버가 없습니다. 그런데도 “오늘의 광산”이 매일 바뀝니다. 날짜를 씨앗 삼아 광산을 만들기 때문이에요.
export function generateMine(date: Date, layer: number, boosts: MineRateBoosts = {}): MineTile[][] {
const baseSeed = dateToSeed(date);
const seed = baseSeed * 100 + layer * 7 + 42;
const rand = seededRandom(seed);함수의 첫 부분입니다. 이렇게 만든 난수로 30칸을 차례로 채웁니다.
서버 없이 ‘오늘의 무언가’를 만드는 방법
날짜를 20261007 같은 숫자로 바꿔 난수의 출발점으로 씁니다. 출발점이 같으면 뽑히는 순서도 같아서, 조건이 같은 날 같은 층은 같은 광산이 돼요. 여기에 층 번호를 섞어 넣어 층마다 배치가 달라지게 했고, 한 번 연 광산은 어느 칸을 팠는지까지 기기에 저장해 두고 이어서 팝니다.
확률을 올릴 때는 어디서 덜어낼지 정한다
부적과 주말 이벤트는 귀한 보석이 나올 확률을 올립니다. 확률을 올리는 건 쉬운데, 올린 만큼 어디선가 빼지 않으면 전체 합이 100을 넘어 버려요.
function applyRateBoosts(rates: number[], boosts: MineRateBoosts): number[] {
if (!boosts.charmActive && !boosts.weekendVeinActive) return rates;
const [empty, rock, common, uncommon, rare, legendary] = rates;
const rareMultiplier = boosts.charmActive ? 1.5 : 1;
let legendaryMultiplier = boosts.charmActive ? 1.5 : 1;
if (boosts.weekendVeinActive) legendaryMultiplier *= 2;
let boostedRare = rare * rareMultiplier;
let boostedLegendary = legendary * legendaryMultiplier;
const cap = 60;
if (boostedRare + boostedLegendary > cap) {
const scale = cap / (boostedRare + boostedLegendary);
boostedRare *= scale;
boostedLegendary *= scale;
}
const delta = (boostedRare - rare) + (boostedLegendary - legendary);
const newEmpty = Math.max(0, empty - delta);
return [newEmpty, rock, common, uncommon, boostedRare, boostedLegendary];
}늘어난 몫은 빈 땅에서 덜어냅니다. 일반 보석이나 바위 확률은 그대로 두고 “꽝”만 줄이는 식이에요. 부적과 주말이 겹치면 전설 확률이 세 배가 되는데, 그래도 희귀와 전설을 합쳐 60%는 넘지 못하게 막아 뒀습니다.
더 하고 싶은 사람을 위한 충전
내구도를 다 쓴 사람이 더 하고 싶을 때 고를 수 있는 길을 두 개 만들었습니다.
const AD_RECHARGE_AMOUNT = 10;
const AD_RECHARGE_DAILY_LIMIT = 3;
const GOLD_RECHARGE_COSTS = [100, 250, 500];
const GOLD_RECHARGE_DAILY_LIMIT = GOLD_RECHARGE_COSTS.length;광고를 보면 내구도 10이 차고 하루 세 번까지 됩니다. 게임 안 골드로는 한 번에 가득 채울 수 있는데 값이 100, 250, 500으로 뛰어요.
충전 값은 이렇게 정했다
골드 충전 첫 값 100은 곡괭이 첫 업그레이드 비용 50의 두 배입니다. 오래 남는 성장보다 그날 쓰고 사라지는 충전이 더 비싸야 한다고 봤어요. 값이 갈수록 뛰는 건 골드만 있으면 하루 종일 캘 수 있게 두지 않으려는 것이고요. 충전은 시도 횟수만 늘릴 뿐 확률은 건드리지 않고, 광고 보상은 끝까지 봤다는 신호가 왔을 때만 줍니다.
다음에 다듬을 것들
놀 거리는 충분히 들어갔다고 보고, 당분간은 새 기능을 얹기보다 지금 있는 것을 다듬으려고 합니다.
- 처음 60초를 직접 써 보기. 처음 들어온 사람이 어디서 망설이는지 실제 휴대폰으로 봅니다.
- 사용자가 쓰는 말 확인하기. 사람들이 이 게임을 어떤 말로 찾고 이해하는지 보고, 필요하면 소개 문구를 맞춥니다.
- 망설이는 곳만 고치기. 이미 쉽게 이해되는 화면은 건드리지 않습니다.
새로 떠오른 요약 화면이나 공유 기능 아이디어는 일단 적어만 두었어요. 실제로 필요하다는 게 확인되면 그때 만들 생각입니다.
프로젝트를 어떤 식으로 진행하는지는 프로젝트 진행 방식에, 매주 돌아오는 구조를 다룬 다른 앱 이야기는 로또 번호 생성기 글에 있습니다.
보석 광산 자주 묻는 질문
보석 광산은 어떤 게임인가요?
가로 6칸, 세로 5칸 타일을 눌러 땅을 파고 보석을 모으는 게임입니다. 곡괭이 내구도가 매일 새로 채워지고, 보석은 네 등급 30종이 있습니다.
같은 날에는 광산이 똑같이 나오나요?
날짜와 층 번호를 난수의 출발점으로 써서 광산을 만들기 때문에 조건이 같으면 같은 배치가 나옵니다. 부적이나 주말 이벤트로 확률이 바뀌면 배치도 달라질 수 있습니다.
광고를 봐야만 계속할 수 있나요?
아닙니다. 다음 날이 되면 내구도는 다시 채워집니다. 더 하고 싶을 때만 광고를 보거나 게임 안 골드로 충전할 수 있습니다.
이 글은 앱인토스 미니앱 「보석 광산」의 기록입니다. 앱인토스는 토스 앱 안에서 미니앱을 서비스하는 플랫폼이고, 공식 안내는 앱인토스 개발자센터에 있습니다.
이 글은 직접 만들고 운영하며 남긴 기록입니다. 적힌 수치는 작성 시점의 제 계정 기준이며, 같은 결과나 수익을 보장하지 않습니다.

2 Comments