メルマガバックナンバー 第14回
こんにちは、プログラミング書籍の館の江畑です。
前回から少し間が空いてしまいました。
MacBookの電源が入らなくなり、しばらく修理に出してまして…
思っきりテンション下がってたのが理由です。
はるか昔にAppleのサポートは切れていたので、スマホドック24名駅店さんに持ち込みました。
その結果
「調査中に動くようになったので、修理代はゼロで良いです」
との事でした。
結局原因は分からずでしたが、とにかく直って良かったです。
スマホドック24さんの良心的な対応に感謝です。
さて今回のテーマはドラクエ4とコンピュータサイエンスです。
もくじ
ドラクエ4で学ぶコンピュータサイエンス
コイン増殖の裏技?
今回のテーマはゲームのバグです。
バグの原因をコンピュータサイエンス的な視点で見てみましょう。
よくプログラマーはバグを「裏技」と呼んで、修正せず発売しようとします。
今回のバグも、僕は裏技だと思ってました。
さてそのバグとは、有名な?ドラクエ4のコイン増殖です。
ドラクエ4ではカジノがあり、初めに「コイン」を買ってポーカーやスロットで賭けれます。
そしてコインが増えると、交換所で景品(はぐメタの盾とか)をゲットできます。
で、そのコインは1枚20ゴールドするのですが…
なぜか枚数を838861枚にすると、わずか4ゴールドで買える裏技があります。
当時の子供達(僕含む)はこれを知ってヒャッハーしました。
※リメイク版では修正済みです
かんたんな解説
さてこの裏技、実はバグです。
1枚20ゴールドのコインを838861枚買うと、必要なゴールドは…
20×838861 = 1677万7220ゴールド
になります。
ところがドラクエ4では、ゴールドの最大値は1677万7215になってます。
つまり、上限を超えた金額を表示しようとしてる訳です。
ゴールド最大値:1677万7215
必要なゴールド:1677万7220 ←5多い!
その結果、数字がループして一旦ゼロへ戻ってしまい、すごく安い金額になったのです。
この時、支払う金額は以下のような関係になります。
1多い:0ゴールド ←無料
2多い:1ゴールド
3多い:2ゴールド
4多い:3ゴールド
5多い:4ゴールド ←今回はこれ
6多い:5ゴールド
(以下略)
本来なら、1だけ多い1677万7216ゴールドにして、無料でゲットしたい所ですが…
コインの金額(20ゴールド)で割り切れないため、一番安いのは4ゴールドになってます。
コンピューター的な解説
多分ここからが本題です。
この話をもっとコンピューターサイエンス的に見てみましょう。
前述のように、ドラクエ4のゴールド最大値は1677万7215でした。
これは2進数で表すと次のようになります。
111111111111111111111111
ゲシュタルト崩壊しそうですね…コレ1が24個ならんでます。
つまり24ケタの2進数です。これを24ビットと言います。
言い換えると、ドラクエ4のゴールドは24ビットの整数って事です。
現在ほとんどの環境(CやJava)で整数型(int)は32ビットですから、かなり小さいですね。
さて、この1677万7215に1を足すとこうなります。
(==ゴールドの最大値を超える 1677万7216)
1000000000000000000000000
なんだかキリの良い数字になりました。足す前と比べてみましょう
111111111111111111111111 前
1000000000000000000000000 後
1ケタ増えて25ケタ、つまり25ビットになっています。
しかし困ったことに、ゴールドの変数は24ビットしか認識しません…
よって増えた25ケタ目の1は無視されます。
その結果ゴールドは↓のようになり、0に戻ってしまいました。
000000000000000000000000
これがコイン増殖バグの仕組みです。
さて、最初に戻ります。
1枚20ゴールドのコインを838861枚買うと、必要なゴールドは
1677万7220でした。
1677万7220を2進数にするとこうなります。
1000000000000000000000100
さっきと同じように25ケタ目は無視されるので、ゲーム内では
000000000000000000000100
と認識されます。3ケタ目だけが1ですね。
これは10進数で4になるので、コインが4ゴールドで買えてしまう訳です。
本当は怖いコイン増殖
中の仕組みはともかく、当時の僕はこのバグを裏技だと歓喜し使いまくりました。
でもですね。このバグ、一歩間違うと危険なんですよ。
なぜなら25ケタ目は別の変数の領域だからです。
プログラムはゴールド以外にも色んな値を記憶してます。
敵味方のステータス、進行フラグ、町やダンジョンの場所などなど
ところがこのバグを使うと、ゴールドの隣に記憶してあった値を意図せず変更してしまうのです。
・もしも隣の変数が全滅フラグで、1ならゲームオーバーになるプログラムだったら…
・現段階で1にすると進行不能になるフラグだったら…
・不用意に変更したせいで影響が連鎖的に広がり、ゲームがフリーズしたら…
ええ、怖いですね。ちびりますね。
こういうのをメモリ破壊バグと言います。
8逃げ会心
ドラクエ4には、もう一つ有名な裏技があります。それは
8回逃げた後に攻撃すると必ず会心の一撃が出る
というトンデモナイ技です。よく「8逃げ会心」と言います。
※初期ロットのみ可能
実はこれもメモリ破壊バグです。
ドラクエ4では、逃げた回数を2進数2ケタ(2ビット)の変数に入れてます。
ところが、8という数字は2進数では
1000
のように「4ケタ」になってしまいます。
あふれ出た4ケタ目の1は、やはり別の変数を書き換えるのですが…
これが偶然にも、パルプンテ(何が起こるか分からない魔法)の会心発生フラグだった為、会心の一撃がバシバシ出るようになったのです。
(なお3ケタ目は時の砂に関するフラグらしい)
このバグもメモリを破壊してますが、たまたまプレイヤーが喜ぶ現象だったので「裏技」として広まったケースです。
【今日の格言】
バグと裏技、紙一重
さて、今回はドラクエ4のバグをコンピュータサイエンス的に見てみました。
無味乾燥で退屈な2進数も、こうやってゲームを例にすると少し鮮やかに見えて来ませんか?
色んなゲームバグの仕組みを知ると、ゲーム画面とリンクしてコンピューターの動きが分かります。
こんなコンピュータサイエンスの学習も面白いと思います。
僕も講義をする際はいつも楽しげな具体例を話すようにしてますぜヒャッハー。
メルマガでも色々なゲームバグを紹介したいと考えてます。コンゴトモヨロシク。
Twitterハイライト
今月はこんなこと呟きました。
1989年の美少年ゲームキャラコンテスト
お姉さま方の妄想が炸裂中
1989年の美少年ゲームキャラコンテスト
今回はお姉さま方の乙女ちっくなコメントが光ります
1位の名もなき少年は、得票数で美少女1位のカイをも上回る大人気
あと脇役のミンウが8位なのは組織票か?
美少女編はこちらhttps://t.co/Kj0FQb7N12#レトロゲーム #ファミコンhttps://t.co/167qok0Pvp pic.twitter.com/sbPuWNUA4C— K-Eba@プログラミング書籍の館 (@EndymionProgram) 2018年12月5日
これがザクに見えたら貴方は疲れてます
これがザクに見えた。。。きっと疲れてるんだろうhttps://t.co/JxwdKCYw50 pic.twitter.com/T4YHuv9TcJ
— K-Eba@プログラミング書籍の館 (@EndymionProgram) 2018年11月24日
プログラミングを学ぶ気が1ビットもない少女
任天堂 ファミリーベーシック大百科 より
この漫画の主人公かずよちゃん、プログラミングを覚える気が1ビットも無くて草※こんなサイトに載せてない変な技術書はTwitterで紹介する事にしました
サイト=意識高い Twitter=わーいたーのしー 路線で行きますhttps://t.co/oYlJ41ktAB pic.twitter.com/IA6NryOAY6— K-Eba@プログラミング書籍の館 (@EndymionProgram) 2018年12月18日
僕の自慢できる白歴史ドヤァァァ
ファイナルファンタジーつながりでもう一つ
むかし某イベントのパンフレットで、植松伸夫さんの隣に僕の名前が書かれて嬉しかった(五十音順だから当然ですが)#レトロゲーム #FFhttps://t.co/JxwdKCYw50 pic.twitter.com/3wpRYje4wF— K-Eba@プログラミング書籍の館 (@EndymionProgram) 2018年11月27日
ひどい話クイズの答え
さて、前回出題した「ひどい話クイズ」の答えです。
こんな問題でした。
次のうち、僕が実際にやった事の「ない」ものはどれでしょうか?
(つまり3つは本当です)
A:同僚が椅子を投げて喧嘩を始めたけど、面倒なので止めもせず昼飯へ行った
B:バグを解明しても報告せず、究明してるふりして2ch見てた
C:デスマーチがダルくて、勤務中に酒を飲んでいた
D:前向きなメールに縦読みで本音を仕込んでた(例:たぶんむり)
正解はCでした。
デスマでSAN値削れてステ異常な時に酒なんか飲んだらリバース確定ですからね…
今回は13人の方に応募いただき、正解者は6名でしたパチパチ。
うち3名の方には、Amazonギフト券をメールで送信しました。
これで家でも買うといい。
ちなみに解答の内訳は A:2 B:2 C:6 D:3 でした。
み、見抜かれてる。。。だと
クイズあのゲームの文字??
では今回のクイズです。超シンプルに行きます。
—————————
次の○に入る文字は何でしょうか?
か → こ → く → ぜ → ○ → け
ヒント
・ある有名ゲームに関する問題です
・プログラミングを知らなくても解けます。
—————————
応募は本メールに返信すればOKです。
正解した方の中から抽選で3名様に、Amazonギフト券コード(500円)を送信致します。
締切は次号の配信まで。ご応募お待ちしてます!
今回はここまでです。読んでいただきありがとうございました。
プログラミング書籍の館 江畑