このページの本文へ

Illustrator×JavaScriptで百ます計算を自動生成 (4/4)

2009年08月31日 15時00分更新

文●古籏一浩

  • この記事をはてなブックマークに追加
本文印刷

百ます計算表を完成させる

 前編/後編に渡って長い説明となりましたが、これで百ます計算表を表示する準備ができました。最後に、百ます計算の問題を生成して仕上げましょう。

 縦と横の数値を入れる配列と、加算した結果を入れる配列を用意します。縦と横の数値を入れる配列にはそれぞれ0〜9までの数値を入れた後、数値をシャッフルします。シャッフルは、0〜9までの乱数を2つ発生させ、その値を配列番号として指定し、2つの配列内容を入れ替えます。これを数回繰り返せば配列内容がシャッフルされます。なお、単純にMath.floor(Math.random() * 10) とすると精度的な問題で最初の行と列が数値の0になってしまうことがあるため、サンプル06では Math.floor((Math.random() * 100)/10)としています。

 問題の答えは加算するだけなので以下のようになります。


for (j=0; j<10; j++) for (i=0; i<10; i++) matrix[j][i] = wNum[i] + hNum[j];


 足し算ではなく、かけ算にしたい場合は以下のようにします。


for (j=0; j<10; j++) for (i=0; i<10; i++) matrix[j][i] = wNum[i] * hNum[j];


 引き算なら以下のようにします。解答はマイナス値になることもあります。


for (j=0; j<10; j++) for (i=0; i<10; i++) matrix[j][i] = wNum[i] - hNum[j];


 これで各配列に値が入ったので、あとは配列内容を読み出して四角形と数値を描いていきます。百ます計算表は、答えが表示されている解答シートと、答えが表示されていない問題シートの2種類を作成するため、output関数を作成し、渡された引数に応じて回答の表示・非表示を決めています。また、表を出力する位置もoutput関数の引数で指定できるようにしました。サンプル06では、output(70, 740, true)として、横70ピクセル、下から(原点から)740ピクセルの位置を起点にして表を描いています。値を変更すれば好みの位置に表を作成できます。

 これで、百ます計算表を作成するスクリプトが完成しました。

fig4-1.png

百ます計算表が完成



●サンプル06のソースコード


wNum = new Array();   // 横の数字
hNum = new Array();   // 縦の数字
matrix = new Array(); // かけ算の結果を入れる配列
masuSize = 50;  // マス目のサイズ (50pt)
for (j=0; j<10; j++) {
    matrix[j] = new Array();
    wNum[j] = j;
    hNum[j] = j;
}
// シャッフルする(15回)
for (i=0; i<15; i++){
    var point1 = Math.floor((Math.random() * 100)/10);
    var point2 = Math.floor((Math.random() * 100)/10);
    var temp = wNum[point1];
    wNum[point1] = wNum[point2];
    wNum[point2] = temp;
    point1 = Math.floor((Math.random() * 100)/10);
    point2 = Math.floor((Math.random() * 100)/10);
    temp = hNum[point1];
    hNum[point1] = hNum[point2];
    hNum[point2] = temp;
}
// for (j=0; j<10; j++) for (i=0; i<10; i++) matrix[j][i] = wNum[i] * hNum[j];  // かけ算の場合
for (j=0; j<10; j++) for (i=0; i<10; i++) matrix[j][i] = wNum[i] + hNum[j];   // 足し算の場合
// 新規ドキュメントを作成してマス目や答えを生成
function output(baseX, baseY, flag){
    // A4縦のドキュメントを作成
    var doc = app.documents.add(DocumentColorSpace.RGB, 595.28, 841.89);
    for (var j=0; j<10; j++){
        if (j==0){  // 最初の一行の処理
            for (k=0; k<10; k++) {
                drawBox(baseX + k*masuSize, baseY - j*masuSize, masuSize, masuSize, setRGBColor(255, 240, 160));
                drawText(baseX + k*masuSize+24, baseY - j*masuSize-40, wNum[k], 36);
            }
            baseY = baseY - masuSize;
        }
        for (var i=0; i<10; i++){
            if (i==0){  // 左端のマス目の処理
                drawBox(baseX-masuSize, baseY - j*masuSize, masuSize, masuSize, setRGBColor(255, 240, 160));
                drawText(baseX-masuSize+24, baseY - j*masuSize-40, hNum[j], 36);
            }
            drawBox(baseX + i*masuSize, baseY - j*masuSize, masuSize, masuSize, setRGBColor(255, 255, 255));
            if (flag){  // flagがtrueなら答えも出力する
                drawText(baseX + i*masuSize+24, baseY - j*masuSize-35, matrix[j][i], 24);
            }
        }
    }
}
// RGBカラー設定
function setRGBColor(r,g,b){
    var tmpColor = new RGBColor();
    tmpColor.red = r;
    tmpColor.green = g;
    tmpColor.blue = b;
    return tmpColor;
}
// 任意の色の四角形を描く
function drawBox(x,y,w,h, bgColor){
    var layerObj = app.activeDocument.activeLayer;
    pObj = layerObj.pathItems.rectangle(y, x, w, h);
    pObj.filled = true; // 塗りあり
    pObj.stroked = true; // 線あり
    pObj.strokeWidth = 1; // 線幅1ポイント
    pObj.fillColor = bgColor; // 塗りの色を指定
    pObj.strokeColor = setRGBColor(0,0,0); // 線の色を指定(黒色)
}
// 任意の座標に文字を表示する
function drawText(x,y, text, textSize){
    var textFrameObj = activeDocument.textFrames.add();
    textFrameObj.contents = text;
    textFrameObj.paragraphs[0].size = textSize;
    textFrameObj.paragraphs[0].paragraphAttributes.justification = Justification.CENTER;
    textFrameObj.translate(x,y);
}
// ドキュメントに出力
output(70, 740, false);
output(70, 740, true);


 前回から2回に渡って、JavaScriptでIllustratorを制御する方法を紹介してきました。ほとんどの方には馴染みの薄い内容だったかと思いますが、いかがだったでしょうか。魅力を感じていただけたでしょうか。アイデア次第でいろいろな図を作成できますので、これをきっかけにIllustratorのJavaScriptを試してみましょう。


■Amazon.co.jpで購入

前へ 1 2 3 4 次へ

この連載の記事

一覧へ
Web Professionalトップページバナー

この記事の編集者は以下の記事をオススメしています

ASCII.jp会員サービス 週刊Web Professional登録

Webディレクター江口明日香が行く