Help us understand the problem. What is going on with this article?

Scratchで三角形を描く

文部省の小学校プログラミング教育の手引 というページに「小学校プログラミング教育の手引(第二版)」なるドキュメントがあります。p.15 に【「プログラミング的思考」とは】の中で、コンピュータで正三角形をかこうとする場合、を例にプログラミング的思考を開設しています。ここでは、正三角形ではないのですが、三角形を描くプログラムをScratchで作ってみました。

三角形を描くScratchプログラム

このプログラムは3点を決めて、その間を線でつなぐというアルゴリズムになっています。

image.png

使い方

  • 緑の旗をクリックします。→ クリアされます。
  • 画面上で、3つの点をクリックします。
  • 三角形の描画が始まります。

変数

  • CNT 何点目をクリックしたか?を示します。緑の旗が押されたときに3くクリアされ、クリックする度に値がデクリメントします。
  • (X1,Y1), (X2,Y2), (X3,Y3) と3つの座標を保持する変数を準備します。

アルゴリズム

マウスをクリックする、というイベントでプログラムがよばれます。C言語で記述するなら、アルゴリズムは以下のようになります。

    switch(CNT){
        case 3:
            (X1,Y1) にマウスの位置を代入する
            CNT=CNT-1;
            break;
        case 2:
            (X2,Y2) にマウスの位置を代入する
            CNT=CNT-1;
            break;
        case 1:
            (X3,Y3) にマウスの位置を代入する
            CNT=CNT-1;
            三角形の描画関数
            break;
        default:
    }
}

Scratch のプログラム

image.png

とプログラムしました。Cで書くと以下のようになります。

    if(CNT==1){
        (X3,Y3) にマウスの位置を代入する
        CNT=CNT-1;
        三角形の描画関数
    }
    if(CNT==2){
        (X2,Y2) にマウスの位置を代入する
        CNT=CNT-1;
    }
    if(CNT==3){
        (X1,Y1) にマウスの位置を代入する
        CNT=CNT-1;
    }

私は、Scratch でswitch文を書こうとするとき、break を記述する方法を見つけていません。ですので、if 文を並べて書いています。

次のように書くこともできます。

image.png

    if(CNT==3){
        (X1,Y1) にマウスの位置を代入する
        CNT=CNT-1;
    } else if(CNT==2){
        (X2,Y2) にマウスの位置を代入する
        CNT=CNT-1;
    } else if(CNT==1){
        (X3,Y3) にマウスの位置を代入する
        CNT=CNT-1;
        三角形の描画関数
    }

他にも方法があるかもしれません。
最初に示した文部省のドキュメントの問題提起とは違ったところを問題にしてしまいました。

描画

for 文を使うことをお勧めされていますが、Scratchでfor文を作るのは若干面倒です。
for文の方が長くなります。
3点を通る直線を引くだけなら、3つのブロックでできるので、このようにしています。

image.png

追記

for文ライクな書き方をしてみました。
https://scratch.mit.edu/projects/330729499/

for文を使うために、インデックスで読み出す(x,y)の配列を使っています。

image.png

こちらの方が複雑な記載になってしまいました。

終わりに

三角形を描くだけでもいろんなアルゴリズムが考えられると思います。ここでは、3点の座標を決めて、その点の間をつなぐというアルゴリズムでした。三角形を描くには、1)三辺の長さを決める。2)2辺の長さとその間の角度を決める。3)1辺の長さとその両端の角度を決める。の3つの方法があります。それぞれ、どのようなアルゴリズムで、どのように(Scratchで)プログラミングするのか、考えるのも楽しいのではと思っています。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away