第7講 テトリス開発(4つのブロックを描くまで)
第3話 3次元配列と3次元ループの事例
x[0][0][0]= 1 x[0][0][1]= 2 x[0][0][2]= 3
x[0][1][0]= 4 x[0][1][1]= 5 x[0][1][2]= 6
x[0][2][0]= 7 x[0][2][1]= 8 x[0][2][2]= 9

x[1][0][0]=10 x[1][0][1]=11 x[1][0][2]=12
x[1][1][0]=13 x[1][1][1]=14 x[1][1][2]=15
x[1][2][0]=16 x[1][2][1]=17 x[1][2][2]=18

x[2][0][0]=19 x[2][0][1]=20 x[2][0][2]=21
x[2][1][0]=22 x[2][1][1]=23 x[2][1][2]=24
x[2][2][0]=25 x[2][2][1]=26 x[2][2][2]=27

x[3][0][0]=28 x[3][0][1]=29 x[3][0][2]=30
x[3][1][0]=31 x[3][1][1]=32 x[3][1][2]=33
x[3][2][0]=34 x[3][2][1]=35 x[3][2][2]=36

を実現するプログラム例
#include<stdio.h>
int x[4][3][3]; //3次元配列
void f(); //データ作成社員
void g(); //データ表示社員
int main(){
  f(); //社員f()に仕事を命じる
  g(); //社員g()に仕事を命じる
  return(0);
}
void f(){
  int i,j,k;
  for(i=0;i<4;i++){
    for(j=0;j<3;j++){
      for(k=0;k<3;k++){
        x[i][j][k]=9*i+3*j+k+1;
      }
    }
  }
}
void g(){
  int i,j,k;
  for(i=0;i<4;i++){
    for(j=0;j<3;j++){
      for(k=0;k<3;k++){
        if(x[i][j][k]<10){
          printf("x[%d][%d][%d]= %d ",i,j,k,x[i][j][k]);
        }
        else{
          printf("x[%d][%d][%d]=%d ",i,j,k,x[i][j][k]);
        }
      }
      printf("\n");
    }
    printf("\n");
  }
}
コピペ用添付ファイル

初心者の方にとって、3次元配列および3次元ループは頭が爆発しそうになるほど、
むずかしく感じていると思います。
ですが、これから開発するテトリスとでは、
3次元配列および3次元ループを使います。
もちろん、あくまで1つの開発手法にすぎませんので、
使わないで開発することもできます。
ですが、将来3Dゲームに挑戦したいと思っている方は、
3次元配列および3次元ループの理解は必須条件だと思います。

尚、
x[0][0][0]= 1 x[0][0][1]= 2 x[0][0][2]= 3
x[0][1][0]= 4 x[0][1][1]= 5 x[0][1][2]= 6
x[0][2][0]= 7 x[0][2][1]= 8 x[0][2][2]= 9

x[1][0][0]=10 x[1][0][1]=11 x[1][0][2]=12
x[1][1][0]=13 x[1][1][1]=14 x[1][1][2]=15
x[1][2][0]=16 x[1][2][1]=17 x[1][2][2]=18

x[2][0][0]=19 x[2][0][1]=20 x[2][0][2]=21
x[2][1][0]=22 x[2][1][1]=23 x[2][1][2]=24
x[2][2][0]=25 x[2][2][1]=26 x[2][2][2]=27

x[3][0][0]=28 x[3][0][1]=29 x[3][0][2]=30
x[3][1][0]=31 x[3][1][1]=32 x[3][1][2]=33
x[3][2][0]=34 x[3][2][1]=35 x[3][2][2]=36

の実現は、
#include<stdio.h>
void f(int x[4][3][3]); //データ作成社員
int main(){
  int x[4][3][3]={
  1,2,3,
  4,5,6,
  7,8,9,

  10,11,12,
  13,14,15,
  16,17,18,

  19,20,21,
  22,23,24,
  25,26,27,

  28,29,30,
  31,32,33,
  34,35,36
  }; //3次元配列と初期化
  f(x); //社員f()に仕事を命じる
  return(0);
}
void f(int x[4][3][3]){
  int i,j,k;
  for(i=0;i<4;i++){
    for(j=0;j<3;j++){
      for(k=0;k<3;k++){
        if(x[i][j][k]<10){
          printf("x[%d][%d][%d]= %d ",i,j,k,x[i][j][k]);
        }
        else{
          printf("x[%d][%d][%d]=%d ",i,j,k,x[i][j][k]);
        }
      }
      printf("\n");
    }
    printf("\n");
  }
}
コピペ用添付ファイル
としても実現できます。
ここで2つ説明しなければならないことがあります。
1つは、配列も宣言と同時に代入=初期化できるということと、
配列を引数にできるということです。
宣言と同時に初期化するには、
  int x[4][3][3]={
  1,2,3,
  4,5,6,
  7,8,9,

  10,11,12,
  13,14,15,
  16,17,18,

  19,20,21,
  22,23,24,
  25,26,27,

  28,29,30,
  31,32,33,
  34,35,36
  }; //3次元配列と初期化
のようにします。
4×3×3=36ですから、36個のデータをこのように打ち込む必要があります。

ところで、
配列は、箱の集合にすぎません。
箱そのものは渡せないのですから、配列も渡せないはずですよね。
変数そのものを渡せなくても、
変数の中身だけを変更してもらう不思議な方法があるということを何度か説明してきました。
そもそも、
  int x=3,y;
  y = f(x);
となっていても、箱xそのものを渡しているのではなく、
箱の中身の3を渡しているのでしたね。
これを参照渡しといいます。
要するに箱の中身をコピーして渡しているのです。
コピーというのは、中身そのものを渡したら箱の中が空っぽになってしまうからです。
ですから、参照渡しというのは箱の中身はいじらずに、中身をコピーして渡すことです。
配列を引数にしている
  f(x); //社員f()に仕事を命じる
今回も、実は箱の集合そのものを渡しているわけではありません。
今回も参照渡しです。
では、何を渡しているのでしょうか。
それは、箱集合の住所です。
変数は箱であると説明してきましたが、
実は、コンピュータの記憶装置であるメモリの一定の領域を、
変数の記録場所に当てているのです。
場所ですから、当然住所があります。
メモリ番地です。
そして、ローカル変数が社員専用の箱である理由は、
その住所=メモリ番地をその社員しか知らないからです。
箱のありかは、秘密になっていて他の社員は普通はいじれないのですが、
その秘密のありか=住所を他の社員に教えることによって、
箱の中身を変えることを依頼できるのです。
こんな説明をされると謎がますます深まりますね。
ポインタの講まで忍耐強くお待ち下さい。
ポインタの存在は、C言語の最大の魅力です。


さて、いよいよテトリス開発の基本的考え方を解説することにしましょう。

第2話へ  第4話へ

002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ