日本語プログラミング言語Mind９βのキャンバスに雪（っぽいの）を降らしてみる

# はじめに
日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン９βをご提供いただいたので、新機能であるキャンバスのグラフィックス機能についてなにかやってみることにしました。

[前の記事](https://qiita.com/mylifewithviolin/items/7200cb5253da32b29b09) ではラインアートっぽいのになりましたが、今回は日本語プログラミング言語界隈ではやっている？[雪をふらせる](https://qiita.com/snowdrops89/items/279caac43778b340ee17)に挑戦してみます。

# 前提条件
Windows11 Pro 22H2 22621.4169
mind version9-BETA-6　

# どうやって降らせるの？
日本語プログラミング言語界隈では雪の結晶っぽい:snowflake:のをひらひらさせたりとかすごいのがありますが、今回はちょっとそこまではムリ:joy:

https://qiita.com/snowdrops89/items/279caac43778b340ee17

とりあえず乱数をつかって雪片（っぽい白い円）の直径と座標と下降位置差分を計算して、Mind９βのキャンバスに描画してみることにしました。

![snowfall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/2f4295b2-978b-fbfe-82fb-fc0e9933688b.png)

# 解説

### 「雪片」の構造体　
「雪片」の構造体は下記のように記述しました。

```mind:snowfall.src
雪の数は　定数　１４０。

雪片は　構造体
        X座標は　変数
        Y座標は　変数
        半径は　変数
        速度は　変数
    雪片本体は　X座標と　Y座標と　半径と　速度
    全体は　雪の数の　雪片本体。

```
これを最初に乱数を使って下記のように初期化します。

```mind:snowfall.src
"random.src"を　コンパイル。

キャンパス幅は　定数　８００。

雪片初期化値を返すとは　　（変数　→　変数、変数、変数、変数）
        Xは　小数変数
        Yは　小数変数
        Rは　小数変数
        Sは　小数変数
        キャンバスサイズ幅は　変数
    キャンバスサイズ幅に　入れ
    キャンバスサイズ幅に　小数化し　ガウス分布乱数(0.5,0.4)を　f掛けて   Xに　入れる
    50と　小数化し　ガウス分布乱数(0.5,0.4)を　f掛けて   Yに　入れる
    3と　小数化し　一様乱数()を　f掛けて   Rに　入れる
    2と　小数化し　ガウス分布乱数(0.8,0.3)を　f掛けて   Sに　入れる
    Sが 1.0より　ｆ以下　
    ならば 
        1.0を Sに　入れ
    つぎに
    Xを　整数化
    Yを　整数化
    Rを　整数化
    Sを　整数化。

全ての雪片を初期化するとは
    20170316を　乱数種値に　入れ
    雪の数で　回数指定し
        キャンパス幅で　雪片初期化値を返し
        速度（回数）に　入れ
        半径（回数）に　入れ
        Y座標（回数）に　入れ
        x座標（回数）に　入れ
    繰り返す。
```

乱数はQiitaユーザー@t-tkd3aさんの下記の記事のソースを利用させていただいております。

https://qiita.com/t-tkd3a/items/460b6f42ea69051f1130

### メイン処理の構造
ここでメインについて解説いたします。
まずメインウィンドウにキャンバスを展開した後、先の「全ての雪片を初期化する」で雪片構造体を初期化します。
つづいて、その初期値で雪片を描画します。この定義はこの後ご説明いたします。初回の雪片描画の後は、ループに入ってまずちょこっとディレイをかけた後、キャンバスをクリアして、雪片構造体の位置などを更新して雪片を描画、これを繰り返すというわりとシンプルなつくりです。

```mind:snowfall.src
キャンバスは　ＩＤ。
キャンパス幅は　定数　８００。
キャンパス高は　定数　４００。

メインは
    メインウィンドウと　キャンパス幅と　キャンパス高と　黒色で
　　　　　　　　　　　　　　キャンバスを立て　キャンバスに　入れ

    全ての雪片を初期化する

    雪の降る様子を描く
    ここから
        １ミリ秒で　　　遅延
        キャンバスで　キャンバスをクリアし
        雪の描く位置を更新し
        雪の降る様子を描く
    繰り返す。
```

### 雪片構造体の位置などを更新する処理
雪片構造体の位置などを更新する処理は下記の感じです。Y座標がキャンバス高さを超えたらリセットしています。x座標（回数）は乱数で若干調整しています。プラスマイナスの乱数の出し方がいまのところわかってなくて（ガウス分布乱数の平均値を0にすればいける？）微妙に左に流れていく動きとなっています。＋にすれば右に流れていく感じになります。

```mind:snowfall.src
雪片を少し揺らすとは
        Xは　小数変数
    -2を　小数化し　一様乱数()を　f掛けて   Xに　入れ
    Xを　整数化。

雪の描く位置を更新するとは
        Yは　変数

    雪の数で　回数指定し
        Y座標（回数）に　速度（回数）を　加え　Yに　入れる
        Yが　キャンパス高　以下
        ならば
            Yを　Y座標（回数）に　入れる
            雪片を少し揺らし　x座標（回数）を　加え　x座標（回数）に　入れる
        さもなければ
            キャンパス幅で　雪片初期化値を返し
            速度（回数）に　入れ
            半径（回数）に　入れ
            Y座標（回数）に　入れ
            x座標（回数）に　入れる
        つぎへ
    繰り返す。
```

## 雪片を描画する処理
雪片を描画する処理は下記のとおりです。

```mind:snowfall.src
雪片を描くとは
		＿円ＩＤは	図形ＩＤ
        Xは　変数
        Yは　変数
        Rは　変数
    
    Xに　入れる
    Yに　入れる
    Rに　入れる
    キャンバスと　Xと Yと Rで　円のＩＤを取得し　＿円ＩＤに　入れる
	白色で	＿円ＩＤに　満たす色を設定し
	＿円ＩＤを　描画すること。
 
雪の降る様子を描くとは
    雪の数で　回数指定し
        半径（回数）と　Y座標（回数）と x座標（回数）で　雪片を描く
    繰り返す。
```

# 実行イメージ

実行時の様子は下記の感じです。

![snowfall.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/4afbc298-dc92-2def-8eb4-0c9a79e5078e.gif)

乱数の持たせ方で動かし方はいろいろ変えれると思います。

# おわりに
いかがでしたでしょうか？なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕４０周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます！

## 参考情報
<details><summary>ソースコード全文</summary>

```mind:snowfall.src
"random.src"を　コンパイル。

キャンバスは　ＩＤ。
キャンパス幅は　定数　８００。
キャンパス高は　定数　４００。
雪の数は　定数　１４０。

雪片は　構造体
        X座標は　変数
        Y座標は　変数
        半径は　変数
        速度は　変数
    雪片本体は　X座標と　Y座標と　半径と　速度
    全体は　雪の数の　雪片本体。

雪片初期化値を返すとは　　（変数　→　変数、変数、変数、変数）
        Xは　小数変数
        Yは　小数変数
        Rは　小数変数
        Sは　小数変数
        キャンバスサイズ幅は　変数
    キャンバスサイズ幅に　入れ
    キャンバスサイズ幅に　小数化し　ガウス分布乱数(0.5,0.4)を　f掛けて   Xに　入れる
    50と　小数化し　ガウス分布乱数(0.5,0.4)を　f掛けて   Yに　入れる
    3と　小数化し　一様乱数()を　f掛けて   Rに　入れる
    2と　小数化し　ガウス分布乱数(0.8,0.3)を　f掛けて   Sに　入れる
    Sが 1.0より　ｆ以下　
    ならば 
        1.0を Sに　入れ
    つぎに
    Xを　整数化
    Yを　整数化
    Rを　整数化
    Sを　整数化。

雪片を描くとは
		＿円ＩＤは	図形ＩＤ
        Xは　変数
        Yは　変数
        Rは　変数
    
    Xに　入れる
    Yに　入れる
    Rに　入れる
    キャンバスと　Xと Yと Rで　円のＩＤを取得し　＿円ＩＤに　入れる
	白色で	＿円ＩＤに　満たす色を設定し
	＿円ＩＤを　描画すること。

全ての雪片を初期化するとは
    20170316を　乱数種値に　入れ
    雪の数で　回数指定し
        キャンパス幅で　雪片初期化値を返し
        速度（回数）に　入れ
        半径（回数）に　入れ
        Y座標（回数）に　入れ
        x座標（回数）に　入れ
    繰り返す。

雪片を少し揺らすとは
        Xは　小数変数
    -2を　小数化し　一様乱数()を　f掛けて   Xに　入れ
    Xを　整数化。

雪の描く位置を更新するとは
        Yは　変数

    雪の数で　回数指定し
        Y座標（回数）に　速度（回数）を　加え　Yに　入れる
        Yが　キャンパス高　以下
        ならば
            Yを　Y座標（回数）に　入れる
            雪片を少し揺らし　x座標（回数）を　加え　x座標（回数）に　入れる
        さもなければ
            キャンパス幅で　雪片初期化値を返し
            速度（回数）に　入れ
            半径（回数）に　入れ
            Y座標（回数）に　入れ
            x座標（回数）に　入れる
        つぎへ
    繰り返す。

雪の降る様子を描くとは
    雪の数で　回数指定し
        半径（回数）と　Y座標（回数）と x座標（回数）で　雪片を描く
        ※回数　２０　１００　雪片を描く
        ※半径（回数）と　数値表示　空白表示
        ※Y座標（回数）と 数値表示　空白表示
        ※x座標（回数）で　数値表示　改行
    繰り返す。

メインは
    メインウィンドウと　キャンパス幅と　キャンパス高と　黒色で
　　　　　　　　　　　　　　キャンバスを立て　キャンバスに　入れ

    全ての雪片を初期化する

    雪の降る様子を描く
    ここから
        １ミリ秒で　　　遅延
        キャンバスで　キャンバスをクリアし
        雪の描く位置を更新し
        雪の降る様子を描く
    繰り返す。
```

</details>