「いる」に挟まれた「いない」

ないものがある、というのは、すごく難しい概念なのですが、日常生活においては頻繁にでくわします。たとえば、出席。出席していない生徒は、欠席というものを持ちます。「いない」という状態を表すために作られました。「いる」「いない」をファイルやデータとして扱うには、0と1の2進数をよく使います。そう考えると、「0がある」くらいだったら、なんとか理解できると思います。

今日もせっせとプログラミングを進めていたところ、中学生のころ、ドラクエのようなゲームを作ろうと思っていたことを思い出しました。というのも、いわゆる「4人チーム」の概念を理解するのにすごく悩んでいた時期があり、今、ちょうどそのときと同じ壁にぶちあたってしまったからです。


例えば、みなさん「最大4人チームのゲームで、3人以下のパーティで行動する」という経験はありませんか?FFやドラクエをやったことがあれば、きっと分かりやすいと思います。ポケモンも6匹以下と考えれば、同じようなものですね。そしてみなさんの見たその光景のなかに、「1人目、2人目、4人目がいて、3人目がいない」という状況が、果たしてあったでしょうか。実は、ないのです

私はむかし、とても不思議に思っていました。4人パーティを組んでいて、そのなかの3人目をあずけて違うキャラクターを入れようと思った時、どうしても4人目の人が3番目にずれてしまうんです。

プログラムの構造を考えたとき、「ずらす」というのは、とても難しいと思っていました。たとえば、そのキャラクターにHPとMPがあるとしたら、HPとMPもいっしょにずらさなければいけません。ポケモンならステータスに加えて「せいかく」「努力値」「いつ生まれたか」など、いろんな情報がセットになっていますし、最近のゲームであれば、個体データというのは100ステータス以上もあったりします。それを全部移すなんてめんどうでしょう。3人目の席をあけておけば、楽じゃないのか?と。ドラクエなら、ちょっと歩行グラフィックがおかしくなるだけで、まあいいんじゃないかなと思っていました。

そこで僕は、当時「空白を途中に含むチーム」を扱ってゲームを作ろうと思いました。実際に作って、そして気が付きました。間の"空白"を操るのは容易ではないと。


決定的な差を見せつけたのが、「戦闘シーン」です。わたしは、こういうメンバーを考えました。

team1 = 2,1,-1,0

name = "名前1","名前2","名前3",......

「-1」の人には名前がなく、これを空白だと思って扱っていたわけです。いるかどうかを判定するのは「0以下かどうか」を判定するだけでとっても簡単。しかし、行動をチームごとに割り当てる際に、とてつもなくむずかしくなりました。


たとえば、上のチームでいうと、2→1→0の順に行動を決定したいわけです。ドラクエなんかでも、行動は最初に手前から順に決めますよね。-1をどうするかが、肝です。

1の人を決定したあと、-1の人の番ですが、空白です。そこで、「じゃあとりあえず勝手に決定した、ということで、一つ飛ばして、0番さんの順番ね」、と、こうしてみました。しかしこの後、「キャンセル」という罠が待ち構えていました。

そう、ドラクエではキャンセルボタンを押すと、ひとつ前の人の行動選択に移ることができます。

しかし、0番さんの行動を決めているときに、じゃあ一つ戻ろう!と思ってひとつ戻ると、そこは空白です。プログラムは正直なのでさっき教えた通り、「じゃあとりあえず勝手に決定した、ということで、一つ飛ばして、0番さんの順番ね」と、0番さんに順番が戻ってきてしまいました。そう、空白を扱う場合、「空白を跨いで次の順番の人を探す」というのが、双方向にできないのです


「じゃあ戻るときに、前に選択した人がみつかるまで一気に戻ればいいじゃん!」という人がいたとすれば、それは大きな間違いです。もしチームがこんなチームだったら・・・

team1 = -1,2,1,0


最初に決めるのは2番さんですが、2番さんは先頭ではないので、キャンセルボタンで戻れます。

もちろん、2番さんに帰ってくればいいのですが、「2番さんの前は-1か・・・じゃあそのひとつまえは・・・分からない!」と、プログラムはエラーを吐いてしまいます。どれもこれも、空白を間に挟んでいるからこその難題なのです。


中学生時代、これらの難点を克服すべく様々にプログラムを書き上げた結果、なんとか空白を扱うチームを完成させました。しかし、当時私がケチをつけていた「空白をずらす」という処理がどれだけ簡単で的確な方法であったか、というのがあの時、身に染みてよく分かりました。ファミコン時代からこのような「面倒なひと手間が近道であった」ということを知っていた当時のプログラマーたちには、あのとき初めて、「偉大だ」と思ったのですが、今になってそのことを思い出すと、彼らの偉大さはそんなものにはとどまりません。これもきっと、プログラマーとしていろいろ知識が集まって、初めてプログラマーの偉大さが分かったんじゃないかと思っています。


"何か"をやればやるほど、その"何か"ができる人の偉大さが分かるものです。

僕はそう思います。

0コメント

  • 1000 / 1000