LAST UPDATE 1998/08/08


『 その8-3 』


 ■ プログラム解説

    For Y = 0 To 7 - 1
      For X = 0 To 7 - 1
      Next X
    Next Y
これは今までも何回か登場した繰り返し命令であるが、今回は2重の構造になっている。こういったのを2重ループと呼ぶ。最初はYが0になって、Xのループが始まりその値が0で始まり6になるまで繰り返される。そして今度はY=1になり、Xが再び0~6まで繰り返される。ということなので、中に入っている処理は7×7=49回繰り返されることになる。
    S = MID(CD(Y), X + 1, 1)
 このサブルーチンの入力引数が1だったとしよう。前半の部分ではCase 1が実行される。そしてY=2だったとすると
    CD(2) = "G388930"
という値が入っている。
  MIDという関数は、文字列の任意の場所から任意の文字数を取り出す命令である。例えば
    S = MID(CD(2), 4, 2)
という命令を実行すると、「G388930」という文字列の3文字目からスタートし、2文字取り出されるので、S="89"という結果になる。
 プログラム内では、Xの値は0~6まで変化し、1文字切り取られることになっているので結果は表のようになる。
Y X S
2 0 G
2 1 3
2 2 8
2 3 8
2 4 9
2 5 3
2 6 0
    If ((Asc(S) >= Asc("0")) _
      And (Asc(S) <= Asc("9"))) Then
       d = CInt(S)
 ここでは、コースの初期データが通常のブロックだった場合にdというInteger型変数にそのまま数値を入れている。
 「Sに入っている値が0~9であれば」という条件式なのだが、問題がある。Sはあくまでも「文字」であるため大きさを比べられないのである。「飛」と「馬」のどっちが大きいかと聞かれても困る。そこでAsc関数なのである。
 コンピュータは機械であるから整然と並んでいるものが好きなのである。ということで、全ての文字にコードというものが割り当てられていて、数字やアルファベットはちゃんと順番通りに並べられているのである。ここで再びVBのヘルプを使う。ヘルプのキーワードにasciiと打ち込んで、「ASCII文字セット」という項目を開いてみてほしい。文字に数値が割り当てられた表が表示される。英語圏ならこれで十分である。
 その昔アメリカでコンピュータというものが発明されたときに作られた文字を表すためのコードで、128種類以内で収まってしまっている。1バイトで全ての文字を表し、当時はこれで十分だったのである。しかし、コンピュータが日本でも使われるようになり、アルファベットだけでは不便なので、未使用であった128~255のところにカタカナを割り当てたり、さらに裏技のように特定の数値で始まるコードは次の1バイトも含むという変則的なSHIFT JISなどというコードが考案され、さらに世界中の文字がちゃんと表せるように最初から2バイトで全ての文字を表すことにしたUNICODEというものまで考案された。
 2バイトであるから65536種類の文字を表現することができる。26種類の文字しか持たない英語圏の人間が考えた仕様であるからして(多分)、彼らは「こんなにあれば、十分」などと思っていたらしいが、実は小説家などに言わせると最低でも5万種類程度の文字は必要とのことで、まだまだ完璧とは言えないと言っているらしいし、中国、台湾などを含めるとぜんぜん足りないそうである。
 話がそれてしまった。ここで使われているAscという関数であるが、文字に割り当てられているASCIIコードを取り出す関数である。「0」のアスキーコードは&H31で、「9」は&H39である。ということで、このifは「取り出した文字が0~9だったら…」という条件式になっている。ここでは2つの条件式をAndという「論理演算子」というものを使って同時に調べている。論理演算はとても大切なので、後で詳しく解説する。
 CIntはConvert into Integerの略?
 ということで、Sに入っていた文字を数値に変換する関数である。Sは文字列型($)として宣言されているので、たとえ数字が入っていてもこれはあくまでも文字なのである。
    正: S="123"
    誤: S=123
 であるし、足し算の場合も
    S="123": S=S+"456" → S="123456"
という結果になる。
 結局ここではdというInteger型の変数にブロックの種類を表す数値を格納しているのである。
    Else
     d = 99
     If (S = "@") Then d = -1
     If (S = "G") Then
      If (Y = 0) Then d = 20
      If (X = 6) Then d = 21
      If (Y = 6) Then d = 22
      If (X = 0) Then d = 23
     End If
    End If
 この部分は取り出したSの中身が0~9以外の時に処理される部分である。ここでSに入っている文字は「@」か「G」である。
 @はコース内の空白部分、Gはゲートを表すということに決めてある。実際にゲーム内で使用されるBlockInfo配列内のデータは@:-1とかG:20~23という数値を与えてある。
 Sの中身がGでその場所が一番上(Y=0)であった場合はGate0を表す20を入れ、場所が一番左(X=0)であった場合はGate3を表す23をセットしたりしている。これでGという文字を20~23のどれかに振り分けてdという変数に格納している。
    BlockInfo(X, Y, 1) = d
 上の条件式で格納された値をBlockInfoという配列にセットしている。



 ■ データの仕様決定について

 このゲームは私が作ったのである。だからして内部でどういうふうにデータを扱おうと私の勝手なのだ。だから自分で最もわかりやすいと思うようにデータ構造を設定してある。
 この内部データの仕様を決めるという部分が職人技で、「こうすれば良い」という定石は存在しない。これはいくつものプログラムを自分で作りながら習得していくしかない。
 「効率的なデータ構造を考えられるか。」という事こそが良いプログラマーとだめなプログラマーの決定的な差になると私は思っている。特定のプログラミング言語に関する知識(例えばC++には詳しいとか)はごく小さな問題であるので、C言語で組んだプログラムよりもC++で組んだほうが良いプログラムになるなどということは絶対にない。数年前はマシンパワーが非力であったため仕方なくアセンブラでプログラミングしていたが、だからといって私が偉いなどということは絶対にないのである。
 プログラミングに大切なことは、データ構造と全体を通してのロジックでなのである。





その8 -1 | その8-2 | その8-3 | その8-4 | その8-5

『 サルのゲーム製作講座 』 目次 | その 1 | その 2 | その 3 | その 4 |
その 5 | その 6 | その 7 | その 8 | その 9 | その 10 | その 11


もどる

e-mail: sc_3da@magical2.egg.or.jp