第13回 – 配列 1


さて、今回から配列を紹介していきますが、その前に変数をおさらいしておきましょう。
processingにおいて変数は、値を格納しておける箱のようなものでした。
図形の場所や大きさに変数を用いる事によって、その変数の値を変える(別の値を代入する)だけで図形が変化して見える(=アニメーションして見える)、数値に名前をつけて可読性を高める、同じ変数を複数の場所で利用する事で、後から値をまとめて変更出来る、など、様々な利用方法があります。
しかし、この変数をfor loopと組み合わせて使いたくなった時に、少し不具合が生じます。
例えば、for loopを利用して円を100回描いて、しかもそれをそれぞれアニメーションさせたい、という場合どうしたら良いでしょうか?
いきなり100個はちょっと想像するのが難しいので、試しに3個でやってみましょう。

  
int x1;
int y1;
int x2;
int y2;
int x3;
int y3;
  void setup(){
  size(800, 600); 
}

void draw(){
  
  for(int i = 0;i<3;i++){
    
    ellipse(x1, y1, 50, 50);
    ellipse(x2, y2, 50, 50);
    ellipse(x3, y3, 50, 50);
   
    
    x1 = x1 + 1;
    x2 = x2 + 2;
    x3 = x3 + 3;
    
    y1 = y1 + 1;
    y2 = y2 + 2;
    y3 = y3 + 3;
     //.....あれ?
  }
}

困ってしまいました。
これではfor loopを使う意味がありません。
試しにこのコードをご自分のprocessingにコピペして実行してみた後、for loop { }を削除して以下のコードに書き換えてから実行してみてください。

int x1;
int y1;
int x2;
int y2;
int x3;
int y3;

void setup() {
  size(800, 600);
}

void draw() {

  background(0);

  ellipse(x1, y1, 50, 50);
  ellipse(x2, y2, 50, 50);
  ellipse(x3, y3, 50, 50);

  x1 = x1 + 1;
  x2 = x2 + 2;
  x3 = x3 + 3;

  y1 = y1 + 1;
  y2 = y2 + 2;
  y3 = y3 + 3;
}

そうです、玉の数は3つのまま何も変わらず、スピードだけが3倍になっています。

どうしてこんな事が起きたのでしょうか?

…と、説明するまでもなく、ellipseが3つも書いてあるのだから、そりゃfor loopなんかなくても円は3つ描かれます。
つまり、forがあった時には円は9個描かれていたわけです。単に完全に重なってて見えてなかっただけで。
スピードが3倍になっていたのは、 x1 = x1 + 1;の部分が3回実行されていたからでした。(合計3回1が足されて、スピードが3倍になったのですね。)

この事からもわかるように、3種類の変数を使って、円をその変数と同じ数だけ書く、ということは、for loopには出来ないのです。

では、どうすれば良いのでしょうか?

そう。ここで配列です。

配列を使おう!

配列は、1つの変数(名前)に沢山の値を格納できるものです。
少し解りにくいので喩え話をします。

Aという箱があります。箱にはint型の値を1つ格納出来ます。←これが変数
Aという棚があります。この棚には10段仕切りが付いていて、何段目に入れるかを指定する事で、int型の値を10個格納出来ます。←これが配列

配列にいくつ値を格納できるようにするかは、名前をつける時に同時に宣言します。
int型の、xという名前の変数を宣言する方法が

int x = 0;

だったのに対し、int型の値が10個格納できるxという名前の配列を宣言するには

int[] x = new int[10];

のようにします。

普通の変数との違いは型の指定 int の後に []が付くことと、必ず = new int[10] と、new キーワード、改めて型、そして中に入れたい数の指定が必ず必要です。
100個値を入れたいなら int[100]となります。

名前が1つなのに、どうやって沢山の値を扱うの?

配列として宣言された変数は、名前だけで値を出し入れすることは出来ません。
その配列の何番目の値にアクセスしたいか、というのを必ず指定する必要があります。
そして、指定は配列の名前の後に [ ]  を付けて行います。

int[] x = new int[10];

void setup(){

  size(800,600);
  
 // x = 10; ←何番に入れるか指定していないのでエラーになる
  x[0] = 10;//←エラーにならない
  x[1] = 20;//←エラーにならない
  x[10] = 10;//←x[9]までしか存在しないのでエラーになる

}

ちなみに、配列の1番目の値は0から始まります。
少しややこしいので、慣れるまでは一呼吸置いてください。

int[] x = new int[10]
という配列なら、 x[0]〜x[9]までの10個が確保されます。
宣言時は10なので、x[10]もありそうですが存在しません。
そして、存在しないナンバーにアクセスしようとすると、プログラムはエラーを起こして動作を停止します。
必ず、存在しない値を指定していないか確認しましょう。

少し長くなりましたが今回はここまで、次回は実際にfor loopで配列を使ってみましょう。