ぴぴえるによるOW語り

時々OW以外のことも書きます。

ゲームのバグが許せない? コンピューターに洗濯物を畳ませてみよう!

完璧な文章などといったものは存在しない、完璧な絶望が存在しないようにね。と、村上春樹のデビュー作、『風の歌を聴け』の冒頭を引用しましたが、これと同じように、完璧なプログラム、つまりバグの無いプログラムというのは存在しません。

でも、ゲームのバグって、もちろん種類にはよりますけど、基本的には無い方がいいです。当たり前ですね。みんな無くそうと頑張ってはいるんですが、これが中々難しいです。僕がやってる小規模のゲーム開発ですら、正直バグまみれです。もちろん、なくせるような工夫は凝らした上でです。

じゃあ、なんでそんなバグるんだよ!素人はともかく、プロが作ってる筈のゲームでさあ!って話なんですが、これを分かっていただくためには、プログラミングをやれば分かります。という事で、皆さんにはプログラミング体験をしてもらいましょう。

 

……と、言いましたが、流石にゼロからプログラミングをするとなると、それはバグがなぜ起こるかの解説では無く、ただのプログラミング入門です。何かをインストールしたり、何だったりとか、そういう事は避けて解説したいと思います。

今回やるのは、言葉プログラミングです。正式名称が分からなかったので、そう書く事にしますが、日本語を理解してくれる便利なコンピューターアンドロイド、AND君という存在を想像します。AND君に命令を与える事で、プログラムを作ってみましょう。

 

コンピュータは頭が固い。

厳密には少し違うのですが、プログラムとは、コンピューターに対する命令の事です。コンピューターに○○をして!という事の繰り返しで、処理というのは完成します。ここでは、AND君に対して命令をすることで、あなたの代わりに何らかの作業をしてもらいましょう。では、AND君に洗濯物を畳む処理をしてもらいます。あなたはどんな風にAND君に命令しますか?

「洗濯物を畳め?」残念ながらAND君は全く動きません。代わりに彼はこういうでしょう。「"洗濯物"は定義されていません」と。

これどういう事かというと、実はコンピューターは「洗濯物」という単語の意味を理解していません。何故なら教えてもらっていないからです。え、そんなの前提条件じゃないの!? と思うかもしれませんが、コンピューターは基本的に人がこれはこういうものだよと正確に伝えない限り、それを使って何かをする事は出来ません。コンピューターは頭が固いんですね。(とはいえ、これは本当なら利点なのですが……)正確に伝えるためのものを「変数」と言ったりするのですが、ここでは、取り込んだ洗濯物を入れる「箱」を想像してください。AND君に、「洗濯物を入れている箱はこれだよ」と伝える事で、AND君は初めて洗濯物という存在を認識できるのです。

これでばっちりですね。AND君に「洗濯物を入れている箱はこれだよ」と伝えます。そして次に、「洗濯物を畳め!」と命令します。……AND君動いた! そして洗濯物を入れている箱を畳み始めた!

はい。当たり前ですが、洗濯物を畳むとき、皆さんは一枚一枚衣類を取ってから、種類別にそれぞれに合った畳み方をしますよね?コンピューターは頭が固いので、言われてないのに一枚一枚取ったりしません。代わりに、洗濯物を入れている箱を畳もうとします。(実際はその前段階でエラーが起きる)究極の指示待ち人間ですね。これも修正しましょう。※ここからは分量が増えるので、改行形式でやります。

1.洗濯物を入れている箱を伝える。

2.箱から衣類を一つ取り出す。

3.取った衣類を畳む。

4.2番に戻る。

 

よし、これでいいですかね? では命令! AND君動いた! 箱からTシャツを取り出して畳んだ! そしてそれを捨ててしまった!
……はい。AND君は、畳んだものをどこに仕舞うか命令されていません。AND君の手元には畳んだTシャツがあるのですが、次の命令を実行する際に不必要なので捨ててしまいます。タンスかなんかに仕舞わないとだめですね。これも修正します。

 

1.洗濯物を入れている箱を伝える。

2.タンスの場所を伝える。

3.箱から衣類を一つ取り出す。

4.取った衣類を畳む。

5.畳んだ衣類をタンスへしまう。

6.3番に戻る。

 

そろそろ分かって来たかと思うんですが、これでもまだ駄目です。何処がダメか皆さん考えてみましょう。

そろそろいいですかね? では命令! AND君動いた! 洗濯物を順調に畳んで行く! おっと、しかし途中で止まってしまった! AND君はこう言っている! 「箱の中がnullです」

はい。コンピューターは、箱の中身の状態に関わらず、処理を実行しようとします。つまり、箱の中身がからっぽであっても、衣類を取り出そうとします。そして衣類が無いよ! と言ってくるんですね。現実にいたらなんだこいつってなりますよね。では、箱の中身が無くなったら処理を終了するようにしましょう。

 

1.洗濯物を入れている箱を伝える。

2.タンスの場所を伝える。

3.箱の中身が無いなら処理を終了する。

4.箱から衣類を一つ取り出す。

5.取った衣類を畳む。

6.畳んだ衣類をタンスへしまう。

7.3番に戻る。

 

これでようやく、洗濯物を畳ませる事が出来ます。いやー長かったですね。どうですか? プログラミングがいかに面倒臭いか、分かっていただけましたか? 洗濯物を畳ませるだけでこれですからね。料理とかさせようとすると一体どうなるのやら想像もつかないですよね。しかもこれ、厳密に言うと正しくないです。元々AND君に畳む処理が備わっていたらいいですが、備わっていない場合明確に定義しないといけないですし、一つ一つ衣類をしまうよりも、一度適当な所に置いてから一気に仕舞った方が効率的ですし、実際のプログラミングなら"衣類"を一時的に保存しておく変数が必要だしetc…。あーなんて面倒なんでしょう。こんな面倒な事を、プログラマーの方々はしている訳です。上記のコードの場合だと7行な訳ですが、実際は数万行とか行きます。小規模な開発でも数千行は必要です。数万行の文章を、全くの誤字無しで書くことが不可能なように、数万行のソースコードを、バグ無しで書くのは不可能なんですね。

 

今後、有名なバグを事前知識なしで理解できるような記事を書いていけたらと思います。面白かったらなんかリアクション下さいませ。