プレイ日記
おちゃめ ochame_nako
プログラミング初心者の方へ捧ぐ! プチコン3号を購入によって初めてプログラミングを行う初心者も多いと思います。 プログラミングにおいて重要なのは「実際にプログラムを作る」ということです。マニュアルや講座等を見て頭を悩ませるだけではプログラミングの楽しさは分かりません。 「自分で考えたものが実際にプチコン上で動く」ことこそがプログラミングの一番の楽しさだと私は思います。 そこで私の経験を元にしたプログラミングの上達方法や楽しさについて少し書いていきます。 実際の例として先日公開した「簡易毛筆 for 3DS」での開発話(「にじみ」や「かすれ」の原理など)とかも書いています。
31そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
さて、プログラミングというと「きちんとフローチャートを書いて」とか形から入るようにしている人(もしくは、そのように教えている人)も居ますが、そんなにきちんと考える必要なんてありません。 「こんなの作りたい」→「実際に作ってみよう」 これでいいのです。 「思ったように動かない」「エラー」が出たという場合に理由を考えて対処すればいいのです。 こんな行き当たりばったりのプログラミングだと大勢で共同開発したり大規模なプログラムを作る場合にはどこにバグがあるのか分からないからダメみたいに考える人もいると思いますが、初心者がいきなり「共同開発」とか「大規模なプログラム」とか作るはずがないので無用な心配です。 むしろ、頭の中(もしくは紙の上)でばかり考えて「実際に動かしてないのにあれこれ悩んで前に進まない」というのが一番ダメなパターンだと思います。
3そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
試行錯誤することでプログラミングは上達します。 成功しても失敗してもそれが自分の力になるためです。 何も経験がない初心者の場合は「『こんなの作りたい』→『実際に作ってみよう』」がなかなかできないかもしれないですが、その場合はできる範囲内のことをやれば良いし、分からない場合はその段階でそれを行うのに必要な命令等を覚えれば良いのです。 「命令がたくさんあるから順番に覚えていかないといけない」と考えて自分がいつ必要になるかも分からないような命令を必死で覚える必要はありません。 そんな「どこで使えるのか分からない」「何の役に立つのか分からない」という段階で覚えても身に付かないしやっていてつまらないことが多いです。 「必要になったときに必要なことを覚える」というのが一番無駄が無いだけではなく、やる気を削がれず「長続きするコツ」です。
3そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
私はBASICを初めてから30年以上経ちますが未だに試行錯誤の連続です。 一例として冒頭にある簡易毛筆について少し書いてみます。 ご存じの人も多いかと思いますが、私は小さいプログラムを作るのが好きでQSP(WIDTH 16を使用時の1画面プログラム)も多く作っています。 そんな私が1年少々前に作ったのが簡易毛筆QSPです。 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHkm7urBQQ これはリンク先に書いているようにペンを動かす速さによって「入り」「抜き」が表現されています。(しかも、QSPで) これは、すでに単色お絵かきソフトであるPETIT PAINT QSPを作っていたからこそできたのでそこから語る必要がありますが、長くなるので「入り」「抜き」対応の簡易毛筆QSPがあるという段階でスタートします。
1そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
毎年恒例となる書き初め大会を今年はプチコンBIGコミュでもやりたい。   ↓ 簡易毛筆QSPをプチコンBIGで動作させてみたところBIGのバグによって正常に動かないことが発覚。   ↓ それならばプチコンBIG用に作り直せばいい。   ↓ 単純移植だとつまらないのでBIGならではの要素が欲しい。   ↓ 高解像度だけではインパクトに欠けるので行数制限無しで作るならば「にじみ」「かすれ」にも対応してみたい。 というわけで、プチコンBIG専用の簡易毛筆を作り始めたのでした。 しかし、12月29日でお正月の書き初め大会に間に合わせるのは3日しかないという状況下でした。
1そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
「にじみ」「かすれ」といってもそんなものは作ったことがないのでどこから手を付けるかで迷いましたが、単純にエアブラシを作ってみたところ「ふわふわするだけで全然毛筆っぽくない」ためこれをどのようにしたら毛筆っぽくなるかで考えることにしました。 そこで、思いついたのが乱数に意図的な偏りを持たせるというものです。 これは以前も書きましたが、乱数を複数発生させてその平均を取ると中心極限定理によって正規分布に近づくというのが知られています。 https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0fQKcdeZg 簡単に言えば、発生させる数が多いほど平均付近の値が出やすくなるということです。 その考えに基づいたブラシがこれです。 半径がRとするとブラシの中央からR/2付近の値が出やすくなるためこのようなドーナツ型のブラシになるわけです。
1そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
複数発生させて平均を取れば平均付近の値が出やすくなるということは平均付近を離れた値は出にくくなるわけで乱数の発生回数によって簡単ににじみをコントロールできるというわけです。 どれくらいが適切なのかは考えてもすぐには出てこないため実際にプチコンBIG上で動かして確かめてみました。 発生させる乱数の数によってどの程度変わるかはプチコンBIGで確かめたところ1ドットあたり4回くらいがちょうど良い感じに思えました。 この「にじみ処理」はかなり重い処理となるわけですが、簡易毛筆QSPでは線形補間の処理(ペンを速く動かした場合に線が途切れないようにその間を埋めていく処理)を1ドット単位で行っていたのに対して「簡易毛筆 for U」はブラシの半径分の線形補間(これより大きいと隙間ができてしまう)によって処理落ちせず60fpsをキープできました。
1そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
「にじみ」ができれば「かすれ」はループ回数を増減によってコントロール可能になります。 (面積あたりの)ループ回数が減ればドットの密度が減ってかすれたようになり、ループ回数が増えればドットの密度が上がって濃くなるわけです。 同じループ回数ならばペンを速く動かせば必然的に面積当たりではループ回数が減るためどの速度以上ならばかすれが多く発生するかさえ分かれば良いです。 これも頭の中で考えるのは難しいため実際に動作させて調べてみました。 速く動かすと線が細くなる(ブラシの半径が小さくなる)ような処理になっているため「速く動いている」というのは線の太さとのバランスも考える必要があります。(十分太い線になっているのにかすれているということがないようにしなければならない)
1そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
普通のエアブラシだとブラシの「中央付近が濃く」「端の方は薄い」という処理になるためループ回数を減らしたら端の方からどんどん薄くなるのですが、この乱数を複数発生させたドーナツ型のブラシが幸いして「いい感じ」でかすれが発生しました。(端だけではなくブラシの中央もかすれてくる) 普通のエアブラシでループ回数を減らせばブラシ中央もかすれるようになるのですが、その場合は周辺はさらにかすれた感じになりエッジが完全に無くなります。 「いい感じ」になったのは「ブラシ中央が薄いため」だけではなくブラシの半径単位で線形補間をしたためです。 これによってある程度エッジが効いた状態でかすれが発生するようになりましたが、これも試行錯誤でループ回数を調整していい感じになるようにできました。 上記の例では1ドットあたり乱数を4回発生させていますが、この数が多いほどドーナツははっきりとした形状になります。
1そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
BIG版となる「簡易毛筆 for U」がとりあえず完成してやはり次はプチコン3号版となる「簡易毛筆 for 3DS」を作ってみようとなったわけですが、BIGでさえギリギリ処理落ちしないレベルのものをプチコン3号でまともに動くのかというのが懸念材料でした。 そんなのやってみないと分からないため解像度だけをプチコン3号用にコンバートした作品を作ってみたところNew 3DSで動かせばデフォの極太筆でも60fpsをキープでき処理落ちしませんでした。 これは画面解像度が低い分だけブラシを小さくしている(半径では約1/2、面積では4分の1)のが理由でプチコンBIGより3倍くらい遅い(New 3DSで動作する)プチコン3号でプチコンBIG用のプログラムをほとんど変更無しに動かすことができました。 これでようやく「簡易毛筆 for 3DS」の初期版(ver.1.0.1)が完成しました。
1そうだね
プレイ済み
返信[10]
親投稿
おちゃめ ochame_nako
「簡易毛筆 for 3DS」は元々解像度が高いプチコンBIGでの動作を想定しているため「にじみは抑えられてる」わけだし、旧3DSでの動作は全く考慮されてない(デフォ筆でも20~30fpsしか出ないため厳しい)ということもあり、「簡易毛筆 for 3DS」の改良版を作ることにしました。 改良するにあたり「にじみ量の調整」「処理速度の向上」は重要な要素ですが、それに加えて実際に「書き初め大会」での使用者を見ると「太すぎて使いにくい」とか「(普通の鉛筆書きと同じくらいの速度で書いているため)線が細くなり毛筆っぽさが全然でない」という人もあり、それを改善したイージーモードを用意することにしました。 自分だけで作っているソフトの場合は「分かっていること」前提でバランス調整してしまいがちです。 しかし、そのソフトを使ったことがない初心者が相手ならば「分からないことを前提」にしなくてはなりません。
0そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
処理の高速化はループ内の処理の極限までの軽量化を行いました。 例えばプチコン3号では乗算より除算の方が速いため乗算処理をすべて除算に書き直しています。 軽量化処理と最適化処理によって実効速度は約3倍になり旧3DS(2DS)では20~30fpsしか出なかったデフォの極太筆も60fpsをキープできるようになりました。 というわけで、これが最新のver.1.1.0です。 https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0flPl_jhQ 簡易毛筆QSPが出来てから簡易毛筆 for 3DSが出来るまでの流れ(1年以上の期間があるけど実質3日分)を書いてみましたが、最初から頭の中だけでできる処理というのは案外少ないもので多くのものが試行錯誤によって実現されています。 これはどんなジャンルのプログラムにおいても変わらないと思います。
1そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
その試行錯誤を行うにも過去の経験の有無は重要です。 実際にブラシで描画する処理を作ったことがないとそもそも「にじみ」や「かすれ」の実装方法なんて思いもつかないでしょう。 もちろん、ネットで検索すれば良い方法が見つかるのかもしれませんが「それを考えること自体が楽しい」と私は思っています。 すべて自力でプログラムを作るのか、分からないことを人に聞いたり調べたりするのかは、初めてプレイするゲームを自力でプレイするのか攻略本を見ながらプレイするのかの違いに似ています。 前者の方が楽しいと感じている人はぜひ試行錯誤で自分なりの方法を見つけ出してください。 これは後者を否定しているわけではなくという人も「自力でやりたいけど手がかりが全く無くてずっと立ち往生している人」「それによって嫌いになる人」よりは良いことだと思います。
1そうだね
プレイ済み
返信[13]
親投稿
おちゃめ ochame_nako
プログラミングに限ったことではないですが「分からないことはやってみる」ことが一番重要です。 特にプチコン3号によるプログラミングの場合は間違ったことをやっても人的被害があるわけでもないし、本体が壊れるということもありません。 これは、どんな失敗であろうと気にせず試せるということです。 今回の簡易毛筆の例も試行錯誤の重要性を分かってもらうために書きました。 個人的には「試行錯誤」こそがプログラミングの面白さだと思います。 これは、「思ったように動けばそれが正解」となるためです。 とはいえ、試行錯誤だけですべて解決できるわけではありません。 自分でやった上で分からないことはネット等を使い自分で調べればいいしそれでも分からなければその時はMiiverse等で他人に質問すれば良いのです。 長文になりましたが、プチコン3号によって初めてプログラミングに触れた人にとって何らかの参考になれば幸いです
3そうだね
プレイ済み
返信[14]
親投稿
 エラーが起きても壊れない、臆せず試そうは、30年前、BASICの説明書にも書いていたことを思い出しました。  できる範囲から始めていって、なれていけばよいと個人的には思っています。
1そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
とうどうしゅんすけさんへ 臆せずやってみることは大事ですよね。 それが失敗しても成功しても自分の糧になりますから。 1つ1つのことが今後作るプログラムを作る上での糧になっていくので「作るのが無駄なプログラム」なんてありません。 私の場合は簡易毛筆 for 3DSを作るのには簡易毛筆QSPの経験が最も役立ったのですがそれだけではなく乱数ADAMを作った経験も役立ったし演算子の実行速度を調べた経験なども役立っています。 そして、簡易毛筆QSPを作る際もPETIT PAINT QSPなどを作った経験が役立っています。 つまり、過去30年以上のプログラミング経験がすべて繋がっていて無駄なことなんてありません。 今は無駄に感じることでも1年先には役立つかもしれません。
2そうだね
プレイ済み
返信[16]
親投稿
おちゃめ ochame_nako
(続き) 今まで作ったことの無いプログラムを作るのに必要なのは(失敗を含めた)過去の経験とそれを踏まえた上での試行錯誤となります。 これは過去に作ったプログラムから1つ1つ必要な部品を取り出しそれを試行錯誤で繋ぎ合わせる感じです。 したがって、十分な部品がない初心者は足りない部分を試行錯誤で補うしかないということになります。 アルゴリズム等は今はネット検索すれば大抵のものが見つかりますが見つからないものは自力で何とかするという経験がないとどうにもできません。 つまり、初心者が上達するためには「命令をたくさん覚えること」が重要なことではなく「実際にやってみた経験」が重要であることを分かって欲しいということです。 「考える前にやってみる」くらいでちょうど良い感じです。 これが経験を積めば「実際にやってみないと分からない部分」「やらなくても分かる部分」が分かってくると思います。
3そうだね
プレイ済み