CoderDojo 天白

CoderDojo天白の開催記録と技術的なメモ

Pythonでシェルピンスキーの三角形を描く

まえがき

CoderDojo天白を6年程度、運営してきて、Scratchをある程度、描けるようになって、つぎの段階として何をすればわからないとのことで卒業していく忍者も多いようです。Dojoとすれば、テキスト・プログラミングをと思っていましたが、何をすればいいかわからない。プロのプログラマーに聞いてもやりたいことによるということで、鶏と卵のような話になってしまうので困ります。

Dojoでは模様を描くのに興味を持った忍者に、とりあえずは、processingを勧めました。今でも熱心に取り組んでくれています。

その次に取り上げたのはUnityでした。楽しいゲームをつくるという観点からの授業をやりましが、どうも人が集まらなくて現在に至っています。

また、Pythonがわかりやすいよという声もありますが、昔、ちょっとやったときは遅い感じでもあり、魅力を感じませんでした。最近、pygameというのを知って、さらにpygame zeroというのを知って、ゲームに使えるのかなという気にもなって、ちょっとテストをしてみました。

実施内容

今回、実施したのは次のようなことです。

  1. プロジェクト: シェルピンスキーの三角形

  2. python はつぎの3種

  3. エディターはMuを用いました。

※ なお、参考としてScratchとprocessingを行ないました。

実施結果

Scratchの場合

プログラムは次のような感じになります。

f:id:whomeantan:20210204002406p:plain

再帰プログラムのいい例題だと思います。

結果は次のようになります。

f:id:whomeantan:20210202173556p:plain

ターボモードにすれば一瞬ですが、通常モードで一つ一つ描いていくので再帰の書き方がよくわかります。

これが今回の比較の基準になります。

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の普通のモードで描いた感じです。

f:id:whomeantan:20210202202655p:plain

途中までで止めましたが、書き順がしっかりとわかります。

※ 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に直接描くという雰囲気でした。

f:id:whomeantan:20210202211845p:plain

若干、立ち上がりに時間がかかりました。

※ 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の場合は僕の勉強不足かもしれませんが・・・

f:id:whomeantan:20210202231719p:plain

※ 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君といった顔ぶれです。

f:id:whomeantan:20210131135353j:plain

発表風景

小2のSiちゃん

f:id:whomeantan:20210131140123j:plain

f:id:whomeantan:20210131140153j:plain

今回もスターウオーズのレゴを使ってプログラミングです。

発表はつぎの動きでした。

  • まっすぐにN歩進む

  • 到着したら頭を回転して周りを見回す

  • 元の位置に戻る

  • 足元を調整する

  • これを3回繰り返す。

きれいに動いていましたね。

衝突したらどうこうということが気になりましたが、それはつぎのバージョンということでした。

中1のSaちゃん

f:id:whomeantan:20210131141925j:plain

f:id:whomeantan:20210131141948j:plain

前2回、プロセッシングでシェルピンスキーの三角形を描くのに苦労していたので、松成なりにScratchのプログラムをプロセッシングで書き直したのを渡してみた。

今回、それを描いてくれた。

ちょっとは気がまぎれたかな(^^♪

小6のN君

f:id:whomeantan:20210131145637j:plain

f:id:whomeantan:20210131145716j:plain

3D志望のN君、Unityがやりたくなったとのことで、お父さんのパソコンに関連ソフトをインストールしてきてさてということではじめたが・・・エラーが出てしまった。

どうやら、Unity2020をインストールしたのかな?が問題みたいで、よくわからない。もう一度、ゼロからインストールをし直して、チュートリアルをやろうとしたが、チュートリアルは嫌だということ。

自分でゼロからやるということでゼロの画面を立ち上げて、開始というとこだけど、この辺で時間切れ( ノД`)シクシク…

次回までに何か作ってくるとのこと、、、取りあえずは期待しとこう。

年長のSくん

f:id:whomeantan:20210131153525j:plain

f:id:whomeantan:20210131153601j:plain

付き添いで見学ということだけど、iPadをお貸しして、ビスケットをやってもらった。

一つは練習という意味かな、さかな、たこ、ロケット?などなどが画面を動いていった。絵がきれいだねという声が聞こえた。なぜか、ビスケットの絵はきれいですね。

もう一つはクリックすると、いろんなものが出てくるというのを使って画面いっぱいにいろいろと出してくれた。赤と黒が目立ったので何色が好きかと聞くと黄色だそうでちょっと意外でした(^^♪

小4のYちゃん

f:id:whomeantan:20210131155055j:plain

f:id:whomeantan:20210131155111j:plain

Sくんのお姉ちゃん。 Scratchはほとんど初めてとのことでメクルンをお勧めした。メンターとして松田さんがSくんと一緒に見てもらった が、ほとんど、自分でやってたとのことだった。

メクルンの最初のサンプルで追いかけっこをやって、クマさんがハリネズミを追いかけるという形で、きれいにまとめてくれた。サブコースなどが残っていたが、今度にでもやったらどうだろう。

中1のRちゃん

f:id:whomeantan:20210131161754j:plain

f:id:whomeantan:20210131161824j:plain

前回、きれいなポスターを作って、何をするのだろうと思っていたが、ホームページを作るとのこと。本を買ってきてそれをもとに作っていくとのことだったが、一つ一つ覚えるよりもサンプルページを作った方がいいよということとエディタとしてVSCodeを勧めておいた。

調べるのもインターネットで探したりするのも慣れているようだったし、パソコン慣れもしているようだった。

結果、簡単なページを作って見せてくれた。

次回くらいから、段々とはっきりしたページを作ってくれるのかなと楽しみだった。

松成の報告

f:id:whomeantan:20210131173232j:plain

テキストプログラミングとして、Pythonがよくいわれるが、さて、何をすればいいかがわからない。昔、Pythonでかんたんなゲームをつくったが、ちょっと遅いなというのがその時の感想だった。

最近、pygame-zero, pygameといったライブラリ?を知ってテストしている。それなりに使えそうな気がして、4月からまた忍者募集をしようかと思っている。今回はシェルピンスキーの三角形をタートル・グラッフィック、Pygame-zero、Pygameの3種でやってみた。それぞれにちょっとずつ癖があるが、結構、わかりやすい。

集合写真

f:id:whomeantan:20210131165921j:plain

今日も一日、無事終了です。楽しかったかな?・・・(^^♪

次回の例会

次回は2月13日です。下記からお申し込みください。

tempaku.connpass.com

その前にオンラインですが、下記があります。よかったらこちらへも参加してみてください。

tempaku.connpass.com

tempaku.connpass.com

以上 

記録: 松成文夫

CoderDojo天白 N086

開催日時 2021年01月16日(土)13:30~15:30
開催場所 天白生涯学習センター 第2集会室

概要

2021年最初のDojoです。参加者は忍者は2家族4人、メンターは2名、保護者2名の8人で部屋の定員は20名とのことで3密を避けて、のんびりとした時間を過ごした。

今日の出し物はSiちゃんのレゴ。ロボットR2-D2でしょう。クリスマス・プレゼントに買ってもらったとか。。。

f:id:whomeantan:20210117143156j:plain

まずは、一つ一つの機能をボタンに設定して、メモ帳に記録しながら動かしていった。

f:id:whomeantan:20210117143457j:plain

全体の学習風景です。みんなそれぞれですが、、、次のようなことをやりました。   * プロセッシングでシェルピンスキの三角形

  • LegoR2-D2を動かす

  • scratchで迷路をつくる

  • Viscuitでシューティング・ゲームをつくる

といったことでした。

発表風景

今回は参加忍者が4名で自分の机で発表するには密になるかとも思い、Zoomの準備もしていたが、結局は従来通り、自分の机でやってもらった。

小3のMくん

f:id:whomeantan:20210117155440j:plain

年初でもあり、何か正月物をということで始めたが、気に入るものができなかったらしい。発表は前にも作った迷路ゲームだった。

f:id:whomeantan:20210117155639j:plain

右上のStartから左上のGoalまでの迷路だが、障害物があって難しい。右下にワープポイントがあってここへ来ると緑の円形の場所にワープする。

昔、やったことを思い出しながら作ったとのことでした。

小1のChiちゃん

f:id:whomeantan:20210117162838j:plain

何を作ろうかなと言いながら、正月の凧、こまなどを描いていった。

f:id:whomeantan:20210117163241j:plain

いろいろと増えた時点でメンターのアドバイスもあり、シューティング・ゲームになり、ボールが当たったら花火が出るというような作品になった。ゲームだよと言って、ゲームができたのが嬉しそうだった。

中1のSaちゃん

f:id:whomeantan:20210117163728j:plain

いつもコツコツと頑張っているSaちゃん。前回うまくいかなかったので、今回も書き直しで作っていった。

f:id:whomeantan:20210117164203j:plain

今回も途中までで終了。

ぼくも、次回までに作ってみるかな・・・

小2のSiちゃん

f:id:whomeantan:20210117165732j:plain

直進、回転、停止・・・などの機能ボタンを作ったり、直進性能を調べたり、、、、

落して直したり、、、

f:id:whomeantan:20210117171025j:plain

発表では簡単に直進をしてくれました(^^♪

発表主体より、作業が楽しいですね(^^♪

82歳の松成

f:id:whomeantan:20210117172018j:plain

Pythonがわかりやすく、若い人に取り付きやすいという声を聞くが、何をやるか、前に一つゲームをコピペで作ったが遅くて問題だった。

最近、pygamezeroというのを知り、それもMuで作るということでちょっとやってみた。

迷路ゲームとシューティング・ゲームをコピペだけど、実演した。今年はUnityを1年やったが、来年はPythonとホームページをやってみる予定。そんなPRを込めての発表をした。

集合写真

最後にいつものようにみんなで集合写真を撮りました。

f:id:whomeantan:20210117214445j:plain

また、次回、楽しくやっていこう!

次回

次回は1月30日に下記で行います。

tempaku.connpass.com

よかったら、参加してください(^^♪

記録: 松成文夫

CoderDojo天白 N085

開催日時 2020年12月26日(土)13:30~15:30
開催場所 天白生涯学習センター 第2集会室

概要

今日で本年最後のDojoでした。期せずして、孫の小学校の2学期最終日でもあった(^^♪。参加忍者は常連のNさん姉妹と久しぶりのTくん。メンターはいつもの松田さんと松成。保護者2名の参加だった。最後としてはちょっと寂しいが、ゆったりとした時間を過ごすことができた。

内容はScratch2名とプロセッシング1名。Scratchはメクルンを提案してみたが、やることを考えてきていて、Siちゃんは年賀状をTくんはマスクキャッチの続きで点数つけと音入れをする。Saちゃんはプロセッシングでテキストを使ってのジェネラティブ・アートでフラクタルの絵を描く予定。Saちゃんのやってることがわからなくなったので、マット・ピアソンのテキストを一冊やってみたが、Saちゃんのテキストはちょっと違ってるようだった。ジェネラティブといってももっといろんな見方があるのかな。

f:id:whomeantan:20201227145045j:plain

発表風景

発表は今回も自分の机で発表して貰った。

小2のSaちゃん

f:id:whomeantan:20201227145936j:plain

f:id:whomeantan:20201227150106j:plain

ハートのマークに Happy New Yearを描いて、ランダムな位置から、スタートボタンで整列するというアイデア。ペンで牛を描いたのが自慢だった。発表時に色も付けて、めでたし、めでたし。

前回のクリスマスカードに続いて、年賀状と、その時期の物を取り入れるのは基本かな。段々と動きを付けてもらえればいいけど。

中1のSaちゃん

f:id:whomeantan:20201227151641j:plain

f:id:whomeantan:20201227152704j:plain

プロセッシングでフラクタル図形を描くのだが、ちょっと、エラーが出て、それ以上進めなかった。テキストはこういう場合につらい。オール・オア・ナッシングになる。次回からZoomを取り入れて、マンツーマンで行なってみるかな。

小4のTくん

f:id:whomeantan:20201227154458j:plain

f:id:whomeantan:20201227154511j:plain

だいぶ、時間をかけてのマスクキャッチゲームです。マスクをを受け取ったら、色に応じてプラスの得点、ウイルスを捕まえたらマイナスの得点で十分ゲームができていた。ただ、受け手がマスクはおかしくないと言ったら、、、、普通に人間でいいのでないかな?

集合写真

f:id:whomeantan:20201227155821j:plain

カエルさん好きなNさんファミリーからカエルを受け取って、頭に乗せたTくん、みんなそれなりにというとこかな。1年間、ご苦労様でした。

次回のお知らせ

来年は1月16日がDojoはじめということになります。ちょっと、時間が空きますがよいお年をお迎えください。

あれこれ

お茶しての帰り、植田駅前の公園でクリスマスツリーがきれいに飾られていました。

f:id:whomeantan:20201227161326j:plain

記録作成 松成文夫