前に考えた次の絵をそのまま下に動かすことを考えてみる
以下のプログラムをコピーして、とにかく実行してみよう。
int[][] s=new int[25][25]; int[][] s2=new int[25][25]; int[] x = {8,9,10,11,12,13,14,15,15,15,15,15,14,13,12,11}; int[] y = {8,9,10,11,12,13,14,15,14,13,12,11,15,15,15,15}; int edge,n; void setup(){ size(126,126); frameRate(20); edge=5; n=16; for(int i=0; i<25; ++i){ for(int j=0;j<25;++j){ s[i][j] = 0; }} for(int i=0; i<n; ++i){ s[x[i]][y[i]] = 1; } } void draw(){ for(int i=0; i<25; ++i){ s2[i][0] = s[i][24]; for(int j=1;j<25;++j){ s2[i][j] = s[i][j-1]; }} for(int i=0; i<25; ++i){ for(int j=0;j<25;++j){ s[i][j] = s2[i][j]; }} stroke(0); fill(255); for(int i=0; i<25; ++i){ for(int j=0;j<25;++j){ if(s[i][j] == 0){ fill(255);} else{ fill(0,0,255);} rect(i*edge,j*edge,edge,edge); }} }
setup()
の中身までは、前のプログラムとほとんど同じ。draw()
の後半(stroke()
以降)も前のプログラムとほとんど同じで、配列s
の中身を入れる部分と配列s
に応じて白か青のマスを書く部分とにわけただけなので、わかると思う。
違いは、まずs
と同じ大きさのs2
という配列を作ったことと、以下の部分とにある
for(int i=0; i<25; ++i){ s2[i][0] = s[i][24]; for(int j=1;j<25;++j){ s2[i][j] = s[i][j-1]; }} for(int i=0; i<25; ++i){ for(int j=0;j<25;++j){ s[i][j] = s2[i][j]; }}
この前半
for(int i=0; i<25; ++i){ s2[i][0] = s[i][24]; for(int j=1;j<25;++j){ s2[i][j] = s[i][j-1]; }}
では、各列について、まず24行目の中身すべてをそのままs2の0行目にコピーする。次にsの1行目をs2の2行目、sの2行目をs2の3行目という具合に、sの中身を1行ずつずらしながらs2にコピーする。これが終わると、s2の中身はsをそっくり1行分下にずらしたものになっている。次に
for(int i=0; i<25; ++i){ for(int j=0;j<25;++j){ s[i][j] = s2[i][j]; }}
で、s2の中身をそのままsに再コピーすると、sの中身は元のsをそのまま1行分下にずらしたものになっている。ちなみに、一番下の行は一番上に移っている。
これによって、drawが実行されるたびに、全体が一行ずれることになる。
このプログラムでは、絵はどんなパターンでもかまわない。パターンは最初にxとyに入れてあるので、ここを書き換えるだけで、どんなパターンでも同様に動かせる。
電光掲示板っぽく、細長い画面で適当な言葉や絵が横に動いていくように、書きかえよ。