ポケッチの電卓でバグ!?
この記事を書いた1週間前の2021年11月19日に、『ポケットモンスター ブリリアントダイヤモンド・シャイニングパール』(ポケモンBDSP)が発売されました!このゲームは特にバグが多い作品として盛り上がっていて、連日様々なバグ発見のツイートを見てきました。
そんな中、以下のツイートを見つけました。
ゲーム内に登場するスマートウォッチのようなアイテム「ポケッチ」の電卓アプリで計算をしている様子の動画ですが、
なんと9+10=21となっています。
※これが本当にバグなのか、動画を編集したフェイクなのかは分かりません。
電卓を作るのはそこまで難しいイメージはなく、バグが出るのはかなり意外だったので、電卓の作り方に興味が湧いてきました。
私は今までカウンターやタイマー等のWebアプリを作ってきましたが、電卓を作ったことがなかったので一度作ってみようと思いました。
自分で電卓を作ってみた
今回はポケッチの電卓と同じような動作をする簡単なWebアプリを作ってみました。
小数点の入力と四則演算ができます。(「*」と「/」はそれぞれ「×」と「÷」として扱います)
使用技術はNext.js(React) + TypeScriptです。
↓こちらからアクセスできます
↓ソースコードはこちらです
ゲーム内のポケッチの電卓では、数値は10桁1までしか表示できないため、計算結果が99億9999万9999を超える場合は、「??????????」と表示されます。
私の電卓でもこれを再現するために、10桁を超える数値を表示しようとすると、代わりに「??????????」と表示されるようにしています。
<input
type="text"
defaultValue={
String(outputValue).length > MAX_DIGIT ? "??????????" : outputValue
}
size={10}
style={{ textAlign: "right" }}
></input>
他人の電卓のコードを参考にせずに自分で考えながら作ったので、制作に2時間くらいかかりました。
新たなバグの判明
自分で電卓を作った翌日に、以下の記事を見つけました。
記事によると、ポケモンBDSPをドイツ語またはフランス語でプレイしている際に、ポケッチの電卓の挙動がおかしくなるそうです。
その例として、510÷252の計算結果が「??????????」になるというものがあります。
まさかとは思い、自分の電卓でも510÷252を試してみると...
「??????????」が表示されてしまいました😨
510÷252の正確な答えは「2.0238095238095...」で、割り切れない循環小数になります。
したがって、1÷3=0.3333...も同様に「??????????」と表示されてしまいます。
本来「??????????」が表示されるパターンとしては、計算結果が大きすぎる数(100億以上)、あるいは小さすぎる(負が大きい)数(-10億以下)になった場合が想定されていたと思います。
しかし、ポケモンBDSPのドイツ語・フランス語のポケッチの電卓と私の電卓では、計算結果が大きすぎたり小さすぎたりしなくても、小数点以下を含めた桁数が多いと「??????????」と表示されてしまっています。
ちなみにポケモンBDSPにはリメイク前の作品『ポケットモンスター ダイヤモンド・パール』がありますが、そちらの日本語版のポケッチの電卓では510÷252の計算結果が「2.02380952」と表示されていて、10桁になるように小数第九位の「3」以下が切り捨てられていることが分かります。
よって、この不具合の対策としては、計算結果が小数の場合に、10桁で表示できるように小数を切り捨てる処理を入れるべきでした。
また、上記のAUTOMATONの記事によると、ドイツ語とフランス語では小数点表記にピリオド(.)ではなくカンマ(,)が使われることが原因ではないかと考察した人がいるそうです。
これらを踏まえてポケモンBDSPの電卓のバグの原因を詳細に考察すると、
「計算結果が小数の場合は10桁以下になるように切り捨てられるはずだが、計算結果が小数かどうかはピリオド(.)の有無で判定しているため、小数点がカンマ(,)であるドイツ語やフランス語では小数切り捨ての処理が行われない」
と考えられます。
-
正確には10桁ではなく10文字。マイナス記号や小数点も1文字としてカウントされる。 ↩