[プログラミング演習 --- 情報基礎演習[全学向] > タートルグラフィクス]

タートルグラフィクス

もくじ

  1. はじめに
  2. プログラムの例
  3. 亀の動作の記述方法
  4. Pythonプログラムのインデント
  5. 亀の描画機能
  6. キャンバスの座標系
  7. サンプルプログラム集
  8. 色表

ここではタートルグラフィクスによって絵を描くプログラムを作成する方法を説明します. 「亀の描画機能」では描画に利用できる機能の一覧を紹介していますが,それらの全てを理解しなければプログラムが作れないわけではありません.

はじめに

タートルグラフィクスとは,プログラムを通じてキャンバス上の「タートル」(亀)を動かして,亀の動きに合わせて絵を描くフレームワークです. 亀の動きをプログラムで指示することでさまざまな絵を描くことができます. 次にタートルグラフィクスプログラムの実行中の画面の例を示します(なお図では「矢印」が亀を表しています).

タートルグラフィクスのキャンバス

タートルグラフィクスで亀の動作の基本となるのが「前へ進む」と「向きを変える」という指示です. これによって,ひとつながりの線画を描くことができます. さらに指定した範囲を塗りつぶしたり,線を描かずに移動することもできるようになっています. 詳しくは「亀の機能」を参照してください.

備考:pyturtle --- タートルグラフィクスの独自Wrapper

Pythonでは標準でタートルグラフィクスを利用できます. ただ標準のタートルグラフィクスをプログラムで利用するためには,若干煩雑な設定が必要になります. そこでこの演習では,タートルグラフィクスを簡単に利用できるようにするための「pyturtle」という「Wrapper」を独自に用意して利用することにしています. pyturtleでは,Python標準のタートルグラフィクスを少しアレンジした形でプログラムを記述します(つまりこのページで説明しているタートルグラフィクスは標準のものとは異なっています).

pyturtleは独自に用意したもので,Pythonに追加で導入する必要があります(pyturtle.pyはインターネットでは配布されていません). これまで本科目で演習に取り組んできていれば,(EDAの演習で)「ExbasicInfo.zip」を展開した際にWrapperの「pyturtle」も同時に導入されていて, 具体的には次の場所に「pyturtle.py」が配置されているはずです.

  ExBasicInfo > Programming > pyturtle.py

「pyturtle」を導入していない場合には,先に導入を済ませてください(EDAの演習の資料に説明があります). また設定の都合上,この演習で作成するタートルグラフィクスのプログラムは「pyturtle.py」と同じフォルダに保存してください. 別のフォルダに保存しても,タートルグラフィクスのプログラムは実行できません.

実行するプログラムとは別のフォルダにあるファイルを「import」することもできますが,この演習では,その設定はしていません.

プログラムの例

次に簡単なサンプルプログラムを示します. これは黄色で正方形を描くプログラム(square.py )です.なお正方形を描画した後,亀が描画前に向いていた方向を向くようにしています.


from pyturtle import *

# 描画動作の定義
def draw():
    line_color(100,70,0) # 線の色設定(0 <= R,G,B <= 100)
    line_width(3)        # 線幅 = 3
    forward(200)         # 200前進
    turn(90)             # 左90度回転
    forward(200)         # 200前進
    turn(90)             # 左90度回転
    forward(200)         # 200前進
    turn(90)             # 左90度回転
    forward(200)         # 200前進
    turn(90)             # 左90度回転
    
# 画面の表示と描画の実行(drawに従う)
launch(draw)

このサンプルプログラムは「pyturtle.py」と同じフォルダにダウンロードして,「IDLE」を介して実行できます. IDLEを起動して「File」から「Open」でダウンロードしたファイルを指定して, 新たに開かれる「Editor」で「Run」「Run Module」で実行してください.

キャンバスが表示されたらマウスの左ボタンをクリックするか[Enter]を押すことで絵を描くことができます. また描画が完了した後, マウスの左ボタンをクリックするか[Enter]を押すとキャンバスを閉じてプログラムを終了します.

プログラムの途中でキーボードから入力を行った場合, 最後は「マウスの左ボタンをクリック」で終了します. [Enter]を押しても(なぜか)反応しません.

[補足] pyturtleの利用

プログラムの最初の「from pyturtle import *」で「pyturtle.py」の内容をすべて取り込んでプログラムで利用できるようにしています.

亀の動作の記述方法

亀の動作は次のように記述します.


from pyturtle import *

def draw():
    # 1行ずつ亀の動作などを記述する
    # 行の先頭は字下げする(インデントをつける)
    # 「#」の後ろは行末までが注釈(コメント)として扱われる
    # コメントの部分はプログラムとして解釈はされない

    line_color(100,70,0) # 線の色設定(0 <= R,G,B <= 100)
    line_width(2) # 線幅の設定(幅=2に設定.線幅の初期値=1)
        :
        :
        :

  
launch(draw)

「def draw():」の次の行から1行に一つずつ 好きなだけ亀の動作を書くことができます. 線の色,線の幅なども指定できます. これらの行では先頭に適切に空白を入れることでインデントをつける(字下げする)必要があります(後述のインデントも参照のこと). プログラムの作成に「IDLE」を使っていれば,自動的にインデントが入るはずです. すべての動作を記述した後, 最後に行の先頭から(つまりインデントを入れないで)「launch(draw)」と記述します(インデントが自動でつけられたら,削除してください).

なおdefの行とlaunch( )の行の「draw」という名前(文字列)は,これら2箇所を同じ名前で揃えておけば,draw以外の名前にも変えられます(名前の付け方にはルールがあります).

さきほどのサンプル(square.py)も ここで説明している形式に沿って記述されていることを確認してください.

さてプログラムを実行すると,記述した内容が上の行から順に読み取られて,その指示の通りに順番に亀が動きます. 亀の具体的な動かし方については別途説明します(「亀の描画機能」を参照のこと).

Pythonプログラムのインデント

Pythonでは,各行の先頭に入れる空白によるインデント(字下げ)によってプログラムの構造が定まります. つまりインデントには意味があります.

インデントには「レベル」があります. 先頭に入っている空白の個数が同じ行は同じレベルであると解釈されます. 空白の個数を増やすとインデントのレベルが上がります. 逆に空白の個数を減らすとインデントのレベルが下がります. プログラムを部分的に構造化するときに 構造の先頭でレベルを上げて,構造の末尾でレベルを下げます. このようにして,インデントのレベルによって,プログラムの構造を定めるわけです. 同一レベルでは先頭の空白の個数はすべて同じである必要があります.

各行のインデントのレベルを変えるとプログラムの意味が変わります. たとえば上に示したサンプルプログラムsquare.pyの場合,「def draw」から「launch」の前までの各行のインデントのレベルは一定になっています. defの行以降で同一のインデントの範囲が「draw」という「関数」の定義になっています.

亀の描画機能

ここではタートル(亀)の描画機能について説明します. 基本となる機能は「前へ進む」(forward)と「向きを変える」(turn)です. またline_colorで線の色,fill_colorで塗りつぶしの色を指定できます. まずこれらを使うだけでもいろいろな絵を描くことができるでしょう. 以下に示す種々の機能を利用すればバラエティに富んだ絵を描けるようになります.

機能名 意味
forward(dist) distだけ前に進む.負の値を指定した場合はうしろに下がる. forward(100)
turn(degree) degree度だけ反時計回りに回転する. 負の値を指定した場合は時計回りに回転する. turn(30)
move(dx,dy) 現在地から横(x方向)にdx,縦(y方向)にdyだけ離れた点に進む.亀の向きに関わらず,キャンバスの座標系を基準とすることに注意せよ. move(60,-30)
moveto(x,y) 点(x,y)に移動する.ここで指定する値については「画面の座標系」を参照のこと. moveto(0,0)
toward(f,r) 現在地から前にf,右にrだけ離れた点に進む.moveとは異なり,現在の亀の向きを基準とすることに注意せよ. toward(30,-70)
turnto(dir) 方位dirに向きを変える.ここで指定する値については「画面の座標系」を参照のこと. turnto(180)
circle(r,rot_dir) 現在地から半径rの円を描く.rot_dirは'left'か'right',つまり左回りか右回りかのいずれかを指定する.
('left','right'は引用符で囲って指示することに注意せよ)
circle(50,'right')
arc(r,a) 現在地から半径rで中心角a度の円弧を描く.aが正なら左回り,負なら右回りに描く. arc(200,-120)
fan(r,a) 現在地から半径rで中心角a度の扇型を描く.まず現在地から亀の向いている方向に進んで,中心角がa度の円弧を,aが正なら左回り,負なら右回りに描く.その後,円の中心に進んで,最初の点に戻る.亀の向きも最初の状態に戻る. fan(100,90)
begin_fill()
      :
end_fill()
begin_fill()からend_fill()までの間に亀が動いて囲んだ領域が塗りつぶされる.なおend_fill()の時点でbegin_fill()のときの位置に戻っていない場合には,最初の点(begin_fill()のときの位置)と最後の点(end_fill()のときの位置)を線分で結んで囲まれる領域が塗りつぶしの対象となる. begin_fill()
forward(160)
turn(60)
forward(160)
end_fill()
begin_hover()
      :
end_hover()
begin_hover()からend_hover()までの間は線を描かずに移動する. begin_hover()
turnto(180)
forward(100)
turn(-60)
move(10,10)
end_hover()
color(r,g,b) 描画色(線の色と塗りつぶしの色)を(r,g,b)に設定する.r,g,b(赤,緑,青成分)はそれぞれ0〜100の整数で与える.描画開始時の描画色は(0,0,0)になっている.つまり描画色をプログラムで指定しなければ,黒が使われる.一度設定した色は再度設定するまで適用される. color(0,25,75)
line_color(r,g,b) 描く線の色を(r,g,b)に設定する.r,g,b(赤,緑,青成分)はそれぞれ0〜100の整数で与える.描画開始時の線の色は(0,0,0)になっている.つまり線の色をプログラムで指定しなければ,黒が使われる.一度設定した色は再度設定するまで適用される. line_color(100,75,0)
fill_color(r,g,b) 塗りつぶしの色を(r,g,b)に設定する.r,g,b(赤,緑,青成分)はそれぞれ0〜100の整数で与える.描画開始時の塗りつぶしの色は(0,0,0)になっている.つまり塗りつぶしの色をプログラムで指定しなければ,黒が使われる.一度設定した色は再度設定するまで適用される. fill_color(40,100,20)
line_width(w) 描く線の太さをwに設定する.wは0以上の整数で与える.なお描画開始時の線の太さ=1になっている.つまり線の太さをプログラムで指定しなければ,線の太さ=1で描画する.一度設定した値は再度設定するまで適用される. line_width(2)
mark() 現在の位置と向きを記憶する.後でbackすると記憶した位置に戻ることができる(向きも戻る).いくつでも記憶できる.
back() markした場所に戻る.markしたときの方向を向く.戻ったら,その場所についての記憶(その場所のmark)はなくなる.二つ以上記憶している場合は直前にmarkした場所に戻る.何も記憶していない場合には何も起きない.
speed(s) 描画スピードを設定する.sに設定するのは次のいずれかである.'slowest','slow','normal','fast','fastest'.初期値は'normal'である.つまりプログラムでスピードを設定しない場合は,描画スピードは'normal'となる.一度設定した速さは再度設定するまで適用される.
(sで指定する速さのデータはいずれも引用符で囲って指示することに注意せよ)
speed('fastest')
position() 亀の現在位置を得る. x,y=position()
direction() 亀の現在の向きを得る. v=direction()
ask("メッセージ") 文字列を得る(メッセージ付きの入力欄を表示する).
(注)この機能を使った場合,描画終了後にウインドウを閉じるにはキャンバスを左クリックする.[Enter]では閉じることができない.
name=ask("お名前は?")
askv("メッセージ") 数値を得る(メッセージ付きの入力欄を表示する).
(注)この機能を使った場合,描画終了後にウインドウを閉じるにはキャンバスを左クリックする.[Enter]では閉じることができない.
sz=askv("一辺の長さ?")
say("メッセージ") メッセージを画面に表示する. say("こんにちは!")
wait("メッセージ") 一時停止して現在の位置と進行方向をメッセージとともに画面に表示する.メッセージは省略してもよい. wait()
bye("メッセージ") メッセージを画面に表示した後,キャンバスを閉じて,プログラムを終了する.メッセージは省略できる.その場合は,単にキャンバスを閉じて,プログラムを終了する. bye("See you!")
launch(draw_func) ウインドウを開く.描画開始の指示(クリックまたは[Enter])があると,draw_funcの記述に従って描画を行う. launch(draw)

プログラム実行開始時の初期設定

プログラム実行開始時には亀は画面中央に上向きに配置されます. またプログラム開始の時点での描画色(線,塗りつぶし),描画する線の太さ,描画の速さは,それぞれ次の初期値で定められています.

描画色(0,0,0)
線の太さ1
速さ'normal'

color,line_width,speedによって新たな設定が与えられるまでは,これらの初期設定が適用されます.

チュートリアル

タートルグラフィクスでの基本的な描画処理の説明と亀の機能の説明を兼ねたチュートリアルプログラムを用意しました(すべての機能を網羅しているわけではありません).ダウンロードして実行してみてください. またファイルをIDLEのEditorで開いて,プログラムの内容を確認してみてください.

なおファイルは自分のPCの「pyturtle.py」と同じフォルダにダウンロードします.ブラウザ画面で開くのではありません. 次でダウンロードの方法について説明しています.

キャンバスの座標系

キャンバスの中心が原点(0,0)となっています. 右向きにx軸,上向きにy軸がとられています. またy軸の正の方向を0として反時計回りで角度(degree)により方位を表します. 0が北,90が西,180が南,270が東を表します. 360はまた北向きを表します. もちろん中間の方位も角度(0-360)で表すことができます.

タートルグラフィクスのキャンバスの座標系

サンプルプログラム

タートルグラフィクスのサンプルプログラムを用意しています. ダウンロードして実行してみてください. またダウンロードしたプログラムの内容を見て参考にしてください.

サンプルプログラムは「pyturtle.py」と同じフォルダにダウンロードして,「IDLE」を介して実行できます. IDLEを起動して「File」から「Open」でダウンロードしたファイルをを指定して 新たに開かれる「Editor」で「Run」「Run Module」で実行してください.

色表

色データの見本を次のページに示しています.

[プログラミング演習 --- 情報基礎演習[全学向] > タートルグラフィクス]