Pythonでシェルピンスキーの三角形を描く
まえがき
CoderDojo天白を6年程度、運営してきて、Scratchをある程度、描けるようになって、つぎの段階として何をすればわからないとのことで卒業していく忍者も多いようです。Dojoとすれば、テキスト・プログラミングをと思っていましたが、何をすればいいかわからない。プロのプログラマーに聞いてもやりたいことによるということで、鶏と卵のような話になってしまうので困ります。
Dojoでは模様を描くのに興味を持った忍者に、とりあえずは、processingを勧めました。今でも熱心に取り組んでくれています。
その次に取り上げたのはUnityでした。楽しいゲームをつくるという観点からの授業をやりましが、どうも人が集まらなくて現在に至っています。
また、Pythonがわかりやすいよという声もありますが、昔、ちょっとやったときは遅い感じでもあり、魅力を感じませんでした。最近、pygameというのを知って、さらにpygame zeroというのを知って、ゲームに使えるのかなという気にもなって、ちょっとテストをしてみました。
実施内容
今回、実施したのは次のようなことです。
※ なお、参考としてScratchとprocessingを行ないました。
実施結果
Scratchの場合
プログラムは次のような感じになります。
再帰プログラムのいい例題だと思います。
結果は次のようになります。
ターボモードにすれば一瞬ですが、通常モードで一つ一つ描いていくので再帰の書き方がよくわかります。
これが今回の比較の基準になります。
Turtle Graphics の場合
プログラムは次のような感じになります。
from turtle import * WIDTH = 600 HEIGHT = 600 Screen().bgcolor("blue") speed(0) kame = Turtle() kame.shape("turtle") kame.color("white") kame.pensize(0.5) def triangle(length, kaisuu): if kaisuu != 0: for i in range(3): kame.forward(length) kame.left(120) triangle(length / 2, kaisuu-1) kame.penup() kame.goto(-200, -200) kame.pendown() triangle(400, 5)
ほとんど、Scratchの通りですね。
描画速度は亀が一つ一つ書いていくので遅くなります。Scratchの普通のモードで描いた感じです。
途中までで止めましたが、書き順がしっかりとわかります。
※ MuのモードはPythonのモードです。
pygame zeroの場合
プログラムは次のような感じになります。
import math WIDTH = 600 HEIGHT = 600 x0 = 100 y0 = 500 theta = 0 def draw(): screen.fill((0, 0, 255)) draw_triangle(400, 8) def draw_triangle(length, kaisuu): global x0, y0, theta if kaisuu != 0: for i in range(3): x1 = x0 + length * math.cos(math.radians(theta)) y1 = y0 + length * math.sin(math.radians(theta)) screen.draw.line((x0, y0), (x1, y1), "white") x0 = x1 y0 = y1 theta -= 120 draw_triangle(length/2, kaisuu-1)
前に進むという命令がないので、次々に終点を計算して2点間の線を結んでいます。これもScratchと同じような流れで作れますね。
なお、120度を加えるのにラジアンでなく、角度で表して、sin,cosの中でラジアンに変更するほうが精度がいいようでした。
global を関数の中で再宣言するのにおどろきました。
また、kameが線を引くというのではなく、Screenに直接描くという雰囲気でした。
若干、立ち上がりに時間がかかりました。
※ Muのモードはpygame zeroで行います。
pygame の場合
プログラムは次のような感じになります。
import pygame, sys, math from pygame.locals import * pygame.init() BLUE = (0,0,255) WHITE = (255,255,255) DISPLAYSURF = pygame.display.set_mode((600,600)) DISPLAYSURF.fill(BLUE) pygame.display.set_caption("TRIANGLE") x0 = 100 y0 = 500 theta = 0 def draw_triangle(length, kaisuu): global x0, y0, theta if kaisuu != 0: for i in range(3): x1 = x0 + length * math.cos(math.radians(theta)) y1 = y0 + length * math.sin(math.radians(theta)) pygame.draw.line(DISPLAYSURF,WHITE, (x0,y0),(x1,y1)) x0 = x1 y0 = y1 theta -= 120 draw_triangle(length/2, kaisuu-1) while True: draw_triangle(400,8) pygame.display.update() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit()
ちょっと大げさな書き方もありますが、プログラムらしくなってきました。
結果は同じですが、上にTriangleというラベルもついています。終了条件もはっきりしています。zeroの場合は僕の勉強不足かもしれませんが・・・
※ MuのモードはPythonで行います。
processingの場合も参考につけます
プログラムはこんな感じです。
float x0 = 100; float y0 = 400; float x1, y1; float theta = 0; void setup(){ size(600,500); background(0,0,255); stroke(255,255,255); smooth(); draw_triangle(400,8); } void draw_triangle(int length, int kaisuu){ if (kaisuu != 0){ for( int i = 0; i<3; i++){ x1 = x0 + length * cos(radians(theta)); y1 = y0 - length * sin(radians(theta)); line(x0, y0, x1, y1); theta += 120; x0 = x1 ; y0 = y1 ; draw_triangle(length / 2, kaisuu-1); } } }
まとめ
今迄、pythonは遅いと思っていたけれど、なんとかゲームにも使えるのではないかという気がしてきた。次回は簡単なゲームをつくってみたい。
CoderDojo天白 N087
開催日時 2021年01月30日(土)13:30~15:30
開催場所 天白生涯学習センター 第2集会室
概要
今日の参加者は忍者5名、見学忍者1名、保護者3名、メンター2名で久しぶりに賑やかな感じだった。常連のNさん姉妹と前回素晴らしいポスター?を描いていたRさん、3Dをやりたいと言ってたN君、ちょっとScratchをやったことがあるというYちゃん、付き添いの年長のS君といった顔ぶれです。
発表風景
小2のSiちゃん
今回もスターウオーズのレゴを使ってプログラミングです。
発表はつぎの動きでした。
まっすぐにN歩進む
到着したら頭を回転して周りを見回す
元の位置に戻る
足元を調整する
これを3回繰り返す。
きれいに動いていましたね。
衝突したらどうこうということが気になりましたが、それはつぎのバージョンということでした。
中1のSaちゃん
前2回、プロセッシングでシェルピンスキーの三角形を描くのに苦労していたので、松成なりにScratchのプログラムをプロセッシングで書き直したのを渡してみた。
今回、それを描いてくれた。
ちょっとは気がまぎれたかな(^^♪
小6のN君
3D志望のN君、Unityがやりたくなったとのことで、お父さんのパソコンに関連ソフトをインストールしてきてさてということではじめたが・・・エラーが出てしまった。
どうやら、Unity2020をインストールしたのかな?が問題みたいで、よくわからない。もう一度、ゼロからインストールをし直して、チュートリアルをやろうとしたが、チュートリアルは嫌だということ。
自分でゼロからやるということでゼロの画面を立ち上げて、開始というとこだけど、この辺で時間切れ( ノД`)シクシク…
次回までに何か作ってくるとのこと、、、取りあえずは期待しとこう。
年長のSくん
付き添いで見学ということだけど、iPadをお貸しして、ビスケットをやってもらった。
一つは練習という意味かな、さかな、たこ、ロケット?などなどが画面を動いていった。絵がきれいだねという声が聞こえた。なぜか、ビスケットの絵はきれいですね。
もう一つはクリックすると、いろんなものが出てくるというのを使って画面いっぱいにいろいろと出してくれた。赤と黒が目立ったので何色が好きかと聞くと黄色だそうでちょっと意外でした(^^♪
小4のYちゃん
Sくんのお姉ちゃん。 Scratchはほとんど初めてとのことでメクルンをお勧めした。メンターとして松田さんがSくんと一緒に見てもらった が、ほとんど、自分でやってたとのことだった。
メクルンの最初のサンプルで追いかけっこをやって、クマさんがハリネズミを追いかけるという形で、きれいにまとめてくれた。サブコースなどが残っていたが、今度にでもやったらどうだろう。
中1のRちゃん
前回、きれいなポスターを作って、何をするのだろうと思っていたが、ホームページを作るとのこと。本を買ってきてそれをもとに作っていくとのことだったが、一つ一つ覚えるよりもサンプルページを作った方がいいよということとエディタとしてVSCodeを勧めておいた。
調べるのもインターネットで探したりするのも慣れているようだったし、パソコン慣れもしているようだった。
結果、簡単なページを作って見せてくれた。
次回くらいから、段々とはっきりしたページを作ってくれるのかなと楽しみだった。
松成の報告
テキストプログラミングとして、Pythonがよくいわれるが、さて、何をすればいいかがわからない。昔、Pythonでかんたんなゲームをつくったが、ちょっと遅いなというのがその時の感想だった。
最近、pygame-zero, pygameといったライブラリ?を知ってテストしている。それなりに使えそうな気がして、4月からまた忍者募集をしようかと思っている。今回はシェルピンスキーの三角形をタートル・グラッフィック、Pygame-zero、Pygameの3種でやってみた。それぞれにちょっとずつ癖があるが、結構、わかりやすい。
集合写真
今日も一日、無事終了です。楽しかったかな?・・・(^^♪
次回の例会
次回は2月13日です。下記からお申し込みください。
その前にオンラインですが、下記があります。よかったらこちらへも参加してみてください。
以上
記録: 松成文夫
CoderDojo天白 N086
開催日時 2021年01月16日(土)13:30~15:30
開催場所 天白生涯学習センター 第2集会室
概要
2021年最初のDojoです。参加者は忍者は2家族4人、メンターは2名、保護者2名の8人で部屋の定員は20名とのことで3密を避けて、のんびりとした時間を過ごした。
今日の出し物はSiちゃんのレゴ。ロボットR2-D2でしょう。クリスマス・プレゼントに買ってもらったとか。。。
まずは、一つ一つの機能をボタンに設定して、メモ帳に記録しながら動かしていった。
全体の学習風景です。みんなそれぞれですが、、、次のようなことをやりました。 * プロセッシングでシェルピンスキの三角形
といったことでした。
発表風景
今回は参加忍者が4名で自分の机で発表するには密になるかとも思い、Zoomの準備もしていたが、結局は従来通り、自分の机でやってもらった。
小3のMくん
年初でもあり、何か正月物をということで始めたが、気に入るものができなかったらしい。発表は前にも作った迷路ゲームだった。
右上のStartから左上のGoalまでの迷路だが、障害物があって難しい。右下にワープポイントがあってここへ来ると緑の円形の場所にワープする。
昔、やったことを思い出しながら作ったとのことでした。
小1のChiちゃん
何を作ろうかなと言いながら、正月の凧、こまなどを描いていった。
いろいろと増えた時点でメンターのアドバイスもあり、シューティング・ゲームになり、ボールが当たったら花火が出るというような作品になった。ゲームだよと言って、ゲームができたのが嬉しそうだった。
中1のSaちゃん
いつもコツコツと頑張っているSaちゃん。前回うまくいかなかったので、今回も書き直しで作っていった。
今回も途中までで終了。
ぼくも、次回までに作ってみるかな・・・
小2のSiちゃん
直進、回転、停止・・・などの機能ボタンを作ったり、直進性能を調べたり、、、、
落して直したり、、、
発表では簡単に直進をしてくれました(^^♪
発表主体より、作業が楽しいですね(^^♪
82歳の松成
Pythonがわかりやすく、若い人に取り付きやすいという声を聞くが、何をやるか、前に一つゲームをコピペで作ったが遅くて問題だった。
最近、pygamezeroというのを知り、それもMuで作るということでちょっとやってみた。
迷路ゲームとシューティング・ゲームをコピペだけど、実演した。今年はUnityを1年やったが、来年はPythonとホームページをやってみる予定。そんなPRを込めての発表をした。
集合写真
最後にいつものようにみんなで集合写真を撮りました。
また、次回、楽しくやっていこう!
次回
次回は1月30日に下記で行います。
よかったら、参加してください(^^♪
記録: 松成文夫
CoderDojo天白 N085
開催日時 2020年12月26日(土)13:30~15:30
開催場所 天白生涯学習センター 第2集会室
概要
今日で本年最後のDojoでした。期せずして、孫の小学校の2学期最終日でもあった(^^♪。参加忍者は常連のNさん姉妹と久しぶりのTくん。メンターはいつもの松田さんと松成。保護者2名の参加だった。最後としてはちょっと寂しいが、ゆったりとした時間を過ごすことができた。
内容はScratch2名とプロセッシング1名。Scratchはメクルンを提案してみたが、やることを考えてきていて、Siちゃんは年賀状をTくんはマスクキャッチの続きで点数つけと音入れをする。Saちゃんはプロセッシングでテキストを使ってのジェネラティブ・アートでフラクタルの絵を描く予定。Saちゃんのやってることがわからなくなったので、マット・ピアソンのテキストを一冊やってみたが、Saちゃんのテキストはちょっと違ってるようだった。ジェネラティブといってももっといろんな見方があるのかな。
発表風景
発表は今回も自分の机で発表して貰った。
小2のSaちゃん
ハートのマークに Happy New Yearを描いて、ランダムな位置から、スタートボタンで整列するというアイデア。ペンで牛を描いたのが自慢だった。発表時に色も付けて、めでたし、めでたし。
前回のクリスマスカードに続いて、年賀状と、その時期の物を取り入れるのは基本かな。段々と動きを付けてもらえればいいけど。
中1のSaちゃん
プロセッシングでフラクタル図形を描くのだが、ちょっと、エラーが出て、それ以上進めなかった。テキストはこういう場合につらい。オール・オア・ナッシングになる。次回からZoomを取り入れて、マンツーマンで行なってみるかな。
小4のTくん
だいぶ、時間をかけてのマスクキャッチゲームです。マスクをを受け取ったら、色に応じてプラスの得点、ウイルスを捕まえたらマイナスの得点で十分ゲームができていた。ただ、受け手がマスクはおかしくないと言ったら、、、、普通に人間でいいのでないかな?
集合写真
カエルさん好きなNさんファミリーからカエルを受け取って、頭に乗せたTくん、みんなそれなりにというとこかな。1年間、ご苦労様でした。
次回のお知らせ
来年は1月16日がDojoはじめということになります。ちょっと、時間が空きますがよいお年をお迎えください。
あれこれ
お茶しての帰り、植田駅前の公園でクリスマスツリーがきれいに飾られていました。
記録作成 松成文夫