この記事の目的

クロスワードWebに使ったソースコードを公開します。ファイルを開いたときだけコードを読み込みます。

使用したツール

  • Next.js 15、React 19、TypeScript: 待合室、ゲームルーム、API
  • node:sqlite: 盤と入力の記録の保存
  • Ollama の gemma4: 盤の設計と問題の作成。OpenAI 互換 API で呼ぶので、別のモデルに替えられます。
  • Google ニュースの RSS、韓国語版ウィキペディアの API: 時事の見出しとランダムな単語
  • OpenSubtitles の韓国語頻度順位: 単語の等級

フォルダ構成

  • lib/puzzle.ts: 難易度の設定、盤を問題リストに変える処理、基準の検査
  • lib/gridFill.ts: 盤の検証・補正、あらかじめ描いた盤、単語の埋め込み、単語連結型の配置器
  • lib/dynamicBank.ts: AIによる盤の設計、AIによる問題作成、ニュース・ウィキの単語
  • lib/words.ts、freqRanks.ts: 単語バンクと頻度順位
  • lib/db.ts: 記録DB、途中保存、空の盤の整理
  • app/page.tsx、app/play/page.tsx: 待合室とゲームルーム
  • app/api: 新しい盤、記録の保存・一覧・続きから解く API
  • components/CrosswordBoard.tsx: 盤の描画
  • scripts/text-agent.ts、ai-pipeline-test.ts: 生成器とAIの過程を文字でテストするツール

実行するときは .env.local.example を .env.local にコピーして、モデルのアドレスを入れます。モデルがなければ、単語バンクとウィキの単語だけで盤を作ります。記録DB、広告・デプロイのスクリプト、サーバーの監視プログラムは載せていません。

全ソース

32ファイル · 6,788行 — フォルダを開いてファイルを押すとコードを読み込みます。

プロジェクトルート4ファイル
.env.local.exampletext · 9行 · 319B

コードを読み込んでいます…

next.config.tstypescript · 16行 · 353B

コードを読み込んでいます…

package.jsonjson · 24行 · 597B

コードを読み込んでいます…

tsconfig.jsonjson · 21行 · 592B

コードを読み込んでいます…

app/12ファイル
app/api/game/[code]/move/route.tstypescript · 50行 · 1KB

コードを読み込んでいます…

app/api/game/[code]/route.tstypescript · 51行 · 2KB

コードを読み込んでいます…

app/api/game/abandon/route.tstypescript · 15行 · 522B

コードを読み込んでいます…

app/api/game/list/route.tstypescript · 17行 · 539B

コードを読み込んでいます…

app/api/game/route.tstypescript · 45行 · 2KB

コードを読み込んでいます…

app/api/puzzle/route.tstypescript · 74行 · 2KB

コードを読み込んでいます…

app/globals.csscss · 57行 · 1KB

コードを読み込んでいます…

app/layout.tsxtsx · 34行 · 1KB

コードを読み込んでいます…

app/page.module.csscss · 225行 · 3KB

コードを読み込んでいます…

app/page.tsxtsx · 172行 · 6KB

コードを読み込んでいます…

app/play/page.tsxtsx · 861行 · 29KB

コードを読み込んでいます…

app/play/play.module.csscss · 425行 · 6KB

コードを読み込んでいます…

components/2ファイル
components/CrosswordBoard.module.csscss · 83行 · 1KB

コードを読み込んでいます…

components/CrosswordBoard.tsxtsx · 98行 · 3KB

コードを読み込んでいます…

lib/10ファイル
lib/db.tstypescript · 433行 · 13KB

コードを読み込んでいます…

lib/dynamicBank.tstypescript · 360行 · 14KB

コードを読み込んでいます…

lib/freqRanks.tstypescript · 404行 · 8KB

コードを読み込んでいます…

lib/gameTypes.tstypescript · 63行 · 1KB

コードを読み込んでいます…

lib/gridFill.tstypescript · 970行 · 32KB

コードを読み込んでいます…

lib/guest.tstypescript · 60行 · 2KB

コードを読み込んでいます…

lib/puzzle.tstypescript · 579行 · 17KB

コードを読み込んでいます…

lib/recentWords.tstypescript · 33行 · 891B

コードを読み込んでいます…

lib/services.tstypescript · 88行 · 2KB

コードを読み込んでいます…

lib/words.tstypescript · 1,229行 · 88KB

コードを読み込んでいます…

scripts/3ファイル
scripts/ai-pipeline-test.tstypescript · 41行 · 1KB

コードを読み込んでいます…

scripts/dev-with-ts.mjsjavascript · 91行 · 2KB

コードを読み込んでいます…

scripts/text-agent.tstypescript · 147行 · 4KB

コードを読み込んでいます…

types/1ファイル
types/node-sqlite.d.tstypescript · 13行 · 378B

コードを読み込んでいます…