タートルに命令する
進む・曲がる,たった 2 つの命令から始めます.
プログラミングとは,コンピュータに「何を」「どの順番で」やらせるかを 書き並べる作業です.コンピュータは気を利かせてくれません.書いたとおりに, 書いた順番どおりに動きます.そのかわり,何万回でも文句を言わずに繰り返します.
最初の相手はタートル(かめ)です.画面にいるかめに 「前に進め」「右を向け」と命令すると,かめは通った跡に線を残します. たったこれだけの仕組みですが,命令の並べ方しだいで驚くほど複雑な絵が描けます.
いまは,経路検索も翻訳も集計も,コンピュータが一瞬で片付けてくれます. ただしコンピュータは,自分から気を利かせて何かをしてくれるわけではありません. どんな情報を,どういう手順で扱うのかを, あらかじめ人間が書いて渡しておく必要があります.
その「書いて渡すもの」がプログラムです. プログラミングを学ぶというのは, コンピュータに仕事のやり方を説明できるようになるということです.
- 右側のコード欄でプログラムを実行し,結果を確かめられる
fd・bk・lt・rtを使って,思ったとおりの図形が描ける- 正多角形を描くときの角度を自分で計算できる
- ペンの上げ下げと色・太さを使い分けられる
- プログラムの記号の読み方がわかり,全角文字の混入を自分で直せる
- プログラムの流れには順次・分岐・反復の 3 つしかないことを説明できる
- エラーの読み方と,バグの見つけ方の手順がわかる
Ctrl + Enter)を押すだけです.
- 右下は「タートル画面」と「コンソール」のタブに分かれています.絵は「タートル画面」,
printの結果とエラーは「コンソール」に出ます. - 書きかけのコードはブラウザが覚えているので,ページを閉じても消えません.元に戻したいときは「↺ 最初から」を押します.
- 真ん中の細い縦線・横線はドラッグすると動かせます.コード欄を広げたいときに使ってください.
- 上の「教材」「コード」の
A- A A+で,文字の大きさを別々に変えられます. - タートル画面のタブの右に「画面
-620 × 460+」があります.これはかめが動ける範囲そのものの大きさです.+を押すと画面が広くなり,プログラムはその場で動かし直されます.広い画面に入りきらないところは,スクロールバーで見てください.真ん中の数字を押すと,もとの大きさに戻ります.
2.1 まずは動かしてみる
最初のプログラムです.右側で開いて,実行してみてください.
print("こんにちは")
print(1 + 2)
右下の「コンソール」に こんにちは と 3 が出れば成功です.
print は「書き出す」という命令で,かっこの中に書いたものを表示します.
文字は "(ダブルクォート)で囲み,数はそのまま書きます.
1 + 2 が 3 になったように,かっこの中では計算もできます.
右側の中身を書き換えて,もう一度実行してみましょう.自分の名前を表示させたり,
1 + 2 を 7 * 8 に変えたりしてください(* はかけ算です).
print("こんにちは") は,人間に読める言葉です.
ところがコンピュータの中身が直接あつかえるのは,
0 と 1 だけで書かれた命令(機械語)だけです.
ですから,人間の書いたプログラムは,必ずどこかで翻訳されています.
翻訳のやり方には,大きく 2 つあります.
| 方式 | やり方 | たとえるなら | 例 |
|---|---|---|---|
| コンパイル方式 | 実行する前に,プログラム全体をまとめて機械語に翻訳しておく.翻訳する作業をコンパイルという | 本を先に全部翻訳して,翻訳版を読む | C,C++,Java |
| インタープリタ方式 | プログラムを上から 1 行ずつ翻訳しながら,そのつど実行していく | 通訳者が横について,1 文ずつ訳してくれる | Python,JavaScript |
Python はインタープリタ方式です. 第 1 章で「どの Python で動くかを確かめる」という作業をしましたが, あれはこの通訳役の本体をどれにするかを決めていたのです.
方式の違いは,間違えたときの現れ方にも出ます. コンパイル方式なら,翻訳の段階で間違いが見つかるので,1 行も実行されません. インタープリタ方式の Python は,間違いのある行まで来て初めて止まります. つまり途中までは動いてしまうことがあるわけです. この様子は 2.7.2 項で実際に見ます.
2.2 プログラムの決まりごと
ここからが本題です.いきなり完成品を見てみましょう.家を描くプログラムです. 開いて実行してください.
# 家を描くプログラム from turtle import * # 屋根を描く lt(60) fd(100) rt(120) fd(100) rt(120) fd(100) # 本体(かべ)を描く lt(90) fd(100) lt(90) fd(100) lt(90) fd(100) lt(90) fd(100) done()
「速さ」を「とてもゆっくり」にして,もう一度実行してみてください. かめが 1 本ずつ線を引いていく様子が見えます.プログラムが 上から順に実行されていることが目で確かめられます.
2.2.1 プログラムは何でできているか
いま見たような,文字で書き並べたプログラムのことを ソースコードといいます.短くコードとも呼びます. この教材で「コード欄」と言っているのは,ソースコードを書く場所のことです.
このソースコードは,次の要素からできています.
| 要素 | 説明 |
|---|---|
from turtle import * | 道具箱を開ける命令.Python には最初から多くの道具が用意されていますが,使う前に「この箱を開けます」と宣言します.これを書かないと fd も lt も「そんな名前は知りません」と言われます. |
fd(100) | 命令.かめへの指示です.かっこの中の数を引数(ひきすう)といい,「どれだけ」を指定します. |
# 屋根を描く | コメント.# から行末まではコンピュータに無視されます. |
done() | 「ここでおしまい」の合図.引数がないので,かっこの中は空です. |
| 空行 | 意味のまとまりを区切るために入れます.あってもなくても動きは変わりません. |
2.2.2 命令の区切りは「改行」
Python では,1 行に 1 つの命令を書きます.
行を変えることが「ここで命令がひとつ終わり」という合図です.
行末に ;(セミコロン)のような記号は要りません.
fd(100) lt(90)
どうしても 1 行にまとめたいときは fd(100); lt(90) と書けますが,
読みにくくなるので,この教材では使いません.
2.2.3 コメントの書き方
コメントは人間のために書きます.コンピュータは読み飛ばしますが, 数日後の自分は必ず読みます. 「何をしているか」ではなく「なぜそうしているか」を書くと役に立ちます.
# これは行コメント.行末まで無視される fd(100) # 命令の後ろに書いてもよい """ 3 つ並べたダブルクォートで囲むと 何行でもまとめて書ける(ファイルの先頭の説明に使う) """
コメントにはもう一つ使い道があります.
いまは実行させたくない行の先頭に # を付けて,
一時的に無効にすることです.これをコメントアウトといいます.
消してしまうと書き直すのが面倒ですが,コメントアウトしておけば
# を外すだけで元に戻せます.
うまく動かない原因を探すときの常とう手段です(2.7.5 項).
2.2.4 行の先頭の空白には意味がある
Python では,行の先頭の空白(インデント)が文法の一部です. 意味もなく字下げするとエラーになります.
fd(100)
lt(90) ← いきなり字下げするとエラー
第 5 章以降,「ここからここまでが 1 つのかたまり」を表すために字下げを使います. 今回はすべての行を左端から書いてください.
2.2.5 記号の読み方
プログラムでは,ふだんの文章ではあまり使わない記号が次々に出てきます. 名前を知らない記号は,覚えることも質問することもできません. 先に読み方を押さえておきましょう.
| 記号 | 読み方 | 役割 |
|---|---|---|
# | シャープ/ハッシュ | コメント.ここから行末までは無視される |
" | ダブルクォート | 文字列を囲む."こんにちは" |
' | シングルクォート | 同じく文字列を囲む.この教材では " に統一します |
( ) | かっこ(丸かっこ) | 命令に渡すものを囲む.計算の順番を変えるときにも使う |
, | カンマ | 渡すものが 2 つ以上あるときの区切り.goto(100, 50) |
. | ピリオド/ドット | 小数点.「〜の中の〜」を表すときにも使う(第 3 章 random.randint) |
_ | アンダースコア/アンダーバー | 名前の中で単語を区切る.right_angle(第 3 章) |
* | アスタリスク | かけ算.from turtle import * の「全部」の意味でも使う |
/ | スラッシュ | 割り算 |
% | パーセント | 割り算の余り(第 3 章) |
= | イコール | 「等しい」ではなく代入(第 3 章) |
: | コロン | 「ここからかたまりが始まる」の合図(第 5 章・第 6 章) |
; | セミコロン | 1 行に複数の命令を書く区切り.この教材では使いません |
[ ] | 角かっこ/ブラケット | ものを並べるときに使う(第 16 章) |
{ } | 波かっこ/ブレース | f 文字列の差し込み口(第 3 章).辞書(第 18 章) |
(),” のような
全角の記号になってしまい,見た目は似ていてもエラーになります.
コードを書くときは必ず半角入力モードにしてください.
- 日本語キーボードでは,上の段の記号は
Shiftを押しながら打ちます.たとえば(はShift+8,"はShift+2です. _はShift+ろ(右下のキー)です.最初はまず見つからないので,いま一度押して確かめておいてください.
2.2.6 プログラムの流れは 3 つしかない
ここで一度,全体の見取り図を見せておきます. 世の中のプログラムは,どんなに大きく複雑なものでも, たった 3 つの流れの形の組み合わせでできています.
| 流れの形 | どういう形か | 身のまわりの例 | 習う回 |
|---|---|---|---|
| 順次(じゅんじ) | 上から下へ,書いた順に 1 つずつ実行していく | 料理のレシピ.手順どおりに進める | 今回 |
| 分岐(ぶんき) | 条件によって,進む道が分かれる | 雨なら傘を持つ.晴れなら持たない | 第 5 章 |
| 反復(はんぷく) | 決まったところを,何度もぐるぐる回る | ラジオ体操を 2 回繰り返す | 第 6 章 |
今回使うのは順次だけです. 家のプログラムが上から順に実行されたのも,これが順次の形だからです. ですから今回は,やりたいことを全部,順番に書き並べることになります. 同じ行が何度も並んで面倒に感じるはずですが,それでかまいません.
2.3 かめに出す基本の命令
2.3.1 進む — fd と bk
fd は forward(前へ),bk は back(後ろへ)の略です.
どちらも向きは変わりません.bk はかめが後ずさりします.
fd(100)bk(100) 向きはそのまま2.3.2 回る — lt と rt
lt は left(左へ),rt は right(右へ)の略です.
かっこの中には回る角度を書きます.
ここが初めのうちに間違えやすいところです.角度は
「どちらの方角を向くか」ではなく「その場で何度回るか」を表します.
lt(90)rt(90)lt(45)lt(90) を 2 回続けて書けば,合計 180 度回ることになります.
次のプログラムで角度を変えながら確かめてください.
from turtle import * fd(80) lt(120) # ここの数を変えてみる fd(80) done()
lt(120) の場合.次のプログラムは,右へ 120 進んでから上へ 80 進んで L 字を描くものです. ____ を埋めて完成させてください. 上を向くには,左と右のどちらへ何度回ればよいでしょうか.
from turtle import * pensize(3) fd(120) ____(90) fd(____) done()
2.3.3 ペンを上げる・下ろす
かめはペンを持っていて,進むと線を引きます.pu()(pen up)でペンを上げると,
進んでも線が引かれません.離れた場所に描きたいときに使います.
pd()(pen down)で下ろすと,また線を引くようになります.
from turtle import * fd(60) pu() # ペンを上げる fd(40) # ここは線が引かれない pd() # ペンを下ろす fd(60) done()
pu() と pd() の間は跡が残らない.2.3.4 色と太さ
pencolor で線の色,pensize で太さを変えます.
どちらもそれ以降に描く線に効きます.すでに描いた線は変わりません.
from turtle import *
pensize(6)
pencolor("red")
fd(80)
lt(120)
pencolor("green")
fd(80)
lt(120)
pencolor("blue")
fd(80)
lt(120)
done()
red blue green yellow
orange purple pink brown
black white gray cyan
magenta navy gold など多数あります.
"#ff8800" のように 16 進数で細かく指定することもできます
(赤・緑・青の強さを 00〜ff で並べた書き方です).
2.3.5 かめの初期位置と向き
プログラムを始めたとき,かめは画面の中央にいて,
右(東)を向いています.だから最初に fd と書くと右へ進みます.
画面には座標があり,中央が (0, 0),右が x の正の向き, 上が y の正の向きです.数学のグラフと同じ向きで,画面の座標としては 上下が逆(下向きが正)になっていない点に注意してください.
2.4 閉じた図形を描く
2.4.1 正方形 — 閉じた図形の考え方
「進む」と「曲がる」を交互に並べると,閉じた図形になります. 正方形なら 90 度ずつ 4 回曲がれば,元の位置・元の向きに戻ります.
from turtle import * fd(100) lt(90) fd(100) lt(90) fd(100) lt(90) fd(100) lt(90) done()
lt(90) で向きも元どおりになる.lt(90) は,図の形だけを見れば無くても同じです.
しかし向きが元に戻っていないと,続けて何かを描くときに必ず混乱します.
「描き終わったら,始めた状態に戻す」と決めておくと,
図形を組み合わせるときに楽になります.後の回で「関数」を習うと,この約束が効いてきます.
横 160・縦 80 の長方形を描きます. 4 つの ____ を埋めてください. 長方形も「1 周で 360 度」は変わりません.
from turtle import *
pensize(2)
pencolor("seagreen")
fd(160)
lt(90)
fd(____)
lt(90)
fd(____)
lt(____)
fd(____)
lt(90)
done()
2.4.2 正多角形と「外角」
正五角形では何度曲がればよいでしょうか.内角(108 度)ではありません. かめが曲がるのは外角です.
考え方はとても簡単です.図形を 1 周してもとの向きに戻るということは, かめは全部で 360 度回ったということです. 角が n 個あるなら,1 か所あたり 360 ÷ n 度回ればよい.
| 図形 | 角の数 n | 1 回に曲がる角度 (360÷n) |
|---|---|---|
| 正三角形 | 3 | 120 度 |
| 正方形 | 4 | 90 度 |
| 正五角形 | 5 | 72 度 |
| 正六角形 | 6 | 60 度 |
| 正八角形 | 8 | 45 度 |
| 正十二角形 | 12 | 30 度 |
lt(18) や lt(30) が付いているのは,
図形をまっすぐ座らせるためです(底辺を水平にする).
無くても同じ形が描けますが,少し傾きます.試してみてください.
1 辺 40 の正十角形を描きます.曲がる角度を自分で計算して, 10 か所の ____ を埋めてください. 360 を角の数で割るのでしたね.
from turtle import *
pensize(2)
pencolor("indigo")
fd(40)
rt(____)
fd(40)
rt(____)
fd(40)
rt(____)
fd(40)
rt(____)
fd(40)
rt(____)
fd(40)
rt(____)
fd(40)
rt(____)
fd(40)
rt(____)
fd(40)
rt(____)
fd(40)
rt(____)
done()
2.4.3 星はなぜ 144 度なのか
星(五芒星)は,1 周ではなく2 周しながら描く図形です. 5 か所で合計 720 度回るので,1 か所あたり 720 ÷ 5 = 144 度になります.
from turtle import *
pensize(3)
pencolor("gold")
fd(150)
rt(144)
fd(150)
rt(144)
fd(150)
rt(144)
fd(150)
rt(144)
fd(150)
rt(144)
done()
2.5 曲線を描く
かめは直線しか引けません.では円はどうやって描くのでしょうか. 答えは「ごく短い直線を,少しずつ向きを変えながらつなぐ」です.
from turtle import * # 右まわりの円弧 rt(5) fd(5) rt(5) fd(5) rt(5) fd(5) rt(5) fd(5) rt(5) fd(5) rt(5) fd(5) rt(5) fd(5) rt(5) fd(5) rt(5) fd(5) rt(5) fd(5) # 左まわりの円弧 lt(5) fd(5) lt(5) fd(5) lt(5) fd(5) lt(5) fd(5) lt(5) fd(5) lt(5) fd(5) lt(5) fd(5) lt(5) fd(5) lt(5) fd(5) done()
やってみよう:角度と長さを小さくすると,もっとなめらかになります.
rt(2) と fd(2) にしたらどうなるでしょうか.
逆に rt(20),fd(20) にすると何が起きるでしょうか.
rt(5); fd(5) を 72 回繰り返せば,ちょうど 1 周して円になります
(5 度 × 72 = 360 度).つまり円の正体は正 72 角形です.
ただし 72 回も書くのは大変です.第 6 章で習う「繰り返し」を使うと 3 行で書けます.
ちょうど 90 度ぶんの弧を描きます.
rt(10) と fd(12) の組を何回繰り返せばよいでしょうか.
必要な回数だけ行を増やし,____ を埋めてください.
rt(10) と fd(12) を書き足してください.
from turtle import *
pensize(3)
pencolor("darkcyan")
rt(____)
fd(12)
rt(10)
fd(12)
rt(10)
fd(12)
# ここから下に必要なだけ書き足す
done()
2.6 描き始める位置を変える
かめは必ず中央から始まります.別の場所から描き始めたいときは, ペンを上げて移動してから,ペンを下ろすのが基本です.
pu() # ペンを上げて bk(100) # 左へ 100 下がって pd() # ペンを下ろす
行き先の座標がわかっているなら,goto(x, y) で一気に移動できます.
home() と書けば,中央・右向きの最初の状態に戻ります.
from turtle import * pensize(2) # 左の正方形 pu() goto(-180, -40) pd() fd(80) lt(90) fd(80) lt(90) fd(80) lt(90) fd(80) lt(90) # 中央の正方形 pu() goto(-40, -40) pd() fd(80) lt(90) fd(80) lt(90) fd(80) lt(90) fd(80) lt(90) # 右の正方形 pu() goto(100, -40) pd() fd(80) lt(90) fd(80) lt(90) fd(80) lt(90) fd(80) lt(90) done()
goto で場所を変えながら同じ図形を描く.画面の 4 すみの近くに,色の違う点を打ちます.
座標を考えて ____ を埋めてください.
画面は横 620・縦 460 なので,中央から見て右端は x が約 300,
上端は y が約 210 です.dot(20) はその場に直径 20 の点を打つ命令です.
from turtle import *
ht()
pu()
goto(-250, 180)
pencolor("crimson")
dot(20)
goto(____, 180)
pencolor("royalblue")
dot(20)
goto(-250, ____)
pencolor("seagreen")
dot(20)
goto(____, ____)
pencolor("darkorange")
dot(20)
done()
2.7 エラーの読み方と直し方
プログラムは,最初から思いどおりに動くことのほうが稀です. プロでも同じです.大切なのは間違いを早く見つけて直せることで, 一発で当てることではありません.
2.7.1 文法の間違い(SyntaxError)
書き方そのものが Python の決まりに合っていないと, 1 行も実行されずに止まります. 次のプログラムはかっこが閉じていません.開いて実行し,エラーを見てください.
from turtle import * fd(100 lt(90) fd(100) done()
SyntaxError と表示されます.「文法(syntax)の誤り」という意味です.
示された行に間違いが見当たらないときは,その 1 つ上の行を疑ってください.
かっこの閉じ忘れは,次の行まで読んで初めて「おかしい」と気づかれるためです.
2.7.2 名前の間違い(NameError)
次は,書き方は正しいけれど,そんな名前の命令が無い場合です.
from turtle import * fd(100) LT(90) fd(100) done()
4 行目: NameError: name 'LT' is not defined と出ます.
「4 行目の LT という名前は知りません」という意味です.
Python は大文字と小文字を区別するので,lt に直せば動きます.
この種のエラーは途中まで実行されてから止まります.
実際,タートル画面には最初の fd(100) の線が残っているはずです.
どこまで描けているかを見れば,どこで止まったかがわかります.
2.7.3 目に見えない間違い(全角文字)
いちばんたちが悪いのが,全角文字の混入です. 日本語入力のまま打ってしまったときに起こります. 次のプログラムには 2 か所しかけてあります.開いて実行し,直してみてください.
from turtle import *
pensize(3)
pencolor("crimson”)
fd(100)
lt(90)
fd(100)
done()
まず SyntaxError: invalid non-printable character U+3000 と出ます.
U+3000 は全角スペースのことです.
3 行目の pensize(3) の前に,見えない全角スペースが 1 つ入っています.
行の先頭にカーソルを置いて Backspace で消してください.
字下げのつもりが無くても,全角スペースがあれば文字として扱われます.
直すと,今度は
SyntaxError: unterminated string literal(文字列が閉じられていない)が出ます.
4 行目の閉じ側が ”(全角)になっているためです.
半角の " に打ち直せば,赤い線が引かれます.
2.7.4 初めのうちに多い間違い
| 症状 | 原因と直し方 |
|---|---|
SyntaxError: invalid non-printable character | 全角スペースが混じっている.見えないので,その行を全部打ち直すのが速い |
SyntaxError: invalid character | 全角の記号が混じっている.(),;は使えない.半角に直す |
SyntaxError: unterminated string literal | " の閉じ忘れ,または閉じ側が全角の ” になっている |
NameError | 命令の綴りか大文字・小文字の間違い.fd を FD や fw と書いていないか.pencolor を pencolour と書く間違いも多い |
IndentationError | 行の先頭に余計な空白がある.今回は全部の行を左端から書く |
NameError: name 'fd' is not defined | 1 行目の from turtle import * を書き忘れている |
| エラーは出ないが形が変 | バグ.角度か長さの数が思っているものと違う.2.7.5 項へ |
2.7.5 バグを見つける手順
エラーが出ないのに思ったとおりの形にならないことをバグといい, それを直すことをデバッグといいます. コンピュータは必ず命令したとおりに動きます. つまりバグは,コンピュータではなく命令した側の間違いです.
- 速さを「とてもゆっくり」にして実行する.かめがどこで思っていない方向に曲がったかを目で追う.これが一番速い.
- 途中まで消す.怪しいところより後ろを全部コメントにして(各行の先頭に
#を付けて),そこまでは正しいかを確かめる. - 紙に描いてみる.かめの気持ちになって,自分の体の向きを変えながらたどってみると,角度の間違いはすぐ見つかる.
- 少しずつ書いて,そのつど実行する.20 行書いてから実行すると,間違いが 20 行のどこにあるかわからない.2〜3 行書いては実行する人のほうが,結果的にずっと速い.
print は,デバッグの道具としても使えます.
たとえば print(xcor(), ycor()) と書けば,
その時点のかめの座標がコンソールに出ます.
「思っている場所に本当にいるのか」を確かめられます.
2.8 この章で出てきた命令
| 命令 | 意味 |
|---|---|
from turtle import * | タートルの命令を使えるようにする(1 行目に書く) |
fd(長さ) | 前へ進む(forward).forward(長さ) とも書ける |
bk(長さ) | 後ろへ下がる(back).向きは変わらない |
lt(角度) | 左へ回る(left).その場で向きだけ変える |
rt(角度) | 右へ回る(right) |
pu() | ペンを上げる(pen up).進んでも線が残らない |
pd() | ペンを下ろす(pen down) |
goto(x, y) | 指定した座標へ移動する.中央が (0, 0) |
home() | 中央・右向きの最初の状態に戻る |
pencolor(色) | 線の色を変える.例 pencolor("red") |
pensize(太さ) | 線の太さを変える |
ht() | かめの姿を隠す(hide turtle).仕上げに使う |
write(文字) | その位置に文字を書く |
print(…) | コンソールに書き出す |
done() | プログラムの終わり |
演習
____ の部分だけを埋める短い練習です.
まだ埋め残しがある状態で実行すると,その旨を知らせて止まります.
ここから先は,出発点のプログラムを自分で伸ばしていく課題です.
以下の演習には,出発点となるプログラムが入っています. 「▶ この演習を開く」で右側に読み込み,それを発展させて作品にしてください. できあがったら「⤓ 保存」でファイルに保存して,手元に残しておきましょう.
正五角形を描くプログラムを与えます.これを参考に,
大きさの違う 2 つ以上の正五角形を組み合わせて模様を描いてください.
どんな模様でもかまいません.位置をずらすには pu() と
goto() を使います.
- 出発点の正五角形(1 辺 100)に加えて,1 辺の長さが違う正五角形を 2 つ以上描く(例:1 辺 60 と 1 辺 30).
- 正五角形ごとに
pencolorで色を変える(全部で 3 色以上). - これもやりましょう:出発点と同じ 1 辺 100 の正五角形を,
rt(72)をすべてlt(72)に変えて,同じ点からもう 1 つ描く.最初の辺を共有して2 つの五角形が隣り合うはずです.なぜそうなるのかを,コメントに 1 行で書く. - 仕上げに
ht()でかめを隠す.
必須(すべて満たして正しく動けば 8)
- 1 辺 100 の正五角形と,1 辺の長さが違う正五角形が 2 つ以上描かれている
- 正五角形ごとに色が変わっている(3 色以上)
lt(72)で描いた 1 辺 100 の正五角形が,最初の辺を共有して隣に描かれている- 隣り合う理由がコメントに書かれ,最後に
ht()がある
発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)
- 隣り合う五角形をさらに増やし,五角形で花やボールのような模様にする
pensizeも変えて,線の太さで遠近感を出すwriteで作品名を画面に書き入れる
必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6
正六角形を描くプログラムを与えます. 大きさの違う 2 つ以上の正六角形で模様を描いてください. 六角形は敷き詰めることができます(蜂の巣を思い出してください). 並べてみるのも面白いでしょう.
- 出発点の正六角形(1 辺 80)に加えて,1 辺の長さが違う正六角形を 1 つ以上描く(例:1 辺 40 を
goto(120, 0)から). - 正六角形ごとに
pencolorで色を変える. - これもやりましょう:1 辺 80 の正六角形の中心と 6 つの頂点を線で結び,6 つの正三角形に分ける.中心から頂点までの距離は 1 辺と同じ 80 です.描き始めの頂点に戻ったとき,中心は進む向きから右へ 60 度回った方向に 80 進んだところにあります.中心に着いたら,
fd(80)で頂点へ行きbk(80)で戻る,を向きを変えながら 6 回くり返します(何度ずつ回すかは自分で考える). - 仕上げに
ht()でかめを隠す.
必須(すべて満たして正しく動けば 8)
- 1 辺 80 の正六角形と,1 辺の長さが違う正六角形が 1 つ以上描かれている
- 正六角形ごとに色が変わっている
- 1 辺 80 の正六角形の中心と 6 つの頂点が線で結ばれ,6 つの正三角形に分かれている
- 最後に
ht()があり,かめが隠れている
発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)
- 辺を共有させて正六角形を 3 つ以上並べ,蜂の巣のように敷き詰める
- 小さい正六角形にも中心からの線を引き,大小で色を分ける
dot()で中心や頂点に点を打って飾る
必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6
正八角形を描くプログラムを与えます. 大きさの違う 2 つ以上の正八角形で模様を描いてください. 少しずつ回しながら重ねると,花のような模様になります.
- 出発点の正八角形(1 辺 60)に加えて,1 辺の長さが違う正八角形を 1 つ以上描く(例:同じ点から 1 辺 30).
- 正八角形ごとに
pencolorで色を変える. - これもやりましょう:
goto(150, 0)の点から,1 辺 40 の正八角形を同じ点から 4 つ描いて花の形にする.1 つ描き終えるたびにlt()で向きを変え,4 つでちょうど 1 周(360 度)になるようにする(何度回すかは自分で計算し,コメントに書く). - 仕上げに
ht()でかめを隠す.
必須(すべて満たして正しく動けば 8)
- 1 辺 60 の正八角形と,1 辺の長さが違う正八角形が 1 つ以上描かれている
- 正八角形ごとに色が変わっている
goto(150, 0)の点から 1 辺 40 の正八角形が 4 つ,向きを等しくずらして描かれている- 回す角度(360 ÷ 4 = 90 度)がコメントに書かれ,最後に
ht()がある
発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)
- 重ねる数を 6 つや 8 つに増やし,そのときの角度も計算して花を細かくする
- 花びらごとに色を変える
- 花の中心に
dot()で花芯を描き,茎や葉を描き足す
必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6
星を描くプログラムを与えます. 大きさの違う 2 つ以上の星で模様を描いてください. 色を変えたり,向きを変えて重ねたりしてみましょう.
- 出発点の星(1 辺 140)に加えて,1 辺の長さが違う星を 2 つ以上,
pu()とgoto()で重ならない位置に描く(例:goto(-220, 120)から 1 辺 70,goto(-200, -80)から 1 辺 40). - 星ごとに
pencolorで色を変える. - これもやりましょう:1 辺 140 の星の5 つのとがった先すべてに,
dot(15)で直径 15 の点を打つ.かめがとがった先に着くのは,どの命令のすぐあとかを考えてから書き足す. - 仕上げに
ht()でかめを隠す.
必須(すべて満たして正しく動けば 8)
- 1 辺 140 の星と,1 辺の長さが違う星が 2 つ以上,重ならずに描かれている
- 星ごとに色が変わっている
- 1 辺 140 の星の 5 つのとがった先すべてに直径 15 の点がある(点は 5 つだけ)
- 最後に
ht()があり,かめが隠れている
発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)
- 向きを変えた星を重ねて,光っているような模様にする
- 点の色を星の線と変える(
dotの前後でpencolorを切り替える) - 夜空の背景として小さな星や
dotの星くずを散らす
必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6
「こんぺいとう」を描くプログラムを与えます.
fd(25) → rt(90) → fd(25) → lt(45) の繰り返しでとげを作っています.
この考え方をもとに,とげの数や長さを変えて,別の形に発展させてください.
- 出発点と同じこんぺいとう(とげ 8 本・長さ 25)を,
goto(-180, 60)から描く. - とげの長さを 40 に変えたこんぺいとう(とげ 8 本)を,
goto(30, 80)から描く. - これもやりましょう:とげを 6 本にしたこんぺいとう(長さ 25)を,
goto(220, 40)から描く.fd(25) → rt(90) → fd(25) → lt(□)の □ を考えてください.8 本のときは,とげ 1 本で右へ 90 − 45 = 45 度向きが変わり,8 本で 360 度(1 周)になって閉じます.6 本で 1 周するには,とげ 1 本で何度変わればよいでしょうか(考え方をコメントに書く). - 3 つのこんぺいとうを違う色にし,仕上げに
ht()でかめを隠す.
必須(すべて満たして正しく動けば 8)
- とげ 8 本・長さ 25 のこんぺいとうが
goto(-180, 60)から描かれている - とげ 8 本・長さ 40 のこんぺいとうが
goto(30, 80)から描かれている - とげ 6 本(
lt(30))のこんぺいとうがgoto(220, 40)から描かれ,形が閉じている - □ の求め方がコメントに書かれ,3 つの色が違い,最後に
ht()がある
発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)
- とげ 12 本や 4 本など,ほかの本数でも □ を計算して描く
rt(90)の角度も変えて,とげのとがり方を変える- こんぺいとうを入れる袋やびんの絵を描き足す
必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6
正三角形を組み合わせた「トライフォース」を描くプログラムを与えます. 三角形の中に三角形が入った形です. 段数を増やしたり,色を塗り分けたりして発展させてください.
- 段数を増やす:出発点と同じ 1 辺 120 のトライフォースを,描き始めの位置を
goto(-90, -50)・goto(30, -50)・goto(-30, 54)にして3 つ描き,1 辺 240 の大きなトライフォース(2 段)にする. - 出発点の命令で描き終えたとき,かめは右向きではありません.次のトライフォースを描く前に,何度回せば最初の右向きに戻るかを考えて回す(考え方をコメントに書く).
- 3 つのトライフォースを違う色にする.
- これもやりましょう:最後に,大きなトライフォースの外側を1 辺 240 の正三角形でなぞる.左下の頂点
goto(-120, -102)から右向きに描き始め,pensize(5)の太い線にする.仕上げにht()でかめを隠す.
必須(すべて満たして正しく動けば 8)
- 1 辺 120 のトライフォースが指定の 3 か所に描かれ,1 辺 240 の 2 段のトライフォースになっている
- 2 つ目・3 つ目が傾かずに描けている(右向きに戻す回転と,その考え方のコメントがある)
- 3 つのトライフォースの色が違う
- 外側が 1 辺 240・太さ 5 の正三角形でなぞられ,最後に
ht()がある
発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)
- 1 辺 60 のトライフォースを 9 つ使って 3 段にする(描き始めの位置は自分で計算する)
- まん中の逆三角形のすき間に
writeで文字を書いたり,dotで飾ったりする - 背景に盾や枠の模様を描き足して紋章のようにする
必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6
ここまでの命令だけを使って,好きな絵を描いてください. 自分の名前の頭文字,家,旗,ロボット,キャラクター — 何でもかまいません.
- 色(
pencolor)と太さ(pensize)を必ず使うこと pu()とpd()で,離れた部分も描くこと- 先頭にコメントで,題名・氏名・日付を書くこと
- 仕上げに
ht()を入れると,かめが消えて作品らしくなる
必須(すべて満たして正しく動けば 8)
pencolorとpensizeを使っているpu()とpd()で,離れた部分も描いている- 先頭のコメントに題名・氏名・日付がある
- エラーなく最後まで動き,何を描いたかが見て分かる
発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)
- 曲線(2.5 節)や
dot・writeを取り入れて表現を豊かにする - 部品ごとにコメントを付けて,どこで何を描いているかが読んで分かる
- 色や太さを部品ごとに使い分け,作品として完成度を高める
必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6
まとめ
- プログラムの流れの形は順次・分岐・反復の 3 つだけ.今回使ったのは順次で,プログラムは上から順に実行される.
fdで進み,lt・rtで向きを変える.この 2 つだけで図形が描ける.- 角度は「その場で何度回るか」.閉じた図形を 1 周すると合計 360 度になるので,正 n 角形の角度は 360 ÷ n.
- 曲線は,短い直線を少しずつ曲げてつないだもの(ディジタル表現).
- 描き始める位置を変えるときは
pu()→ 移動 →pd(). - エラーは行番号と種類を読む.とくに多いのは全角文字の混入.半角入力モードで書くこと.形がおかしいときは速度を落とし,少しずつ書いて確かめる.
次の回では,「100」のような数に名前をつけて覚えさせる変数を習います. 家の大きさを 1 か所変えるだけで全体が拡大・縮小できるようになります.
復習:虫食いで確かめる
コードの ____ を埋めてください.実行前に結果を予測し,実行後に問題文の条件と照合しましょう.assert は条件が成り立つかを調べ,成り立たないとエラーになります.
使う書き方:backward(距離) は,向きを変えずに後ろへ進む命令です.forward(距離) と同じ距離を指定すると元の位置へ戻ります.
60進んだあと,同じ距離だけ後退します.かめが出発点へ戻る命令を補ってください.
from turtle import * forward(60) ____(60) done()