ゲームの仕組み

Meowdokuソルバーがスクリーンショットから盤面を読む仕組み

Meowdokuソルバーが受け取るのはパズルそのものではなく、その画像です。解く前に盤面の位置、マス数、同じ色を共有するマスを判断しなければなりません。各判断の方法と、まだ誤る場面を説明します。

難しいのは色を読むことではない

Meowdokuのスクリーンショットの大半は盤面ではありません。ヘッダー、ルール表示、タイマー、端末のステータスバーまで写っています。盤面は中央付近の正方形ですが、位置と大きさは端末によって異なり、画像内に目印もありません。

色を読む前に、3つの未知数を確定する必要があります。どれか1つを誤ると、少し不正確になるのではなく、別のパズルを自信満々に解くことになります。

処理はすべてブラウザ内で完結する

スクリーンショットはアップロードされません。画像をcanvasに描き、ピクセルを読み取り、その数値配列に対してすべての処理を自分のタブ内で行います。サーバーが画像を見たり保存したりすることはありません。

送信しない画像なら、保存や削除を約束する必要もありません。通信がないため、盤面は1秒を大きく下回る時間で返ります。

最初に長辺が最大900ピクセルになるまで縮小します。必要なのは鮮明な写真ではなく各マスの代表色であり、ピクセル処理量は縮尺の二乗で減ります。

手順1:盤面を見つける

まず四辺の外側7%を標本にして背景色を推定します。鮮やかなピクセルを除外して各色チャンネルの中央値を取り、隅に写ったバナーが推定を狂わせないようにします。

次に各ピクセルを背景か非背景に分け、行ごとに非背景を数えます。余白はほぼゼロ、盤面は高密度、ヘッダーは中間という密度曲線ができます。高密度の連続部分が候補です。1ピクセルの罫線による細い谷はつなぎますが、盤面上の本物の空白はつながらないため、ルール表示を除外できます。

決め手は正方形かどうかです。各候補を反対軸でも走査し、縦横の差がおよそ3分の1以内で、画像の3%以上を占めるものだけを残します。バナーやバーは横長ですが、Meowdokuの画面で正方形なのは盤面です。

正方形が見つからない場合は、すでに盤面だけに切り抜かれていると判断し、画像全体を使います。位置を特定できない画像ほど、そもそも特定が不要なことが多いからです。

手順2:マス数を数える

盤面の場所だけでは7×7か9×9か分かりません。盤面を400段階で横切って色の変化を測り、もう一方の軸に並ぶ48本の線で平均します。暗い猫1匹を境界と誤認せず、マスの端が規則的なピークになります。

ピーク間隔を測るのではなく仮説を検証します。4から12までの各NについてN−1本の内部境界の位置を計算し、近くのピークとの一致度を採点します。曲線を最もよく説明するNが採用されます。

縦横は別々に測った後、正方形という条件で調整します。横が8、縦が7なら、片方が薄い線を見落としたと考え、大きい方を選びます。

手順3:中心ではなくリング上で色を取る

盤面とマス数が分かると、各マスから1色を読む必要があります。自然に思えるのは中央のピクセルです。

しかし中央には猫や✕があります。途中まで解いた盤面で中央を読むと、記号の色を領域色と誤認し、存在しない領域を作ってしまいます。

そこで中心から28%、36%、43%の3つの同心円上を、それぞれ16方向、合計48点で標本化します。リングは罫線の内側で記号の外側です。平均ではなく各チャンネルの中央値を使い、ぼかされた縁や反射に当たった少数点を排除します。

手順4:色を正確にN個の領域へ分ける

N×N個の色を領域に分けます。通常のクラスタリングはグループ数が未知な点で難しく、数を誤ると静かに答えが壊れます。

Meowdokuではルールが数を決めています。N×N盤面には連結した領域が必ずN個あります。9×9なら9個で、8個でも10個でもありません。つまりkが既知のk-meansになり、この段階は前の2段階より安定します。

初期中心は既存の中心から最も遠い色を順に選び、実際の色相へ広く配置します。選択はランダムではないので、同じ画像は必ず同じ盤面になります。

領域番号は最後に読み順へ付け直し、左上を含む領域を先頭にします。解答には影響せず、人が自然に付ける順番へ整えるだけです。

手順5:解き、2つ目の解答を調べる

大きさと領域IDが分かれば、ゲームの生成にも使う制約ソルバーで解くだけです。重要なのは1つではなく2つの解答を要求することです。

正しく読めた盤面には解が1つしかありません。2つなら一部のマスが別の領域へ誤分類され、0なら別方向の誤読で制約が矛盾しています。2つ目を探すことで、解答だけでなく読み取り自体も判定できます。

失敗する場面と、塗り直せる理由

手順4より前は最善推定であり、失敗することがあります。実際に多いのは次のケースです。

塗り直しは予備機能ではなく設計の一部

そのため盤面をドラッグして各マスを塗り直せます。また、異なる領域が正確にN個になるまでソルバーは動かず、現在の個数を表示します。この安全策が、統合・分割の誤りから自信ありげな誤答が出るのを防ぎます。

盤面はゲーム標準色ではなく元画像から取った色で描き直すため、読み取りを一目で確認できます。色が違って見えるマスは誤りで、ドラッグ1回で直せます。検出が面倒な九十数%を受け持ち、残りの判断をあなたが行います。

自分の盤面で試してみる

行き詰まった盤面を撮り、ソルバーへ入れて読み違えたマスを確認してください。誤読はほぼ、このページで説明した条件に現れます。

ソルバーはブラウザ内だけで動作します。画像は端末上で読み取られ、アップロードされません。