숫자로 보여주면 성취감이 커진다.

“100문제나 풀었어!”


통계 데이터

const stats = {
  totalGames: 15,           // 총 게임 수
  totalQuestions: 150,      // 총 문제 수
  correctAnswers: 135,      // 맞춘 문제
  bestScore: 180,           // 최고 점수
  bestStreak: 12,           // 최고 연속 정답
  byDifficulty: {           // 난이도별
    easy: { games: 10, correct: 90, total: 100 },
    medium: { games: 5, correct: 45, total: 50 }
  }
};

통계 업데이트

게임 끝날 때:

const newStats = {
  totalGames: stats.totalGames + 1,
  totalQuestions: stats.totalQuestions + totalQuestions,
  correctAnswers: stats.correctAnswers + finalCorrect,
  bestScore: Math.max(stats.bestScore, finalScore),
  bestStreak: Math.max(stats.bestStreak, finalStreak),
  byDifficulty: {
    ...stats.byDifficulty,
    [difficulty]: {
      games: (stats.byDifficulty[difficulty]?.games || 0) + 1,
      correct: (stats.byDifficulty[difficulty]?.correct || 0) + finalCorrect,
      total: (stats.byDifficulty[difficulty]?.total || 0) + totalQuestions
    }
  }
};
saveStats(newStats);

통계 카드

<div className="grid grid-cols-2 gap-2">
  <div className="bg-gradient-to-br from-blue-50 to-indigo-100 p-3 rounded-xl text-center">
    <div className="text-3xl font-bold text-indigo-600">
      {stats.totalGames}
    </div>
    <div className="text-xs text-gray-500"> 게임</div>
  </div>
  
  <div className="bg-gradient-to-br from-green-50 to-emerald-100 p-3 rounded-xl text-center">
    <div className="text-3xl font-bold text-emerald-600">
      {stats.totalQuestions > 0 
        ? Math.round((stats.correctAnswers / stats.totalQuestions) * 100) 
        : 0}%
    </div>
    <div className="text-xs text-gray-500">정답률</div>
  </div>
  
  <div className="bg-gradient-to-br from-amber-50 to-orange-100 p-3 rounded-xl text-center">
    <div className="text-3xl font-bold text-orange-600">
      {stats.bestScore}
    </div>
    <div className="text-xs text-gray-500">최고 점수</div>
  </div>
  
  <div className="bg-gradient-to-br from-rose-50 to-pink-100 p-3 rounded-xl text-center">
    <div className="text-3xl font-bold text-rose-600">
      {stats.bestStreak}🔥
    </div>
    <div className="text-xs text-gray-500">최고 연속</div>
  </div>
</div>

상세 정보

<div className="bg-gray-50 p-3 rounded-xl space-y-2">
  <div className="flex justify-between text-sm">
    <span className="text-gray-500"> 문제 </span>
    <span className="font-bold">{stats.totalQuestions}문제</span>
  </div>
  <div className="flex justify-between text-sm">
    <span className="text-gray-500">맞춘 문제</span>
    <span className="font-bold text-emerald-600">{stats.correctAnswers}문제</span>
  </div>
  <div className="flex justify-between text-sm">
    <span className="text-gray-500">틀린 문제</span>
    <span className="font-bold text-rose-500">
      {stats.totalQuestions - stats.correctAnswers}문제
    </span>
  </div>
</div>

난이도별 정답률

{Object.keys(stats.byDifficulty).length > 0 && (
  <div className="space-y-2">
    <div className="text-sm font-bold text-gray-600">난이도별 정답률</div>
    {Object.entries(stats.byDifficulty).map(([diff, data]) => (
      <div key={diff} className="bg-gray-50 p-2 rounded-lg">
        <div className="flex justify-between items-center text-sm">
          <span>{DIFFICULTY_SETTINGS[diff]?.label || diff}</span>
          <span className="font-bold">
            {data.total > 0 
              ? Math.round((data.correct / data.total) * 100) 
              : 0}%
          </span>
        </div>
        
        {/* 프로그레스 바 */}
        <div className="h-2 bg-gray-200 rounded-full mt-1 overflow-hidden">
          <div 
            className="h-full bg-gradient-to-r from-indigo-400 to-purple-500" 
            style={{ 
              width: `${data.total > 0 ? (data.correct / data.total) * 100 : 0}%` 
            }} 
          />
        </div>
        
        <div className="text-xs text-gray-400 mt-1">
          {data.games}게임 · {data.correct}/{data.total}문제
        </div>
      </div>
    ))}
  </div>
)}

어떤 난이도에서 많이 틀리는지 한눈에.


성장 확인

“어제보다 정답률 올랐어!”

숫자로 보여주니까 아이도 성장 느낌.


다음 글에서 애니메이션.

#12 - 애니메이션