OpenJev を落ち物パズルに組み込み、各ターンで置き場所を1つ選ばせました。モデルにゲームを直接操作させているわけではありません。プログラム側で合法手を列挙し、その中のどれを選ぶかだけを聞きます。
戻ってきた候補ごとの確率から最大の手を JavaScript 側で実行し、次の盤面でも同じ処理を繰り返します。落下アニメや重力・衝突判定は JS 側です。本記事はその入出力と、手元環境での実測です。仕組みの一般論は 型付き判定コンポーネント OpenJev に譲ります。
紹介映像
今回やったこと
モデルが動かすのは「置き場所」だけです。
OpenJev は、状況・問い・選択肢を渡すと各選択肢の確率を返します。文章や JSON は生成しません。今回使ったのはこの部分だけです。TypeSafe 社の Jev 本体の重み・学習・API は使っていません。公開モデルで同じ入出力の形を試す独立実装です。
1手を決める処理
ピースが確定するたびに、次の4段階を1回ずつ行います。
毎回のモデル呼び出しは「候補から1つ選ぶ」に限定されています。
モデルに渡している盤面
画像ではなく、ASCII の盤面と数値を渡します。例は、中央1列だけ空いた状態に T 字ブロックが落ちている場面です。
GOAL: clear lines, avoid holes, keep height low and even.
FALLING: T at x=3 y=0 rot=0
NEXT: I
HEIGHTS: 4 4 4 4 0 4 4 4 4 4
HOLES: 0
MAX_HEIGHT: 4
BUMPINESS: 8
....T.....
...TTT....
..........
..........
####.#####
####.#####
####.#####
####.#####
この状態に対し、回転と横位置を変えた最大16個の候補を作り、それぞれの結果も候補説明として渡しています。
代表例では16候補からこの手を選んだ
16個を評価し、drop_r2_x3 が 0.735 で最も高くなったので、その手を実行しました。
この手は1ラインを消す一方で、穴が3つできます。今回の実験は、落ち物パズルの強さを評価するものではありません。実運用の信頼度として使うには、用途ごとの校正が必要です。
文章を生成しない
モデルに回答文を作らせていません。盤面と候補を入力したあと、生成ループには入らず、その時点の logits から必要な候補だけを読みます。
手元の RTX 5090 環境での実測
HP OMEN / NVIDIA GeForce RTX 5090 / Qwen3.5-4B / bfloat16 / CUDA GPU 1枚で、4つの盤面を1手ずつ測りました。
この数字は今回の PC と実装での実測であり、OpenJev 一般の性能値ではありません。
今回の実装で確認できたこと
確認したかったのは、落ち物パズルで強いかどうかではありません。盤面と候補手を渡して確率を取り、その値をゲームの次の処理へ渡せるかどうかです。
ロボティクスで使うなら、こういう位置
落ち物パズルの構成を、そのままロボットへ持ち込めるという話ではありません。使うとすれば、低位のモータ制御ではなく、候補がすでに決まっている短い意味判断です。
この実験からは言えないこと
結果を広げすぎないために、3点を分けて書きます。
言えるのは、公開モデルを使った OpenJev で「盤面 + 候補手 → 候補の確率」を組み、文章を生成せずにゲームを進められたところまでです。
まとめ
- 候補から1手を選ぶ ― 合法手を列挙し、OpenJev は置き場所だけを選ぶ。操作そのものは JS 側。
- 生成トークン 0 ― 1回 forward して logits から確率を読む。記録した4手は文章を1トークンも作っていない。
- 代表例 ― 16候補から
drop_r2_x3(0.735)。相対値であり、正解率ではない。 - 実測 ― RTX 5090 環境で1手 0.276〜0.661秒。一般性能の主張ではない。
- 位置づけ ― 短い意味判断のデモ。モータ制御の置き換えでも、プレイの上手さの評価でもない。
説明は生成AI、判定は確率。落ち物パズルは、その判定をゲームの1手として見せた例です。デモやご相談を承っています。