数独反省会
この記事はWWA Advent Calendar 2025の16日目です。
前書き
アドベントカレンダーの時期だけWWA界隈に戻ってくる池田哲次です。
今回は自分史上に残る最大の問題作である数独についてお話ししたいと思います。
久しぶりに触ってみた感想
BGMを雨音に設定してポチポチ数字埋めてるときの手触りは良いですね。
数独ができるアプリはネットにいくらでもあるんですけどそういうゲームってマウス単独で操作を完結させてあることが多いせいで視点の反復移動が多くて、「ここに3を入れれば良いんだな」→「じゃあ数字の3を選択して……」→「どこに3を入れるんだっけ」がたまに発生するんですよね。
右手でどこを入力したらいいか選択して、左手で数字を入力できる数独があったら覇権が握れるんじゃないかという発想から生まれた作品が本作です。
強いて言うならキーボードのホームポジションを考えると数字は下に固めた方が良かったんじゃないかと感じます。
1〜3を触ったときにその数字が打ち込めないと直感的でない気がしたので現行のアイテム配置にした記憶があるんですけど、1~3を入力するためにホームポジションから指を2段上にもっていくのが面倒くさすぎる。
ホームポジションから手を離せよって話になるんですけど、Fの出っ張りに触ってないと人差し指が落ち着かない……
雨音以外のBGMの完成度はカスです。
シンセロックは自分でも絶対合わないとはっきり理解しながら数合わせで入れたような記憶があるんですけど、今聴くとラグタイムも長考BGMにあんまり合わねぇな。
記憶が正しければ作曲の勉強を始めてすぐぐらい、根拠のない全能感に満ち満ちている頃だったはずなのでこんな完成度なんですね。
どうやって正誤処理してるの?
WWAscriptの存在する現代ならともかく、当時の環境を考えるとパッと見ではどういう処理なのか全くわからないと思います。
実はマクロ文すら問題の復元処理ぐらいでしか使っておらず、ほぼ背景オブジェクトの配置だけで作ってたりします。
正誤判定処理画面に情報を加えたものを見てみましょう。
これがどういうことかというと、正誤判定中、プレイヤーは延々と反復横飛びをしています。
数独の盤面がx1y1~x9y9に配置されている場合、正誤判定開始ボタンをクリックするとプレイヤーはx21y9に飛ばされます。
(x11でも機能上は問題ないんですが、x10は盤面の切れっ端ゆえ正誤判定中に見えると格好が悪いのでx21~x29で正誤判定をしています)
x1y9に1が入力されている場合、x21y9にはx+10y+0のジャンプゲートが置いてあるので、x31y9にプレイヤーが飛ばされます。
x31y9にはx-10y-1のジャンプゲートが置いてあるんですけど、この位置に入る数字が1ではない場合はx29y0に不正解判定オブジェクトを置く処理が追加されます。
これを9回繰り返して、x21y0に到達するとx+1y+9のジャンプゲートが置いてあるのでx22y9に飛ばされてまた9回繰り返して……を9回繰り返します。
x29y0に到達したときに不正解判定オブジェクトが配置されてなかったら正解です。
プレイヤーは正誤判定の間に170回ジャンプゲートを踏んでるわけです。そりゃ時間がかかるわけだ。
実際に計ってみたら41.6秒でした。いちいち待てねぇよこんな時間。
ちなみに、WWA Wingでは使用しているモニターのリフレッシュレートにジャンプゲートのウェイトが反比例してしまうバグがあるので、メインPCに240Hzのゲーミングモニターが鎮座している現在の我が家ではWing Teamが想定している速度の4倍で処理が終わります。
実測してみたら10.4秒でした。本当に1/4だな。
500Hzのモニターで倍プッシュしたら普通に待てるなこれ(小並感)。
今リメイクするならどういう実装にする?
まあ正誤判定は一瞬で終わらせたいですよね。
あと、出題の時点で既に文字が書いてあるところに手書きで上書きできるのも何とかしたいです。
というわけで1問だけ新システムでデモを作ってきました。
上のテストでは検証しやすいように「無記入の状態の白マスの画像」を「灰色背景の正解の数字の画像」に差し替えてあります。
左上に数字が見えますね?これが現在間違っているマスの数です(これを1つの完成品として世に出す機会が来た場合は、この数字は透明な画像に差し替えて非表示にします)。
灰色の背景の数字を打ち込むと数字が減るのに、それ以外の数字を打ち込んだり消しゴムをかけたりしても数字は減りません。
でも正解の数から別の数字を打ち込んだり消しゴムをかけるとちゃんと数字が減る。
言語化が難しいので各自でマップデータ開いてもらうのが手っ取り早いと思うんですけど(暗証番号は設定していません)、頑張って言語化します。
背景番号10である「灰色背景に1が書いてある床」を踏んだとき、$item文で物体番号10~19がアイテムボックスに入ります。
物体番号10である消しゴムのアイテムを選択すると、背景番号10がプレイヤーと同じ位置に置かれます。同じ処理がもう1回回るわけですね
物体番号15である5を打ち込むと、背景番号15がプレイヤーと同じ位置に置かれます。
背景番号15は「5と手書きしてある床」であり、これを踏んだときも、$itemで物体番号10~19がアイテムボックスに入ります。同じ処理がまた回るわけですね
正しい数値である1を打ち込んだときだけ、背景番号11をプレイヤーと同じ位置に置くと同時に$partsで左上の数字のオブジェクト番号を1つ減らす処理をします。
デクリメント処理は下記の画像のようなゴリ押ししてる暇あったらWWAscript使ったほうが楽だと思います。使ったこと無いので本当にそうかはわかんないけど。
背景画像11は他の番号とは違う挙動を見せます。
アイテムボックスに入るのは物体番号210~219です。
(110~119じゃないのは「既に正しい数字が入ってる場所に別の数字を上から塗りつぶしたら数字を増やさないといけない」という単純な事実に気付くのが遅れて既にこの位置に他の処理書いちゃてたたからです)
1以外の数字を打ち込んだときはインクリメント処理が回るようになっています。上の画像の逆。
チェックを押すと左上のカウントへのジャンプゲートがプレイヤーと同じ位置に置かれて、数字が0だったら正解、そうじゃなかったら不正解と出すわけです。
この方式の良いところは「間違っている部分だけ赤く表示する」みたいな処理も実装できるところですね。
(上のデモだと正しい部分を手書きから印刷調に置き換えるという処理が回ってますけど、逆も可能ということです)
「本来3が入るはずだけど5って書いてあるところ」と「本来7が入るはずだけど5って書いてあるところ」と「5が入るべくして入っているところ」を全部別のオブジェクトとして管理してるのでそういうことができる。
あと、初代の手法だと問題を増やすごとにマップ面積と物体パーツをドカ食いするのであんまり問題数を増やせなかったんです。
でも、今回の方法なら1画面で完結できるし問題ごとに追加で必要なのはチェック機構へのジャンプゲートぐらいで他のパーツは全部使いまわし出来ます。
メリットしか無いし当時の技術でも出来たはずなのに、なんでこれが思いつかなかったんだ当時の自分。
今回デモを作った際の反省点も書いておきます。
正誤判定処理を物体パーツでやるように仕組みを作ってたんですけど、こうすると1回正誤判定処理したときに物体パーツが喪失して2回目以降の処理が出来ないという致命的なイシューがあります。背景パーツでやらないとマズかった。
システムの構想そのものは数年単位で頭の中にあったんですけど、実装は半日程度で勢いでガガッと書いたのでこういうこともある。
下手したらWWA作成ツール触ったの5年ぶりくらいだし形にできただけでも上出来では……?
WWA Advent Calendar 2025、明日はカーリンさんの「どうにかしてルールが難しい作品を無理なく作りたい【WWA】」の予定です。