--- id: wiki-2026-0508-gamification-theory title: Gamification Theory category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Gamification, Game Design Psychology] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [gamification, psychology, motivation, game-design] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: typescript framework: react --- # Gamification Theory ## 매 한 줄 > **"매 game-design element 의 매 non-game context 의 application"**. 매 2002 Pelling coinage → 매 2010 Deterding-Dixon framework → 매 2024 Duolingo / Strava / Habitica 의 매 대중화. 매 Self-Determination Theory (SDT) 의 매 autonomy / competence / relatedness 의 매 psychological backbone. ## 매 핵심 ### 매 PBL Triad - **Points**: 매 score 의 매 progress signal. - **Badges**: 매 achievement 의 매 status marker. - **Leaderboards**: 매 social comparison 의 매 motivation engine. ### 매 SDT 매 lens - **Autonomy**: 매 user 의 choice — 매 forced quest = anti-pattern. - **Competence**: 매 graduated challenge — 매 flow channel 의 maintenance. - **Relatedness**: 매 social bond — 매 guild / team / friend system. ### 매 응용 1. Duolingo (streak + XP + league). 2. Strava (segments + KOM/QOM). 3. Stack Overflow (rep + badges). 4. Habitica (RPG-task manager). ## 💻 패턴 ### XP + level curve ```typescript function xpForLevel(level: number): number { // RuneScape-style 의 매 exponential ramp. return Math.floor(0.25 * (level ** 3) - 0.25 * level + 100); } function levelFromTotalXp(totalXp: number): number { let lvl = 1, sum = 0; while (sum + xpForLevel(lvl) <= totalXp) { sum += xpForLevel(lvl); lvl++; } return lvl; } ``` ### Streak system (Duolingo-style) ```typescript interface StreakState { currentStreak: number; longestStreak: number; lastActiveDate: string; // YYYY-MM-DD freezeTokens: number; // 매 1-day shield } function updateStreak(s: StreakState, today: string): StreakState { const last = new Date(s.lastActiveDate); const now = new Date(today); const days = Math.floor((+now - +last) / 86400_000); if (days === 0) return s; if (days === 1) { const cur = s.currentStreak + 1; return { ...s, currentStreak: cur, longestStreak: Math.max(cur, s.longestStreak), lastActiveDate: today }; } if (days === 2 && s.freezeTokens > 0) { return { ...s, freezeTokens: s.freezeTokens - 1, lastActiveDate: today }; } return { ...s, currentStreak: 1, lastActiveDate: today }; } ``` ### Badge system (declarative) ```typescript type Predicate = (state: UserState) => boolean; interface Badge { id: string; name: string; predicate: Predicate; } const BADGES: Badge[] = [ { id: 'streak_30', name: '30-day Streak', predicate: s => s.currentStreak >= 30 }, { id: 'first_quest', name: 'First Quest', predicate: s => s.questsDone >= 1 }, { id: 'social_butterfly', name: 'Social Butterfly', predicate: s => s.friends >= 10 }, ]; function evaluateBadges(state: UserState, owned: Set): Badge[] { return BADGES.filter(b => !owned.has(b.id) && b.predicate(state)); } ``` ### Leaderboard with relegation (Duolingo league) ```typescript const TIERS = ['Bronze','Silver','Gold','Sapphire','Ruby','Emerald','Amethyst','Pearl','Obsidian','Diamond'] as const; function weeklyRelegation(group: { userId: string; xp: number; tier: number }[]) { group.sort((a, b) => b.xp - a.xp); return group.map((u, i) => { if (i < 7) return { ...u, tier: Math.min(u.tier + 1, TIERS.length - 1) }; if (i >= group.length - 5) return { ...u, tier: Math.max(u.tier - 1, 0) }; return u; }); } ``` ### Variable-ratio reinforcement (loot) ```typescript function rollReward(): Reward { const r = Math.random(); if (r < 0.001) return { kind: 'epic', xp: 500 }; if (r < 0.05) return { kind: 'rare', xp: 100 }; if (r < 0.30) return { kind: 'uncommon', xp: 25 }; return { kind: 'common', xp: 5 }; } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | Habit-forming app | Streak + light social leaderboard | | Educational | XP + levels + adaptive difficulty | | Enterprise / corporate | 매 careful — 매 extrinsic-overjustification risk | | Health / fitness | Goal-setting + progress visualization | **기본값**: SDT-aligned 의 autonomy-first design — 매 PBL 의 매 surface 의 X. ## 🔗 Graph - 부모: [[Self-Determination Theory]] - Adjacent: [[Magic-Circle]] · [[Player-Experience-Modeling]] · [[보상의 역효과 (Overjustification Effect)]] ## 🤖 LLM 활용 **언제**: motivation system design, streak/badge schemas, league mechanics. **언제 X**: 매 deep clinical behavioral therapy (전문가 영역). ## ❌ 안티패턴 - **Pointsification**: 매 PBL 만 의 surface bolt-on — 매 intrinsic motivation 의 매 erosion. - **Forced competition**: 매 mandatory leaderboard 의 매 stress / 매 churn. - **Streak anxiety**: 매 punishing-loss design — 매 freeze-token 의 매 mitigation. ## 🧪 검증 / 중복 - Verified (Deterding et al. 2011, Ryan & Deci SDT, Duolingo Engineering blog 2023). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — XP/streak/badge/league working code |