見出し画像

自画像

自画像のプログラムです。
首の下のスライダーで顔色が変わります。

画像 001

画像 002

// 自画像

// プログラミング言語「ドリトル」

// インストール版ドリトルで実行してください

// 2020.06.18  蕪木 孝


// 設定値
画素サイズ = 20// 1つの画素(正方形)の幅。これを変更すると全体のサイズも変わる。
横の数 = 13// 横方向の画素数
縦の数 = 19// 縦方向の画素数

自画像の色 = 配列 !
      // 1行目の画素の色情報
      255 255 255  255 255 255  255 255 255   42  38  37   43  41  42
       44  44  42   32  32  30   34  34  34   37  36  34   48  38  39
      255 255 255  255 255 255  255 255 255

      // 2行目の画素の色情報
      255 255 255  255 255 255   52  42  40   40  36  33   35  34  32
       35  42  32   39  38  36   30  29  27   30  29  27   38  34  33
       40  30  29  255 255 255  255 255 255

      // 3行目の画素の色情報
      255 255 255   40  30  29   42  33  28   35  30  26   33  30  25
       32  27  23   32  27  24   29  24  21   43  35  32   38  27  23
       41  32  27   48  45  36  255 255 255

      // 4行目の画素の色情報
       48  45  36   35  26  19   44  33  27   37  30  22   36  29  21
       36  27  22   44  33  29   50  39  35   44  33  27   45  32  24
       49  39  30   49  47  35  255 255 255

      // 5行目の画素の色情報
       40  37  30   42  32  23   50  37  28   52  42  30   49  39  29
       49  34  27   72  55  48   94  77  69   88  71  63   93  75  63
       63  49  36   40  34  22   50  51  37

      // 6行目の画素の色情報
       29  26  21   59  46  37   53  37  24   75  62  46   75  59  44
       87  67  56  106  84  73  102  80  69  127 105  92  137 116  99
      172 155 139   49  42  26   48  45  30

      // 7行目の画素の色情報
       48  45  30  109  92  82   74  53  36   67  46  27  103  80  62
      157 131 118  152 126 113  117  91  74  149 124 104  101  73  52
      186 164 143   61  48  32   52  45  29

      // 8行目の画素の色情報
       39  34  30  114  95  81  127 100  81  153 126 105  139 111  90
      142 113  95  169 140 122  161 133 111  171 141 117  190 156 131
      184 156 134  178 161 145   55  43  29

      // 9行目の画素の色情報
       36  29  23  117  95  81  125  94  73  152 120  97  175 143 120
      129  97  76  205 173 152  116  84  59  169 135 107  224 187 160
      215 180 158  173 152 135   45  29  14

      // 10行目の画素の色情報
       26  19  11  120  97  81  128  93  71  117  81  57  130  94  70
      120  84  62  202 168 143  149 115  87  141 106  74  206 165 137
      209 173 149  179 156 140   72  54  40

      // 11行目の画素の色情報
       33  26  16  121  98  80  142 107  85  160 122  99  143 105  82
      143 105  82  207 171 147  195 160 128  170 134 100  199 158 128
      215 179 155  172 149 133  255 255 255

      // 12行目の画素の色情報
       41  34  24  113  92  73  113  92  73  137 105  82  118  80  59
      139 101  80  215 177 154  189 153 121  186 150 116  209 170 141
      205 170 148   97  75  62  255 255 255

      // 13行目の画素の色情報
      100  96  85  108  89  72  126 100  77  145 114  93  122  87  67
      113  75  56  171 130 110  188 149 130  168 132 100  214 177 151
      215 187 166   89  72  62  255 255 255

      // 14行目の画素の色情報
      255 255 255  106  91  72  118  96  75  138 111  92  132  99  82
      122  83  63  183 140 121  183 142 114  194 157 128  204 170 145
      210 184 167  232 222 213  255 255 255

      // 15行目の画素の色情報
      255 255 255  255 255 255  108  91  71  131 110  93   71  42  28
       83  43  31  144 101  84  154 112  87  169 132 105  203 173 149
      214 195 178  255 255 255  255 255 255

      // 16行目の画素の色情報
      255 255 255  255 255 255  108  95  78  124 105  90  124  98  83
      128  92  76  156 115  97  188 151 124  207 173 145  199 171 147
      240 223 205  255 255 255  255 255 255

      // 17行目の画素の色情報
      255 255 255  255 255 255  255 255 255  109  92  76  115  93  72
      143 115  93  166 136 110  203 172 143  196 167 137  207 181 154
      243 225 203  255 255 255  255 255 255

      // 18行目の画素の色情報
      255 255 255  255 255 255  255 255 255  109  92  76  108  86  63
      106  82  56  115  90  60  121  94  64  189 162 132  220 195 165
      247 229 205  255 255 255  255 255 255

      // 19行目の画素の色情報
      255 255 255  255 255 255  255 255 255  117 100  84  123 101  78
      135 109  84  169 142 113  211 182 152  222 195 165  228 203 173
      204 187 161  255 255 255  255 255 255
作る。

自画像の肌 = 配列 !	// 1 は肌の画素
	0 0 0 0 0 0 0 0 0 0 0 0 0	//  1行目
	0 0 0 0 0 0 0 0 0 0 0 0 0	//  2行目
	0 0 0 0 0 0 0 0 0 0 0 0 0	//  3行目
	0 0 0 0 0 0 0 0 0 0 0 0 0	//  4行目
	0 0 0 0 0 0 1 1 1 1 0 0 0	//  5行目
	0 0 0 1 1 1 1 1 1 1 1 0 0	//  6行目
	0 1 1 1 1 1 1 1 1 1 1 0 0	//  7行目
	0 1 1 1 1 1 1 1 1 1 1 1 0	//  8行目
	0 1 1 1 1 1 1 1 1 1 1 1 0	//  9行目
	0 1 1 1 1 1 1 1 1 1 1 1 0	// 10行目
	0 1 1 1 1 1 1 1 1 1 1 1 0	// 11行目
	0 1 1 1 1 1 1 1 1 1 1 0 0	// 12行目
	1 1 1 1 1 1 1 1 1 1 1 0 0	// 13行目
	0 1 1 1 1 1 1 1 1 1 1 1 0	// 14行目
	0 0 1 1 1 1 1 1 1 1 1 0 0	// 15行目
	0 0 1 1 1 1 1 1 1 1 1 0 0	// 16行目
	0 0 0 1 1 1 1 1 1 1 1 0 0	// 17行目
	0 0 0 1 1 1 1 1 1 1 1 0 0	// 18行目
	0 0 0 1 1 1 1 1 1 1 1 0 0	// 19行目	
作る。

// 自画像を画面中央に描画するための座標を計算する
x0 = round(画素サイズ * 横の数 / 2) * (-1)。	// 左上隅の画素のx座標
y0 = round(画素サイズ * 縦の数 / 2)。		// 左上隅の画素のy座標

// 描画オブジェクトを作成する
かめた = タートル ! 作る。
かめた ! 1 線の太さ。	// 画素の角が丸まる事象の対策

// 描画オブジェクトを描画開始位置へ移動する
かめた ! ペンなし    (x0) (y0) 位置    ペンあり。

// 顔色を変えるときに使う変数
赤最大値 = 0。
緑最大値 = 0// 顔色を変えるときに使うスライダー
スラ1幅   = 画素サイズ * (横の数 - 5)。
スラ1高さ = round (スラ1幅 * 2 / 13)。
スラ1x   = (スラ1幅 - 画素サイズ) / 2 * (-1)。
スラ1y   = y0 - (縦の数 + 1.5) * 画素サイズ。
スライダー1 = スライダー ! 作る    (白) 色    -100 から 100 まで    0 値。
スライダー1 ! (スラ1x) (スラ1y) 位置   (スラ1幅) (スラ1高さ) 大きさ 。
古い値 = 0// -------------------- 自画像の描画処理 --------------------

「
	| i ; 名前 a p 赤色 緑色 青色 肌 |

	// 自画像を1行描画する (左から右へ「横の数」個の画素を描画する)
	「
		| j |

		// 各画素の名前を作る
		名前 = "画素" + i + "_"+ j。

		// 1画素を正方形で描画する
		a = 名前 + " = かめた ! " + :画素サイズ + " 4 角形    図形を作る。"。
		a ! 実行。

		// 1画素の色情報を配列から読み込む 
		p = (i - 1) * :横の数 * 3 + (j - 1) * 3 + 1。
		赤色 = (:自画像の色 ! (p) 読む)。
		緑色 = (:自画像の色 ! (p + 1) 読む)。
		青色 = (:自画像の色 ! (p + 2) 読む)。

		// 肌の画素なら顔色を変えるときに使う変数の値を設定する
		p = (i - 1) * :横の数 + j。
		肌 = (:自画像の肌 ! (p) 読む)。
		「肌 == 1」 ! なら 「
			「赤色 > :赤最大値」 ! なら 「:赤最大値 = 赤色」 実行。
			「緑色 > :緑最大値」 ! なら 「:緑最大値 = 緑色」 実行。
		」 実行。

		// 読み込んだ色で画素(正方形)を塗る
		色1 = 色 ! (赤色) (緑色) (青色) つくる 。
		a = 名前 + " ! (色1) 塗る。"。    a ! 実行。

		// 描画オブジェクトを次の画素を描画する位置へ移動する
		かめた ! ペンなし    (:画素サイズ) 歩く    ペンあり。

	」 ! (:横の数) 繰り返す。

	// 描画オブジェクトを次の行を描画する位置へ移動する
	かめた ! ペンなし    (x0) (y0 - :画素サイズ * i) 位置    ペンあり。

」 ! (:縦の数) 繰り返す。

// 自画像の描画が終わったので描画オブジェクトの表示を消す
かめた! 消える。


// -------------------- 顔色を変える処理 --------------------

タイマー1 = タイマー ! 作る    0.1秒 間隔    10000 回数。

// (備考 「間隔 * 回数」秒後にはタイマーが停止するので顔色を変えられなくなる)

タイマー1 ! 「
	| ; 現在値 引く値 肌 赤色 緑色 青色 名前 a |

	現在値 = スライダー1 ! 値?。

	「現在値 != :古い値」 ! なら 「	// スライダーが操作されたなら
		「現在値 > 0」 ! なら 「
			引く値 = round(:緑最大値 * 現在値 / 100)。
		」
		そうでなければ 「現在値 < 0」 なら 「
			引く値 = round(:赤最大値 * 現在値 / 100 * (-1))。
		」 実行。

		「
			| i |
			「
				| j |
				p = (i - 1) * :横の数 + j。
				肌 = (:自画像の肌 ! (p) 読む)。

				「肌 == 1」 ! なら 「

					// 画素の色を読む
					名前 = "画素" + i + "_"+ j。
					p = (i - 1) * :横の数 * 3 + (j - 1) * 3 + 1。
					赤色 = (:自画像の色 ! (p) 読む)。
					緑色 = (:自画像の色 ! (p + 1) 読む)。
					青色 = (:自画像の色 ! (p + 2) 読む)。

					// スライダーの値で色を変える
					「現在値 > 0」 ! なら 「
						緑色 = 緑色 - 引く値。
						「緑色 < 0」 ! なら 「緑色 = 0」 実行。
					」
					そうでなければ 「現在値 < 0」 なら 「
						赤色 = 赤色 - 引く値。
						「赤色 < 0」 ! なら 「赤色 = 0」 実行。
					」 実行。

					// 変えた色で画素(正方形)を塗る
					色1=色 ! (赤色) (緑色) (青色) つくる 。
					a = 名前 + " ! (色1) 塗る。"。    a ! 実行。
				」 実行。
			」 ! (:横の数) 繰り返す。
		」 ! (:縦の数) 繰り返す。
	」 実行。

	:古い値 = 現在値。
」 実行。

実行方法

これは教育用プログラミング言語「ドリトル」で書いたプログラムです。
インストール版ドリトルを以下のサイトからダウンロードしてください。
https://dolittle.eplang.jp/download
パソコンのOSがWindowsなら「Windows用」をクリックするとダウンロードがはじまります。
ダウンロードしたら解凍してください。
解凍したら dolittle.bat をダブルクリックするとドリトルが起動します。
プログラムを貼り付けて「実行!」をクリックすると画面が表示されます。



このプログラムを実行したそこのあなた、お宅のPCにお邪魔してすみません。

この記事が気に入ったらサポートをしてみませんか?