# 🎮 Test Project: Module C - CyberTyper 2026

## 1. 프로젝트 개요 (Project Overview)
본 과제는 영문 타이핑을 기반으로 한 고성능 아케이드 게임 개발입니다. 선수는 제공된 `words_data.json` 파일을 분석하여 **데이터베이스(MySQL)**를 설계하고 , 탄환이 실시간 좌표를 추적하여 단어를 파괴하는 역동적인 프론트엔드 엔진을 API와 연동하여 완성해야 합니다.

## 2. 주요 용어 정의 (Technical Definitions)
* **VFX (Visual Effects)**: 게임 내 시각 특수 효과입니다. 탄환 충돌 시 글자가 파편으로 부서지는 효과 등을 의미합니다.
* **WPM (Words Per Minute)**: 분당 단어 입력 속도 지표입니다. (계산식: `타이핑한 총 단어 수 / 플레이 시간(분)`)
* **HP (Health Point)**: 플레이어의 생명력(100%)이며, 단어를 놓칠 때마다 차감되어 0%가 되면 게임이 종료됩니다.

## 3. Step 1: 백엔드 API 및 데이터베이스 설계 (Server-side)
모든 API 엔드포인트는 `/module_c/api/` 경로를 사용하며 , 데이터의 영속성(Persistence)을 보장해야 합니다.

### **A. 데이터베이스 구성 (필수 구현)**
* **Word Table**: 제공된 `words_data.json`의 내용을 기반으로 단어 텍스트, 난이도 레벨, 고유 점수 정보를 저장하는 테이블을 생성해야 합니다.
* **Ranking Table**: 플레이어 이름, 최종 점수, 최대 콤보를 저장하는 테이블을 설계해야 합니다. 이 데이터는 서버 재시작 후에도 유지되어야 합니다.

### **B. API 로직 요구사항**
* **단어 공급 API (`GET /module_c/api/words?level=n`)**: 
    1. 요청한 난이도(`level`)에 해당하는 단어 중 랜덤하게 추출합니다.
    2. **중복 방지**: 현재 게임 화면에 이미 나타나 있는 단어는 중복해서 호출되지 않도록 처리해야 합니다.
* **랭킹 API**: `POST` 요청을 통해 기록을 DB에 저장하고, `GET` 요청 시 상위 **Global TOP 5** 기록을 점수 내림차순으로 반환합니다.

### **C. 제출물 (Deliverables)**
* 선수는 작성한 API 소스코드와 함께, 설계한 데이터베이스 구조를 확인할 수 있는 **`table.sql`** 파일을 반드시 루트 폴더에 포함해야 합니다.

## 4. Step 2: 게임 엔진 및 점수 로직 (Front-end Development)

### **A. 난이도별 설정 (생성 주기 및 낙하 속도)**
단어는 화면 상단(y=0)의 **가로축 랜덤 위치**에서 생성되어 아래로 이동합니다.

| 난이도 (Level) | 단어 생성 주기 (Interval) | 낙하 속도 (Speed) | 난이도 가중치 ($Multiplier$) |
| :--- | :--- | :--- | :--- |
| **Level 1** | 2.0초마다 1개 생성 | 느림 (50px/sec) | 1.0 |
| **Level 2** | 1.5초마다 1개 생성 | 보통 (80px/sec) | 1.5 |
| **Level 3** | 1.0초마다 1개 생성 | 빠름 (120px/sec) | 2.0 |

### **B. 상세 점수 산출 공식 ($FinalScore$)**
$$FinalScore = BasePoints + (CurrentCombo \times LevelMultiplier)$$
* **$BasePoints$ (고유 점수)**: 맞춘 단어가 DB에서 가지고 있는 고유 점수 값입니다.
* **$CurrentCombo$**: 연속 성공 횟수입니다. (성공 시 +1, 단어가 바닥에 닿으면 즉시 0으로 초기화).
* **표시**: 계산된 점수는 게임 화면 **Score** 영역에 실시간 누적 표시됩니다.

### **C. HP 시스템 및 회복**
* **감소**: 단어가 바닥(Bottom Line)에 닿으면 HP가 **10%** 차감됩니다.
* **회복**: **20 콤보** 달성 시마다 현재 줄어든 HP의 **5%**가 보너스로 즉시 회복됩니다.

## 5. Step 3: UI/UX 및 장면별 명세 (Design Implementation)

### **A. 3-Scene SPA(Single Page Application) 구조**
* 본 과제는 페이지 전체 새로고침 없이 자바스크립트를 통해 화면이 전환되는 **SPA 구조**로 개발되어야 합니다.
* **Scene 1 (Start)**: 플레이어 이름 입력 및 난이도 선택.
* **Scene 2 (Play)**: 실제 게임 진행 화면.
* **Scene 3 (Result)**: 최종 점수 요약 및 Global TOP 5 랭킹 출력 화면.

### **B. 시작 화면 (Start Scene)**
* **입력 요소**: 게임 제목(CyberTyper 2026), **플레이어 이름 입력란(필수)**, **난이도 선택(Level 1, 2, 3)** 라디오 버튼 또는 선택창.
* **시작 버튼**: 모든 정보가 입력되면 활성화되며, 클릭 시 게임 화면으로 진입합니다.

### **C. 게임 화면 필수 구성 요소 (채점 항목)**
* **Score**: 실시간 누적 점수판.
* **Combo**: 현재 연속 성공 횟수.
* **WPM**: 실시간으로 계산되는 분당 타수.
* **HP Gauge**: 시각적으로 변하는 생명력 바.
* **Input Field**: 플레이어가 영문 단어를 입력하는 텍스트 영역.
* **Falling Words**: 상단 랜덤 위치에서 낙하하는 단어들.

### **D. 투사체(Projectile) 및 피버 효과**
* **탄환 및 충돌**: 엔터 입력 시 하단에서 단어의 **실시간 좌표**로 탄환이 발사되며, 충돌 시 글자 파편 VFX가 발생하며 단어가 소멸합니다.
* **Fever Mode 시각 효과**: 20 콤보 달성 시 화면 중앙에 **"FEVER MODE"** 텍스트 애니메이션이 잠시 나타났다가 사라져야 하며, 배경의 네온 VFX는 기존 배경과 시각적으로 확연히 구분되어야 합니다.

### **E. 랭킹 화면 (Result Scene)**
* 데이터베이스에서 불러온 **Global TOP 5** 순위표를 표시합니다. 순위표에는 1등부터 5등까지의 순위와 이름, 점수, 순위달성일시가 표시되어야 합니다.
* **[New Game]** 버튼 클릭 시 모든 설정을 초기화하고 이름 입력 화면으로 되돌아갑니다.

---

## 6. 채점 기준 요약 (Marking Scheme - 25.00)

| 항목 | 상세 기준 | 배점 |
| :--- | :--- | :--- |
| **Design (7.0)** | 탄환/파편 역동성, 필수 UI(HP, Score) 가시성 및 VFX 완성도  | 7.0 |
| **Front-end (11.0)** | 난이도별 로직(주기/속도), 중복 없는 단어 관리, 탄환 좌표 연산  | 11.0 |
| **Back-end (7.0)** | **DB 테이블 설계 및 데이터 영속성**, TOP 5 랭킹 API 설계  | 7.0 |