ゲーム画面33枚をJSONにした — 名前が6件合わなかった

公開: 2026-11-10
開発日記Claude Code検証TypeScript

スマホゲーム「大三国志」の編成を相談するための、非公式の補助アプリを作っています。 持っている武将・戦法・武器を、1枚ずつ「持っている」にするのは手間です。そこで、ゲーム画面のスクリーンショットから、持ち物をまとめて入れる機能を作りました。

書き起こしはClaude Codeと進めました。この記事は、できあがったJSONをどう確かめたかの記録です。

入れたもの

2026-11-09に、画面33枚から書き起こしました。

元の画面枚数取り出したもの
武将の一覧12武将106人(全291人のうち一部)
戦法の庫蔵9戦法122(全193のうち一部)
宝物の庫蔵3鋳造効果つきの武器23(全88のうち一部)
敵部隊の編成1(所持の書き起こし25枚のうちの1枚)
自分の部隊編成8部隊8(24営)

流れは次のとおりです。

ゲーム画面書き起こしJSON検査と計画反映33枚(所持25・部隊編成8)武将106・戦法122武器23・部隊8今の状態と見比べ必要な操作だけ作るbatchを1回送る(上限800操作)検査と計画は、状態を触らない関数。反映だけが状態を変える
画面から書き起こしたJSONを、検査・計画・反映の3段で入れる。計画までは何も書き換えない。

名前が6件合わなかった

画面の名前は日本の字体で、アプリのデータは簡体字です。 そこで、名前は opencc-js(日本の字体から簡体字への変換)に通して、データの名前と突き合わせました。

多くの名前は、1回の変換でそのまま合います。趙雲は赵云、劉備は刘备、曹操は曹操、諸葛亮は诸葛亮になり、データと一致しました。

合わなかったのは、次の6件です。

画面の名前変換後(1回)データの名前合わなかった字蔡文姫馬雲騄衛瓘呂姫張姫周姫蔡文姫马云(U+2B627)衞瓘吕姫张姫周姫蔡文姬马云禄卫瓘吕姬张姬周姬姫 U+59EB → 姬 U+59ECU+2B627 → 禄 U+7984衞 U+885E → 卫 U+536B姫 → 姬姫 → 姬姫 → 姬変換は opencc-js の jp → cn。姫と姬は、フォントによって同じ形に見える。違いは文字コードで見分けた
合わなかった6件。違いは3種類の字だけだった(姫→姬、衞→卫、U+2B627→禄)。

机の上に並んだ無地の札。1枚だけ列から外れて朱色になっている

見た目では、どれも同じ名前に見えます。 文字コードを並べると、違いは3種類の字だけでした。

3つの置き換えを、変換のあとに足しました。

import * as OpenCC from "opencc-js";

const toCn = OpenCC.Converter({ from: "jp", to: "cn" });
const fix = (s) =>
  s.replaceAll("姫", "姬").replaceAll("衞", "卫").replaceAll("\u{2B627}", "禄");
const match = (name) => fix(toCn(name));

直したあとで確かめたこと

今回、手元で10件を流し直しました。

直した置換が、合っていた名前を壊していないかも、同時に見ておく必要があります。

確かめたのはこの10件だけです。106人全員を流し直してはいません。取り込み時に突き合わせた記録を信用しています。

画面に写っていてもデータに無い武将は、入れませんでした。二人札を含めて11人分の名前です。データに無いものを無理に近い名前へ寄せると、別の武将の持ち物になってしまうためです。

取り込みは何度押しても増えない

JSONを入れる処理は、状態を触らない関数(planOwnedImport)に、必要な操作の一覧だけ作らせています。 すでに持っているものは、一覧に入れません。

空の状態にプレイヤーを1人入れて、実データで2回流しました。

1回目に作られた操作(合計460)持ち物にする(own)部隊の枠に置く(place)星を付ける(star)兵種汎用技法(tech)武器の複製を足す(addCard)鋳造効果を付ける(forge)2289369242323batchの上限800に対して460同じJSONをもう一度流した2回目は、操作0件
1回目は460操作で、上限800の中に収まった。2回目は0操作だった。
回操作の数
1回目460
2回目(同じJSON)0

2回目は「同じ」と判定された項目が259件あり、足す操作はゼロでした。 画面のボタンを何度押しても、持ち物は増えません。

別の編成がある部隊は飛ばす

部隊は、すでに別の編成が置かれていたら、部隊ごと飛ばす決まりにしています。

1回目のあとで、部隊0の本営だけ別の武将に変えたJSONを流してみました。

設定反映する部隊飛ばす部隊操作
既定0部隊00
置き換えを許す1なし2(place 1、tech 1)

置き換えを許した場合も、変わるのは本営の武将と、その武将の兵種汎用技法だけでした。 戦法と武器は同じなので、操作は増えません。

設計文書と食い違っていた点

設計文書の表には、戦法が121と書いてあります。実データのJSONは122でした。 部隊を書き起こすとき、持ち物に無かった桃園結義を1件足したためです。表の更新が漏れていました。

数値は、文書ではなく実データから数えます。

次に同じことをするなら

関連する記事です。