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

タートルに命令する

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

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

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

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

いまは,経路検索も翻訳も集計も,コンピュータが一瞬で片付けてくれます. ただしコンピュータは,自分から気を利かせて何かをしてくれるわけではありません. どんな情報を,どういう手順で扱うのかを, あらかじめ人間が書いて渡しておく必要があります. その「書いて渡すもの」がプログラムです. プログラミングを学ぶというのは, コンピュータに仕事のやり方を説明できるようになるということです.

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

2.1 まずは動かしてみる

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

hello.py
print("こんにちは")
print(1 + 2)

右下の「コンソール」に こんにちは3 が出れば成功です. print は「書き出す」という命令で,かっこの中に書いたものを表示します. 文字は "(ダブルクォート)で囲み,数はそのまま書きます. 1 + 23 になったように,かっこの中では計算もできます.

右側の中身を書き換えて,もう一度実行してみましょう.自分の名前を表示させたり, 1 + 27 * 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 には最初から多くの道具が用意されていますが,使う前に「この箱を開けます」と宣言します.これを書かないと fdlt も「そんな名前は知りません」と言われます.
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命令の綴りか大文字・小文字の間違い.fdFDfw と書いていないか.pencolorpencolour と書く間違いも多い
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() を使います.

出発点の正五角形
演習演習 2-2 正六角形の模様

正六角形を描くプログラムを与えます. 大きさの違う 2 つ以上の正六角形で模様を描いてください. 六角形は敷き詰めることができます(蜂の巣を思い出してください). 並べてみるのも面白いでしょう.

出発点の正六角形
演習演習 2-3 正八角形の模様

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

出発点の正八角形
演習演習 2-4 星の模様

星を描くプログラムを与えます. 大きさの違う 2 つ以上の星で模様を描いてください. 色を変えたり,向きを変えて重ねたりしてみましょう.

出発点の星
演習演習 2-5 こんぺいとう

「こんぺいとう」を描くプログラムを与えます. fd(25) → rt(90) → fd(25) → lt(45) の繰り返しでとげを作っています. この考え方をもとに,とげの数や長さを変えて,別の形に発展させてください.

出発点のこんぺいとう
演習演習 2-6 トライフォース

正三角形を組み合わせた「トライフォース」を描くプログラムを与えます. 三角形の中に三角形が入った形です. 段数を増やしたり,色を塗り分けたりして発展させてください.

出発点のトライフォース
自由演習 2-7 好きな絵を描く

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

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

まとめ

  • プログラムの流れの形は順次・分岐・反復の 3 つだけ.今回使ったのは順次で,プログラムは上から順に実行される.
  • fd で進み,ltrt で向きを変える.この 2 つだけで図形が描ける.
  • 角度は「その場で何度回るか」.閉じた図形を 1 周すると合計 360 度になるので,正 n 角形の角度は 360 ÷ n
  • 曲線は,短い直線を少しずつ曲げてつないだもの(ディジタル表現).
  • 描き始める位置を変えるときは pu() → 移動 → pd()
  • エラーは行番号と種類を読む.とくに多いのは全角文字の混入.半角入力モードで書くこと.形がおかしいときは速度を落とし,少しずつ書いて確かめる.

次の回では,「100」のような数に名前をつけて覚えさせる変数を習います. 家の大きさを 1 か所変えるだけで全体が拡大・縮小できるようになります.