Skip to content

About

ドラクエのように、ゲームを楽しみながら学ぶ英単語アプリ(英検5級・4級)。Next.js 16 / React 19 / Prisma / PHP アセットサーバ

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

WordQuest

ドラクエのように、ゲームを楽しみながら英語を学ぶ。
中学生向けの、絵単語 × ボス戦 × 毎日続くしくみの英単語学習アプリ(英検5級・4級対応)

License: MIT Next.js 16 React 19 TypeScript Tests

WordQuest のスクリーンショット(ホーム・つづりクイズ・会話クイズ・ボス戦)

プレイの様子

画像を見て、独自のソフトキーボードでつづりを入力。単語をマスターするとボスが現れ、覚えた単語で攻撃して倒します。

つづりクイズからボス戦までのプレイ動画

特徴

🎮 ゲームとして続く

  • ボス戦 — 単語をマスターした数に応じてボスが出現。日本語の意味に合う英単語を選んで攻撃する。全語マスターで魔王戦(=その級をコンプ)
  • ストーリー — 章仕立ての会話で「ことばを奪われた世界」を旅する。案内役の「せんせい」つき
  • XP・レベル(20段階)・バッジ(24種)・連続学習ストリーク・学習カレンダー — 報酬はこれだけに絞り、学習と関係ない収集要素は持たない方針

📚 ちゃんと身につく

  • 習得のはしご — 別々の日に正解を重ねるごとに伏字が増え、最後は全文タイピング。間違えたら登り直し(分散学習 × 段階的な難易度)
  • 忘れかけの復習 — 一度マスターした単語も、間があくと復習に出る
  • 9種類のクイズ形式 — つづり穴埋め/例文穴埋め/並べ替え(ドラッグで入れ替え)/4択/リスニング/会話(応答選択・読む版)/文法4択(熟語つき)/ミックス/本番形式の模試(大問別の正答率と合格ライン判定)
  • 独自ソフトキーボード — OSのキーボードを開かないので、スマホでも画面が崩れずテンポよく入力できる

📱 スマホで使いやすい

  • モバイルファースト(幅375px基準、320pxでも崩れない)、ホーム画面に追加できる PWA
  • LINE ログイン、フレンドランキング、LINE での学習リマインド(ログインなしのゲストでも学習できる)
  • アプリ内の「ふぐあいを ほうこく」から GitHub Issue を直接起票

スクリーンショット


ホーム
連続学習・今日の目標・復習

つづりクイズ
画像を見て穴埋め

正解シート
発音・例文つき

並べ替え
意味に合う英文を作る

会話クイズ
場面に合う応答を選ぶ

ボス登場
マスターした語数で出現

ボス戦
正解の英単語で攻撃

ストーリー
せんせいの語り

カレンダー
学習日にスタンプ

バッジ
連続日数・マスター数など

スクリーンショットに写っている画像は、生成AI(Gemini)で作成した学習素材です。素材そのものはこのリポジトリに含まれません(アセットについて)。

収録データ

級 単語 会話 文法4択(熟語つき)
英検5級 400語 20本 60問
英検4級 200語 20本 60問

3級〜1級は級の定義(lib/curriculum.ts)のみで、データは未整備です。単語データの規約(ID の割り当て・例文の書き方など)は CLAUDE.md にまとめ、lib/words.test.ts が自動で検証します。

アーキテクチャ

flowchart LR
  U["📱 ブラウザ / PWA"] -->|HTTPS| N["Next.js<br/>(App Router · Vercel)"]
  N -->|Prisma| DB[("PostgreSQL")]
  N -->|ログイン・通知| L["LINE"]
  N -->|"/api/*-assets<br/>(サーバー側で代理取得)"| A["アセットサーバ<br/>backend-php"]
  U -. "画像・音声を直接取得" .-> A
  G["Gemini Canvas<br/>アセット生成ツール"] -->|"POST + X-Upload-Key"| A
Loading
  • フロント/ロジック: Next.js(App Router)。UI はインラインスタイルで統一し、計算ロジックは lib/ の純関数に切り出して vitest で検証
  • 進捗の保存: ログイン時は DB、ゲスト時はブラウザの localStorage が正
  • アセットサーバ: 画像・音声を配信する素朴な PHP の REST API(backend-php/)。書き込みは共有キー認証。未設定でもアプリは動く(画像・音声なし、合成音声・テキストにフォールバック)
  • アセット生成: Gemini Canvas(AI Studio Build)上で動かす React ツール(canvas/)で、画像・単語音声・例文音声を生成してアップロード

技術スタック

領域 使っているもの
フロントエンド Next.js 16(App Router)· React 19 · TypeScript
DB / ORM PostgreSQL · Prisma 6
認証 Auth.js(NextAuth v5)· LINE ログイン
アセットサーバ PHP 8.1+(依存ライブラリなし)
アセット生成 Gemini(画像生成・TTS)· Gemini Canvas / AI Studio Build
テスト Vitest · Playwright(E2E)· PHP 製の HTTP テスト
CI / ホスティング GitHub Actions · Vercel

クイックスタート

必要なもの: Node.js 22 以上。

git clone https://github.com/GitSumito/wordquest-oss.git
cd wordquest-oss
npm install
cp .env.example .env.local   # 下の「最小構成」を参考に値を入れる
npm run dev                  # http://localhost:3000

最小構成(ゲストとして触るだけ)

ログインなしで学習する分には、DB もアセットサーバも LINE も要りません(進捗はブラウザの localStorage に保存)。ただし起動時に次の環境変数の「存在」だけは必要なので、ダミー値で構いません。

POSTGRES_PRISMA_URL="postgresql://user:pass@localhost:5432/wordquest"
POSTGRES_URL_NON_POOLING="postgresql://user:pass@localhost:5432/wordquest"
AUTH_SECRET="$(openssl rand -base64 32)"
LINE_CLIENT_ID="dummy"
LINE_CLIENT_SECRET="dummy"

本格的に動かす

やりたいこと 必要な設定
ログイン・ランキング・進捗の保存 実際の PostgreSQL を用意して POSTGRES_* に設定し、npx prisma db push でテーブルを作成。LINE ログインのチャネルを作って LINE_CLIENT_ID / LINE_CLIENT_SECRET を設定
画像・音声を表示する backend-php/ を PHP が動くサーバにデプロイし、WORDQUEST_ASSET_BASE_URL にそのベース URL を設定(詳細)
LINE の学習リマインド LINE_MESSAGING_API_TOKEN と CRON_SECRET を設定(cron エンドポイントは app/api/cron/)
アプリ内バグ報告 → Issue 起票 GITHUB_REPORT_TOKEN(Issues: write の fine-grained PAT)と GITHUB_REPORT_REPO(owner/name)の両方。報告に端末情報が入るので、起票先は private リポジトリを推奨
LINE 通知・共有リンクのURL 通常は不要(Vercel の本番ドメインを自動で使う)。独自ドメインなら APP_URL(通知)と NEXT_PUBLIC_APP_URL(共有リンク)を設定

環境変数の一覧は .env.example にあります。

アセット(画像・音声)について

このリポジトリには画像・音声の素材は含まれません。各自で用意する場合の流れは次のとおりです。

  1. backend-php/ を任意のサーバにデプロイし、共有キー(アップロードキー)を発行する
  2. canvas/ のジェネレーター(*.jsx)を Gemini Canvas に貼り、接続設定に Upload API ベース URL と アップロードキー を入力する
  3. 単語・会話・ボス・せんせい・例文トークン音声を生成 → 自動でサーバにアップロードされる
  4. Next.js 側の WORDQUEST_ASSET_BASE_URL を設定する

アセットが無い語は、つづり穴埋めの出題から自動で外れます(文法・並べ替えなど、アセット不要のクイズは影響を受けません)。

テスト

npm test                              # ユニット(Vitest)
npm run test:e2e                      # E2E(Playwright。iPhone 375px と最狭 320px の 2 ビューポート)
php backend-php/tests/run-tests.php   # アセットサーバ API(一時ディレクトリで実 HTTP を叩く)
  • ユニット: 単語データの規約、習得のはしご、ボス出現の計算、模試の採点、ドラッグ入れ替えなど、lib/ の純関数を検証
  • E2E: モバイルでの横はみ出し、ソフトキーボード入力、ボス戦の通し、ストーリー、模試などを実際にブラウザ操作で検証(ゲスト + アセット stub で完結し、DB は不要)
  • PHP: 書き込みの認証(401 / 503)、CORS の許可判定、ファイルの保存・置換を検証
  • CI(.github/workflows/ci.yml)が push / PR ごとに vitest・ビルド・E2E を実行

ディレクトリ構成

.
├── app/            画面と API ルート(App Router)
│   ├── quiz/  boss/  mypage/  calendar/  badges/  ranking/  review/  words/
│   └── api/        進捗・ランキング・アセット代理取得・cron・バグ報告
├── components/     UI コンポーネント(quiz/ story/ charts/ ほか)
├── lib/            ロジックとデータ(純関数中心。*.test.ts が隣に並ぶ)
│   ├── words/  conversations/  grammarQuiz/    級ごとの教材データ
│   └── mastery.ts  bosses.ts  mockExam.ts  story.ts  badges.ts …
├── prisma/         DB スキーマ
├── e2e/            Playwright のスペック
├── canvas/         アセット生成ツール(Gemini Canvas 用の React)
├── backend-php/    アセットサーバ(画像・音声の受け口と一覧 API)
└── docs/           設計資料とスクリーンショット

ドキュメント

ライセンス

MIT。これはコードのライセンスです。単語データ・教材の内容や、生成した画像・音声(スクリーンショットに写っているものを含む)には及びません。

About

ドラクエのように、ゲームを楽しみながら学ぶ英単語アプリ(英検5級・4級)。Next.js 16 / React 19 / Prisma / PHP アセットサーバ

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages