詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

Wordleの漢字バージョン「漢字ル」を作った

漢字ル

こういうやつです。ぜひトライしてみてくださいね。

本家の Wordle を知らない人向けに解説すると、四字熟語当てクイズです。指定された回数のうちに当てないといけませんが、試行のたびに文字が合っているかどうかを教えてくれるので、絞り込みながら推理していきます。 漢字ルの独特なところは、文字単体だけではなく、漢字を構成するパーツ単位でもヒントが出るところ。以下のように、「匕」「耂」といったパーツが(たとえば「老」に)マッチしているようなヒントでもって、漢字を想像していきます。

f:id:motemen:20220206150126p:plain:w300

以下は制作記です。

アイデア

自分も Wordle にそこそこハマったクチで、自然と自分の母語である日本語でこれを実現するとなるとどうなるかを考える。漢字を使うとなると文字種が多くて難しすぎるだろうけど、部首の情報を使えればヒントになるのでは? そしてアホくさくていいのでは? と思ったのだった。

とくに自分の場合は以前 めかぬか というものを作っていて、KanjiVG というプロジェクトの存在を知っていたので、これ使ったらできるんじゃないか? という目論見もあった。

検討

とはいえ実装する時間が潤沢にあるわけではないので、スキマ時間で検討だけ進めておく。

実装については、あの UI をゼロから作るのはあまり楽しそうではなかったし、世の中に Wordle クローンが溢れかえっているのでベースの実装があるんだろうと探してみて hannahcode/word-guessing-game を発見。これを使うことにする。いまは別の人に transfer されていそうだな。

漢字の部首情報には、漢字を構成する部首/偏旁のデータセット というまさに、というものがあったのでこれを使う。正確には部首ではなくパーツなんだけど、よりおかしさが増すだろうってことでそのまま。

四字熟語は Yojijukugo というページが網羅性高くてよさそうだった。全然膾炙してないものもあると見て、N-gram コーパス - 日本語ウェブコーパス 2010 によく出現するもののみに絞ることにした。(しかしこのデータはリリース後、使わないことにした。もっと色んな入力があるようだったし、すべての妥当な四字熟語を列挙すると大量になりそうだったから……。)

それ以外にこのゲームに特有の部分は漢字のパーツ単位での正誤判定だったが、これだけ手元で書いておいた。こんな感じ。

% ts-node sketch.ts
[ '冬虫夏草', '泰然自若' ]
{ radical: '泰', guessIndex: 0, solutionIndex: undefined }
{ radical: '三', guessIndex: 0, solutionIndex: undefined }
{ radical: '大', guessIndex: 0, solutionIndex: undefined }
{ radical: '氺', guessIndex: 0, solutionIndex: undefined }
{ radical: '然', guessIndex: 1, solutionIndex: undefined }
{ radical: '月', guessIndex: 1, solutionIndex: undefined }
{ radical: '犬', guessIndex: 1, solutionIndex: undefined }
{ radical: '灬', guessIndex: 1, solutionIndex: undefined }
{ radical: '自', guessIndex: 2, solutionIndex: [ 2 ] }
{ radical: '目', guessIndex: 2, solutionIndex: undefined }
{ radical: '若', guessIndex: 3, solutionIndex: undefined }
{ radical: '艹', guessIndex: 3, solutionIndex: [ 3 ] }
{ radical: '右', guessIndex: 3, solutionIndex: undefined }
[ 'absent', 'absent', 'radical_correct', 'radical_correct' ]

正解「冬虫夏草」に対して「泰然自若」は、 がそれぞれ位置まで含めて正解。これはバカゲーの予感。

実装

で、ある晩まとまった時間が取れたので試しに作ってみることにした。

まずは頻出四字熟語を生成する。こういう処理は書き捨てになりがちで再現性がないことが多いが、かといってわざわざリポジトリに置く気もしない、と思って Colaboratory でやってみたところ結構よかった。

漢字の入力については、Pokedle がたぶん 見えない <input> で入力させる方法を取っていそうだなというのを見ていたので、同じような方法を取った。見た目にこだわりすぎると時間が溶けるので気にしない方向で適当な場所に置いておく。漢字変換して Enter でなんかするの、絶対ハマるだろうな~と思って調べたらやっぱりハマりそうだった。form の onsubmit を使うことにしたら回避できそうだったのでそのようにした。

部首の一致を表示するために、普通のフォントではなく KanjiVG で文字を描画したい。これについては過去の自分が めかぬか で実装していたのでこれを拝借。

このくらいがオリジナルの実装で、あとはフォーク元に乗っかっている。全体的にもとの実装が TypeScript/React であったため、変更したい場所を特定するのが容易だったし、他言語への対応など考えられているためかごく一部の変更で済んだため結果的にかなりスピードが出せて、その晩のうちに公開までこぎつけられた。


とまあ色んな人の仕事に乗っかったおかげでスムーズに制作できた。KanjiVG が使える CDN があったらさらに早く実装できただろうな~。自分で作ってても相当難しいと思ったが、意外とプレイしてもらえていて、かつ解けている人も多くて驚きがある。

リポジトリはこちらです。

GitHub - motemen/kanjile: A word guessing game made using React, Typescript, and Tailwind

はてなで一緒に働きませんか?