タートルグラフィックスで学ぶ Python のキホン 第 2 章
教材コード
第 2 章

タートルに命令する

進む・曲がる,たった 2 つの命令から始めます.

プログラミングとは,コンピュータに「何を」「どの順番で」やらせるかを 書き並べる作業です.コンピュータは気を利かせてくれません.書いたとおりに, 書いた順番どおりに動きます.そのかわり,何万回でも文句を言わずに繰り返します.

最初の相手はタートル(かめ)です.画面にいるかめに 「前に進め」「右を向け」と命令すると,かめは通った跡に線を残します. たったこれだけの仕組みですが,命令の並べ方しだいで驚くほど複雑な絵が描けます.

コラム:コンピュータが無かったころ コンピュータが身近になる前,調べものは人の手でやるものでした. 電車の乗り継ぎは時刻表を何ページもめくって突き合わせ,言葉の意味は辞書を引き, 店の売り上げはそろばんや電卓で一件ずつ足していました. 情報を集め,整理し,役に立つ形に作り変える作業を 情報処理といいます.昔はこれを全部,人がやっていたわけです.

いまは,経路検索も翻訳も集計も,コンピュータが一瞬で片付けてくれます. ただしコンピュータは,自分から気を利かせて何かをしてくれるわけではありません. どんな情報を,どういう手順で扱うのかを, あらかじめ人間が書いて渡しておく必要があります.

その「書いて渡すもの」がプログラムです. プログラミングを学ぶというのは, コンピュータに仕事のやり方を説明できるようになるということです.

この章でできるようになること
  • 右側のコード欄でプログラムを実行し,結果を確かめられる
  • fd・bk・lt・rt を使って,思ったとおりの図形が描ける
  • 正多角形を描くときの角度を自分で計算できる
  • ペンの上げ下げと色・太さを使い分けられる
  • プログラムの記号の読み方がわかり,全角文字の混入を自分で直せる
  • プログラムの流れには順次・分岐・反復の 3 つしかないことを説明できる
  • エラーの読み方と,バグの見つけ方の手順がわかる
画面の使い方 この画面は 3 つに分かれています.左が教材,右上がコード,右下が実行結果です. 本文の中にある「▶ 演習環境で開く」を押すと,そのプログラムが右上に読み込まれます. あとは「▶ 実行」(Ctrl + Enter)を押すだけです.
  • 右下は「タートル画面」と「コンソール」のタブに分かれています.絵は「タートル画面」,print の結果とエラーは「コンソール」に出ます.
  • 書きかけのコードはブラウザが覚えているので,ページを閉じても消えません.元に戻したいときは「↺ 最初から」を押します.
  • 真ん中の細い縦線・横線はドラッグすると動かせます.コード欄を広げたいときに使ってください.
  • 上の「教材」「コード」の A- A A+ で,文字の大きさを別々に変えられます.
  • タートル画面のタブの右に「画面 - 620 × 460 +」があります.これはかめが動ける範囲そのものの大きさです.+ を押すと画面が広くなり,プログラムはその場で動かし直されます.広い画面に入りきらないところは,スクロールバーで見てください.真ん中の数字を押すと,もとの大きさに戻ります.

2.1 まずは動かしてみる

最初のプログラムです.右側で開いて,実行してみてください.

hello.py
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 プログラムの決まりごと

ここからが本題です.いきなり完成品を見てみましょう.家を描くプログラムです. 開いて実行してください.

house.py
# 家を描くプログラム

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()
図 2.1 家.屋根(正三角形)を描いてから,かべ(正方形)を描いている.

「速さ」を「とてもゆっくり」にして,もう一度実行してみてください. かめが 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 コメントの書き方

コメントは人間のために書きます.コンピュータは読み飛ばしますが, 数日後の自分は必ず読みます. 「何をしているか」ではなく「なぜそうしているか」を書くと役に立ちます.

コメントの 2 つの書き方
# これは行コメント.行末まで無視される
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 章

今回使うのは順次だけです. 家のプログラムが上から順に実行されたのも,これが順次の形だからです. ですから今回は,やりたいことを全部,順番に書き並べることになります. 同じ行が何度も並んで面倒に感じるはずですが,それでかまいません.

3 つで足りる,という保証 「どんなプログラムもこの 3 つで書ける」というのは,思いつきではありません. 構造化定理として証明されている事実です. 逆にいえば,この 3 つさえ身につければ,作れないプログラムは無いということです. 第 6 章までで 3 つがそろいます.

2.3 かめに出す基本の命令

2.3.1 進む — fd と bk

fd は forward(前へ),bk は back(後ろへ)の略です. どちらも向きは変わりません.bk はかめが後ずさりします.

図 2.2 fd(100)
図 2.3 bk(100) 向きはそのまま

2.3.2 回る — lt と rt

lt は left(左へ),rt は right(右へ)の略です. かっこの中には回る角度を書きます. ここが初めのうちに間違えやすいところです.角度は 「どちらの方角を向くか」ではなく「その場で何度回るか」を表します.

図 2.4 lt(90)
図 2.5 rt(90)
図 2.6 lt(45)

lt(90) を 2 回続けて書けば,合計 180 度回ることになります. 次のプログラムで角度を変えながら確かめてください.

turn.py
from turtle import *

fd(80)
lt(120)      # ここの数を変えてみる
fd(80)

done()
図 2.7 lt(120) の場合.
虫食い虫食い 2-A L 字を描く

次のプログラムは,右へ 120 進んでから上へ 80 進んで L 字を描くものです. ____ を埋めて完成させてください. 上を向くには,左と右のどちらへ何度回ればよいでしょうか.

fill2_L.py
from turtle import *

pensize(3)

fd(120)
____(90)
fd(____)

done()

2.3.3 ペンを上げる・下ろす

かめはペンを持っていて,進むと線を引きます.pu()(pen up)でペンを上げると, 進んでも線が引かれません.離れた場所に描きたいときに使います. pd()(pen down)で下ろすと,また線を引くようになります.

penup.py
from turtle import *

fd(60)

pu()        # ペンを上げる
fd(40)      # ここは線が引かれない
pd()        # ペンを下ろす

fd(60)

done()
図 2.8 pu() と pd() の間は跡が残らない.

2.3.4 色と太さ

pencolor で線の色,pensize で太さを変えます. どちらもそれ以降に描く線に効きます.すでに描いた線は変わりません.

color.py
from turtle import *

pensize(6)

pencolor("red")
fd(80)
lt(120)

pencolor("green")
fd(80)
lt(120)

pencolor("blue")
fd(80)
lt(120)

done()
図 2.9 辺ごとに色を変えた正三角形.
ヒント 使える色の名前は 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 の正の向きです.数学のグラフと同じ向きで,画面の座標としては 上下が逆(下向きが正)になっていない点に注意してください.

(0, 0)x が大きい →↑ y が大きい
図 2.10 タートル画面の座標.中央が原点.

2.4 閉じた図形を描く

2.4.1 正方形 — 閉じた図形の考え方

「進む」と「曲がる」を交互に並べると,閉じた図形になります. 正方形なら 90 度ずつ 4 回曲がれば,元の位置・元の向きに戻ります.

square.py
from turtle import *

fd(100)
lt(90)
fd(100)
lt(90)
fd(100)
lt(90)
fd(100)
lt(90)

done()
図 2.11 正方形.最後の lt(90) で向きも元どおりになる.
なぜ最後にもう一度曲がるのか 最後の lt(90) は,図の形だけを見れば無くても同じです. しかし向きが元に戻っていないと,続けて何かを描くときに必ず混乱します. 「描き終わったら,始めた状態に戻す」と決めておくと, 図形を組み合わせるときに楽になります.後の回で「関数」を習うと,この約束が効いてきます.
虫食い虫食い 2-B 長方形

横 160・縦 80 の長方形を描きます. 4 つの ____ を埋めてください. 長方形も「1 周で 360 度」は変わりません.

fill2_rect.py
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 度回ればよい.

図形角の数 n1 回に曲がる角度 (360÷n)
正三角形3120 度
正方形490 度
正五角形572 度
正六角形660 度
正八角形845 度
正十二角形1230 度
図 2.12 正五角形(72 度)
図 2.13 正六角形(60 度)
図 2.14 正八角形(45 度)
ヒント 図形の最初に lt(18) や lt(30) が付いているのは, 図形をまっすぐ座らせるためです(底辺を水平にする). 無くても同じ形が描けますが,少し傾きます.試してみてください.
虫食い虫食い 2-C 正十角形

1 辺 40 の正十角形を描きます.曲がる角度を自分で計算して, 10 か所の ____ を埋めてください. 360 を角の数で割るのでしたね.

ヒント 埋める数はすべて同じです.1 つ計算できれば,残りは同じ数を書くだけです. 「同じことを 10 回書くのは面倒だ」と感じたら,その感覚が正しいです. 第 6 章で 3 行に縮めます.
fill3_decagon.py
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 度になります.

star.py
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.15 星.144 度ずつ 5 回曲がる.

2.5 曲線を描く

かめは直線しか引けません.では円はどうやって描くのでしょうか. 答えは「ごく短い直線を,少しずつ向きを変えながらつなぐ」です.

curve.py
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()
図 2.16 5 度曲がって 5 歩進むことの繰り返し.S 字に見える.

やってみよう:角度と長さを小さくすると,もっとなめらかになります. rt(2) と fd(2) にしたらどうなるでしょうか. 逆に rt(20),fd(20) にすると何が起きるでしょうか.

コラム:ディジタルとアナログ 実はコンピュータで本物の曲線を描くことはできません. 画面は細かい点の集まりですし,かめも直線しか引けません. それでも十分に細かく折れば,人間の目には曲線に見えます. このように,連続した量を細かい段階に置き換えて表すことを ディジタル(digital)表現といいます. これに対して,紙に鉛筆で描いた線のように,切れ目なく連続した表現を アナログ(analog)表現といいます. 音楽 CD も,デジタルカメラの写真も,同じ考え方でできています.
ヒント rt(5); fd(5) を 72 回繰り返せば,ちょうど 1 周して円になります (5 度 × 72 = 360 度).つまり円の正体は正 72 角形です. ただし 72 回も書くのは大変です.第 6 章で習う「繰り返し」を使うと 3 行で書けます.
虫食い虫食い 2-D 四分円(90 度の弧)

ちょうど 90 度ぶんの弧を描きます. rt(10) と fd(12) の組を何回繰り返せばよいでしょうか. 必要な回数だけ行を増やし,____ を埋めてください.

ヒント 10 度ずつ曲がって合計 90 度にするには,90 ÷ 10 回です. 行が足りなければ,自分で rt(10) と fd(12) を書き足してください.
fill4_arc.py
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() と書けば,中央・右向きの最初の状態に戻ります.

goto.py
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()
図 2.17 goto で場所を変えながら同じ図形を描く.
面倒だと感じたら正しい 同じ 8 行を 3 回書いていて,いかにも無駄です. 「同じことを繰り返す」「まとまりに名前をつける」方法は, 第 6 章(繰り返し)と第 13 章(関数)で習います. 今は面倒に感じておくことが大事です.そのほうが後で有り難みがわかります.
虫食い虫食い 2-E 4 すみに点を打つ

画面の 4 すみの近くに,色の違う点を打ちます. 座標を考えて ____ を埋めてください. 画面は横 620・縦 460 なので,中央から見て右端は x が約 300, 上端は y が約 210 です.dot(20) はその場に直径 20 の点を打つ命令です.

fill5_corners.py
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 行も実行されずに止まります. 次のプログラムはかっこが閉じていません.開いて実行し,エラーを見てください.

error1.py
from turtle import *

fd(100
lt(90)
fd(100)

done()

SyntaxError と表示されます.「文法(syntax)の誤り」という意味です. 示された行に間違いが見当たらないときは,その 1 つ上の行を疑ってください. かっこの閉じ忘れは,次の行まで読んで初めて「おかしい」と気づかれるためです.

2.7.2 名前の間違い(NameError)

次は,書き方は正しいけれど,そんな名前の命令が無い場合です.

error2.py
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 か所しかけてあります.開いて実行し,直してみてください.

error3.py
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 行目の閉じ側が ”(全角)になっているためです. 半角の " に打ち直せば,赤い線が引かれます.

エラーが次々に出るのは前進している エラーは一度に 1 つずつしか出ません. Python は最初に見つけた間違いで止まるからです. 「直したのにまたエラーが出た」のは失敗ではなく, 1 つ前に進んだということです.落ち着いて 1 つずつ片付けてください.

2.7.4 初めのうちに多い間違い

よくある 7 つ
症状原因と直し方
SyntaxError: invalid non-printable character全角スペースが混じっている.見えないので,その行を全部打ち直すのが速い
SyntaxError: invalid character全角の記号が混じっている.(),;は使えない.半角に直す
SyntaxError: unterminated string literal" の閉じ忘れ,または閉じ側が全角の ” になっている
NameError命令の綴りか大文字・小文字の間違い.fd を FD や fw と書いていないか.pencolor を pencolour と書く間違いも多い
IndentationError行の先頭に余計な空白がある.今回は全部の行を左端から書く
NameError: name 'fd' is not defined1 行目の from turtle import * を書き忘れている
エラーは出ないが形が変バグ.角度か長さの数が思っているものと違う.2.7.5 項へ

2.7.5 バグを見つける手順

エラーが出ないのに思ったとおりの形にならないことをバグといい, それを直すことをデバッグといいます. コンピュータは必ず命令したとおりに動きます. つまりバグは,コンピュータではなく命令した側の間違いです.

  1. 速さを「とてもゆっくり」にして実行する.かめがどこで思っていない方向に曲がったかを目で追う.これが一番速い.
  2. 途中まで消す.怪しいところより後ろを全部コメントにして(各行の先頭に # を付けて),そこまでは正しいかを確かめる.
  3. 紙に描いてみる.かめの気持ちになって,自分の体の向きを変えながらたどってみると,角度の間違いはすぐ見つかる.
  4. 少しずつ書いて,そのつど実行する.20 行書いてから実行すると,間違いが 20 行のどこにあるかわからない.2〜3 行書いては実行する人のほうが,結果的にずっと速い.
print で覗いてみる 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-1 正五角形の模様

正五角形を描くプログラムを与えます.これを参考に, 大きさの違う 2 つ以上の正五角形を組み合わせて模様を描いてください. どんな模様でもかまいません.位置をずらすには pu() と goto() を使います.

  • 出発点の正五角形(1 辺 100)に加えて,1 辺の長さが違う正五角形を 2 つ以上描く(例:1 辺 60 と 1 辺 30).
  • 正五角形ごとに pencolor で色を変える(全部で 3 色以上).
  • これもやりましょう:出発点と同じ 1 辺 100 の正五角形を,rt(72) をすべて lt(72) に変えて,同じ点からもう 1 つ描く.最初の辺を共有して2 つの五角形が隣り合うはずです.なぜそうなるのかを,コメントに 1 行で書く.
  • 仕上げに ht() でかめを隠す.
出発点の正五角形
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 1 辺 100 の正五角形と,1 辺の長さが違う正五角形が 2 つ以上描かれている
  2. 正五角形ごとに色が変わっている(3 色以上)
  3. lt(72) で描いた 1 辺 100 の正五角形が,最初の辺を共有して隣に描かれている
  4. 隣り合う理由がコメントに書かれ,最後に ht() がある

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 隣り合う五角形をさらに増やし,五角形で花やボールのような模様にする
  • pensize も変えて,線の太さで遠近感を出す
  • write で作品名を画面に書き入れる

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

演習演習 2-2 正六角形の模様

正六角形を描くプログラムを与えます. 大きさの違う 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() でかめを隠す.
出発点の正六角形
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 1 辺 80 の正六角形と,1 辺の長さが違う正六角形が 1 つ以上描かれている
  2. 正六角形ごとに色が変わっている
  3. 1 辺 80 の正六角形の中心と 6 つの頂点が線で結ばれ,6 つの正三角形に分かれている
  4. 最後に ht() があり,かめが隠れている

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 辺を共有させて正六角形を 3 つ以上並べ,蜂の巣のように敷き詰める
  • 小さい正六角形にも中心からの線を引き,大小で色を分ける
  • dot() で中心や頂点に点を打って飾る

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

演習演習 2-3 正八角形の模様

正八角形を描くプログラムを与えます. 大きさの違う 2 つ以上の正八角形で模様を描いてください. 少しずつ回しながら重ねると,花のような模様になります.

  • 出発点の正八角形(1 辺 60)に加えて,1 辺の長さが違う正八角形を 1 つ以上描く(例:同じ点から 1 辺 30).
  • 正八角形ごとに pencolor で色を変える.
  • これもやりましょう:goto(150, 0) の点から,1 辺 40 の正八角形を同じ点から 4 つ描いて花の形にする.1 つ描き終えるたびに lt() で向きを変え,4 つでちょうど 1 周(360 度)になるようにする(何度回すかは自分で計算し,コメントに書く).
  • 仕上げに ht() でかめを隠す.
出発点の正八角形
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 1 辺 60 の正八角形と,1 辺の長さが違う正八角形が 1 つ以上描かれている
  2. 正八角形ごとに色が変わっている
  3. goto(150, 0) の点から 1 辺 40 の正八角形が 4 つ,向きを等しくずらして描かれている
  4. 回す角度(360 ÷ 4 = 90 度)がコメントに書かれ,最後に ht() がある

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 重ねる数を 6 つや 8 つに増やし,そのときの角度も計算して花を細かくする
  • 花びらごとに色を変える
  • 花の中心に dot() で花芯を描き,茎や葉を描き足す

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

演習演習 2-4 星の模様

星を描くプログラムを与えます. 大きさの違う 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() でかめを隠す.
出発点の星
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 1 辺 140 の星と,1 辺の長さが違う星が 2 つ以上,重ならずに描かれている
  2. 星ごとに色が変わっている
  3. 1 辺 140 の星の 5 つのとがった先すべてに直径 15 の点がある(点は 5 つだけ)
  4. 最後に ht() があり,かめが隠れている

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 向きを変えた星を重ねて,光っているような模様にする
  • 点の色を星の線と変える(dot の前後で pencolor を切り替える)
  • 夜空の背景として小さな星や dot の星くずを散らす

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

演習演習 2-5 こんぺいとう

「こんぺいとう」を描くプログラムを与えます. 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() でかめを隠す.
出発点のこんぺいとう
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. とげ 8 本・長さ 25 のこんぺいとうが goto(-180, 60) から描かれている
  2. とげ 8 本・長さ 40 のこんぺいとうが goto(30, 80) から描かれている
  3. とげ 6 本(lt(30))のこんぺいとうが goto(220, 40) から描かれ,形が閉じている
  4. □ の求め方がコメントに書かれ,3 つの色が違い,最後に ht() がある

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • とげ 12 本や 4 本など,ほかの本数でも □ を計算して描く
  • rt(90) の角度も変えて,とげのとがり方を変える
  • こんぺいとうを入れる袋やびんの絵を描き足す

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

演習演習 2-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() でかめを隠す.
出発点のトライフォース
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 1 辺 120 のトライフォースが指定の 3 か所に描かれ,1 辺 240 の 2 段のトライフォースになっている
  2. 2 つ目・3 つ目が傾かずに描けている(右向きに戻す回転と,その考え方のコメントがある)
  3. 3 つのトライフォースの色が違う
  4. 外側が 1 辺 240・太さ 5 の正三角形でなぞられ,最後に ht() がある

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 1 辺 60 のトライフォースを 9 つ使って 3 段にする(描き始めの位置は自分で計算する)
  • まん中の逆三角形のすき間に write で文字を書いたり,dot で飾ったりする
  • 背景に盾や枠の模様を描き足して紋章のようにする

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

自由演習 2-7 好きな絵を描く

ここまでの命令だけを使って,好きな絵を描いてください. 自分の名前の頭文字,家,旗,ロボット,キャラクター — 何でもかまいません.

  • 色(pencolor)と太さ(pensize)を必ず使うこと
  • pu() と pd() で,離れた部分も描くこと
  • 先頭にコメントで,題名・氏名・日付を書くこと
  • 仕上げに ht() を入れると,かめが消えて作品らしくなる
ヒント 曲線が欲しくなったら 2.5 節を,描き始める位置を変えたくなったら 2.6 節を見てください. 長くなっても構いません.行数を恐れないでください (短く書く方法は第 6 章以降で習います).
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. pencolor と pensize を使っている
  2. pu() と pd() で,離れた部分も描いている
  3. 先頭のコメントに題名・氏名・日付がある
  4. エラーなく最後まで動き,何を描いたかが見て分かる

発展(必須に加えて 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 は条件が成り立つかを調べ,成り立たないとエラーになります.

虫食い虫食い・復習 1 往復して元へ戻る

使う書き方:backward(距離) は,向きを変えずに後ろへ進む命令です.forward(距離) と同じ距離を指定すると元の位置へ戻ります.

60進んだあと,同じ距離だけ後退します.かめが出発点へ戻る命令を補ってください.

fill_review_lec02_1.py
from turtle import *
forward(60)
____(60)
done()