プログラミング
プログラミング
授業目標
- 講義形式でプログラミング演習をすることは難しいので,プログラムにつきものの「バグ」をベースに話を展開
授業の流れ
- プログラミングとは
- アルゴリズムとの違い
- プログラム言語
- 同じアルゴリズムでも,言語によって記法は様々
- ゲーム開発でよく使われる言語
- C++
- C# (XBox360, PS Vitaなど)
- 携帯ゲーム: Java, Objective-C
- アセンブリ言語(90年代前半以前のゲーム機では主流.それ以降も状況によって使う場合もあったとか.現在は?)
- ・・・とはいえ,好みにかかわらずその時の状況で利用可能な言語を選ぶというのが現状だが.
- どれだけ書くの?
- 2006年時点 で「携帯型ゲーム機で20万行~、 据え置き型ゲーム機では50万行~、 ネットワークPCでは100万行程度..」( http://www.coverity.com/html_ja/library/pdf/sega_casestudy_jp.pdf より引用)
- かつてのゲーム機
- 「プログラミングもできるゲーム機」が多かった(使用言語はほとんどがBASIC派生)
- コンパイル
- コンピュータが動作として処理できるのは,CPUの動作命令
- ソースコードはテキスト
- プログラミングでよくあること
- 文法エラー
- 論理エラー
- バグの例
- ビット列でデータ表現をしているが故に発生する,よくあるゲームのバグをいくつか紹介
- 2の補数表現の数の加算
- バッファオーバーフロー
- 疑似乱数
- ビット列でデータ表現をしているが故に発生する,よくあるゲームのバグをいくつか紹介
使用題材
ぴゅう太 (1982, トミー)
- 画像 (Wikipedia)
- 言語環境: G-BASIC (命令文が日本語)
- 16bit CPU搭載
SC-3000
- 画像 (Wikipedia)
- SG-1000と基盤がほぼ同じ
- キーボードがあるかないかの違い.SG-1000とゲームソフトの互換性あり
MSX (1983- )
- 特定のゲーム機の名称ではなく,規格
- 複数の企業がMSX規格のマシンを発売
- 例:HitBiT (ソニー, 画像 Wikipedia)
- Basic開発環境: Microsoft製
- 複数の企業がMSX規格のマシンを発売
ファミリーベーシック (1983, 任天堂)
- ファミリーコンピュータ用の周辺機器(別売)
- BASICベースの言語
スーパーマリオブラザーズ2 (1986, 任天堂)
- 「無限増殖」の裏技
- 前提
- 地面に着地せずに連続して敵を踏み続けると,8回目から1回踏む毎に残り人数が1人増える(これは仕様)
- カメは一回踏むと甲羅になり,もう一回踏むと前方に蹴り飛ばす.蹴り飛ばして動いてる甲羅を踏むとその場で止まる.
- 壁の目の前でカメ(ノコノコ)を踏みつけ,触れるか触れないかギリギリのラインで踏みつけると,「蹴りとばす」→「壁で跳ね返ってきた甲羅を踏む」動作を一瞬で行い,なおかつ上方にちょっとだけジャンプする
- つまり,うまくいくと地面に着地せずに「蹴る」→「踏む」→「蹴る」→「踏む」→...動作を永久に繰り返し,そのたびに残り人数がドカドカ増えていく
- バグ
- ある一定人数より多く残り人数を増やしてしまうと,1回ミスしただけでゲームオーバーになってしまう
- よく調べてみると,「一定人数」のラインが129にあることがわかる
- ちょうど129人だと,ミスしてもゲーム続行可能(128人になる)
- 130人の状態でミスすると,ゲームオーバー
- 「ミス→残り人数-1→残り人数の判定」を行い,そのとき0人以下と判定されたらゲームオーバー
- なお,130人の状態でミスせずにステージをクリアすると,ゲーム続行.残り人数を表示するタイミングではなく,ミスしたタイミングの時だけゲームオーバーのチェックを行っているらしい.
- 原因
- 残り人数を"8bitの2の補数表現"とすると,つじつまがあう
- 残り人数を増やしすぎて,8bitで表現できる数字の上限を超えてしまった
- 2の補数表現だと,何も気にせずインクリメントし続ける
(上記の理由から,はじめは128が上限と考えたが,再度調べてみたところ,どうも上限は128でなく129.つまり,残り人数は画面上「× 3」となっていても,内部の2の補数表現上は「+2」で管理されている可能性が高い.実際その方が,条件判定がさらに単純化するため辻褄が合う.)
- 前提
- 余談
- 実はこのバグ(?)は,前作で既に存在している
- しかし2でも修正せず
- 修正する(データ的な)余力がなかった
- ゲームオーバーになる以外の実害が特にない.むしろゲーム性としては面白い要素
- なので,システムには手を加えてない可能性が高い
- 下手な修正はかえって別のバグを導入する要因になりがち.上記の影響しかないなら,残しとくのも一つの手(2は,基本システムは1そのままで,ステージ構成とグラフィック入れ替え,キャラクタの追加のみ行っている)
- 3以降は,残り人数の上限が99人で,それ以上は増えない仕様に変更
ドラゴンクエストIV (1990, エニックス)
- 発売日直後の初期出荷版にのみ存在したバグ
- 戦闘画面で,8回「にげる」を選択すると,その後の攻撃は全て「かいしんのいちげき」になる
- 「かいしんのいちげき」:通常より遙かに高いダメージを与えることができる必殺技.通常はプレイヤーが意図的に繰り出すことはできず,低い確率でランダムに発生.
- 「にげる」:戦闘から抜け出す.
- 必ず成功するとは限らない(「まわりこまれてしまった!」)
- 通常の敵に対しては,4回目には必ず逃げられる
- ただし一部,「絶対に逃げられない敵」が存在する
- 「絶対に逃げられない敵」に対し,4回以上「にげる」を選択した場合のことを想定していなかった
- 原因
- データ節約のため,複数のフラグを1バイト中に設定.そのうち下3ビットが「にげる」を選択した回数カウントに使用
- そのすぐ上のビット(下から4ビット目)に,「常にかいしんのいちげきが出る」フラグが置かれていた
- 8回「にげる」と,4ビット目が反転→「常にかいしんのいちげき」フラグがON
- いわゆるバッファオーバーフロー
カルドセプトサーガ
- サイコロバグ
- http://www.youtube.com/watch?v=TGMV8s8TtJY
- 疑似乱数の精度が悪く,片方が奇数(1,3,5),片方が偶数(2,4,6)しか出てこない
- 授業では「コンピュータのいうランダム動作」事を強調
- 一見「ランダムな動き」も,計算式で出している
- その計算式の作りが悪ければ,当然ランダム性は下がる
- http://www.youtube.com/watch?v=TGMV8s8TtJY
その他
バグ関係
- 燃えろ!プロ野球
- 「バントでホームラン」 http://www.youtube.com/embed/ZGXc-dPRaBc (意図的なのかもしれないが)
- 「初めて'『バグ』が発見された実例」 (画像: 閲覧注意)
- 「バグの名前の由来は,実際に虫がコンピュータに入って故障したことから」という風説の元になったと思われる資料.実際の資料に書かれてる文章を見れば,この時点ですでに"バグ"という言葉がコンピュータの不具合を指す言葉として使われていたことがわかる.