Pythonで遊ぼう! 基礎編 ⑨ turtleモジュールを使って絵を書こう

基礎⑨アイキャッチ 基礎編

この記事には、PR部分にUdemyのアフィリエイトリンクを含みますが、記事の内容は筆者が独自に作成したものです。記事の作成についてUdemy様から報酬等を受け取って作成したものではありません。

スポンサーリンク

イントロダクション

Pythonで遊ぼう!基礎編も9回目を迎え、内容が少しずつ高度なものになってきました。皆さんもそろそろテキストエディタを使ったプログラミングに慣れてきたころかと思います。

今まで学習してきたことは、Pythonの基本中の基本ともいえる内容ばかりでしたが、少し地味なものが多く、中だるみしてきたかもしれません。

そこで、今回は、Pythonで作図をすることが出来る面白いモジュールを学習して息抜きをしていただこうと思います。それが、turtleモジュールです。

今回の内容は、VSCodeなどのテキストエディタではなく、ターミナルから直接入力して進めていきます。Windowsの場合は、「スタートボタンを右クリック」→「ターミナル」→「python」と入力してPythonを起動してください。

PR

プログラミング言語の人気オンラインコース
ITとソフトウェアの人気オンラインコース

turtleモジュール

turtleモジュールは、初心者向けのグラフィックスライブラリで、簡単に描画を行うことができる組み込みモジュールです。今回は、タートルグラフィックスとして知られる描画方法を使用します。

下準備・Turtleの作成

まず、turtleモジュールをインポートします。ターミナルでPythonを起動し、「 >>> 」が表示されている状態で、以下のコマンドを打ち込んでください。

import turtle

次に、turtleオブジェクト(タートル)を作成します。pointerという変数に、turtleモジュール中のTurtleメソッドを割り当てるコマンドです。

pointer = turtle.Turtle()

コマンドを打ち込むと、下図のようにPython Turtle Graphicsというウインドウが新たに開きます。

Python Turtle Graphics 起動画面

これからターミナルにコマンドを打ち込むことによって、この矢印を移動させていきます。矢印が移動すると、画面に線が描かれていきます。

初期状態のこの矢印は’classic’と呼ばれる形です。それを確かめるコマンドがありますので、打ち込んでみましょう。

pointer.shape()

‘classic’という値が返ってくることを確認してください。

pointerの形状を変えてみましょう。前述の「pointer.shape( ) 」の、()の中に変えたい形を入力するだけです。Pythonの公式ドキュメントで調べると分かりますが、矢印の形状として、’classic’のほかに、’arrow’, ‘turtle’, ‘circle’, ‘square’, ‘triangle’が用意されています。

turtle --- タートルグラフィックス
ソースコード: Lib/turtle.py はじめに: Turtle graphics is an implementation of the popular geometric drawing tools introduced in Logo, developed by Wally Feurzeig, Seymour...

正直、’turtle’以外はどれも大差ありません。今回は、見た目の変化がわかりやすい’turtle’にしてみましょう。

pointer.shape('turtle')
亀1

ここからさらに、亀のサイズを変えることが出来るshapesize()メソッドもありますが、ここでは割愛します。公式ドキュメントを読み込む練習として利用してください。

亀の操作

さて、この亀ですが、指示するコマンドを打ち込むことによって、忠実に手足となり動いてくれます。動かすコマンドは基本的には下記のとおりです。

pointer.forward(引数)  # (引数)px前進
pointer.backward(引数)  # (引数)px後退
pointer.right(引数)  # 右に(引数)度、回転
pointer.left(引数)  # 左に(引数)度、回転
pointer.circle(引数)  # 半径(引数)の円を描く
pointer.circle(引数1,引数2)  # 半径(引数1)の長さで、(引数2)度だけ進む
pointer.undo()  # 直前の操作を取り消し
pointer.home()  # 亀がホームポジションに帰還します

ずらずらっと書かれても困ると思いますので、1つずつ入力してみましょう。

pointer.forward(100)

下図の通り、亀が前進(100ピクセル分)したと同時に、直線が描かれます。

亀100px前進

要するに、亀は画面上に見えているペン先のようなものなのだなと思ってください。

次は後退です。

pointer.backward(200)

亀が今向いている方向から200ピクセル分後退しました。

亀200px後退

次は右回転です。

pointer.right(90)
亀90度右回転

亀が下を向きます。次に左回転させても無意味にぐるぐる回るだけなので、円を書いてもらいましょう。

pointer.circle(50)
亀半径50pxの円を描く

ここで、circleは、亀の向いている方向から反時計回りに円が描かれることがわかります。さらに左回転させます。

pointer.left(180)
亀左に180度回転

亀が上を向きました。次は、半円を描きます。

pointer.circle(50,180)
亀半径50pxの半円を描く

亀は、反時計回りに半円を描きました。ここから、時計回りに円を描かせてみましょう。

pointer.circle(-50)
亀時計回り

circleの(引数)にマイナスの値を入力することで、時計回りに円を描かせることが出来ます。

次は、亀の行動の取り消しです。

pointer.undo()
undoによる行動取り消し

亀をホームポジションに戻しましょう。

pointer.home()

最後は、描画のクリアです。

pointer.clear()
元通り

以上で、亀の操作は終わりです。

ペンの操作

亀が線を書いてほしくない場合や、太さ、色変え、文字列表示のために、ペンを操作するためのコマンドがいくつか用意されています。これらについての操作説明は、自分がやりたいことに応じて入力するものなので、省きます。

pointer.penup()  # ペンを画面から離します
pointer.pendown()  # ペンを画面に置きます
pointer.setpos(x, y)  # ポインターの座標を(x,y)の位置に移動します
pointer.pencolor('red')  # ペンの色を変えます
pointer.pensize(3)  # ペンの太さを変えます
pointer.write('hello!')  # 現在位置の真上に文字列を描きます

反復処理で亀を操作する

亀を動かすのに、何回もコードを打ち込むのは面倒です。繰り返し処理を前回学習しましたので、これを利用して亀を操るコードを書きましょう。

for文で複雑な図形を描く

例えば、正方形を亀に描かせる場合、入力するコマンドは以下のようになります。

以下のコードを入力してみましょう。

pointer.forward(100)
pointer.right(90)
pointer.forward(100)
pointer.right(90)
pointer.forward(100)
pointer.right(90)
pointer.forward(100)
pointer.right(90)

ターミナルで上下のカーソル入力をすると、同じコマンドを再度入力せずとも呼び出すことが出来ますので、見た目よりは面倒ではありませんが、2回のコマンドの組み合わせを4セット入力していますので、forを利用してよりスマートに入力できるはずです。試してみましょう。

for i in range(4):
    pointer.forward(100)
    pointer.right(90)

インタラクティブシェル(ターミナル)でfor文を使うのは初めてかもしれません。一行目にfor文を書くと、三点リーダが行頭に表示されますので、そこから「TAB」の入力を忘れずに、コマンドを入力してください。コマンドの入力が終わったら、三点リーダ表示の後に、何も入力せずにエンターキーを押してください。

亀が上向きでしたので、最初に描いた正方形に隣接して正方形が描かれます。

このように、for文を利用することで、複雑な図形の組み合わせや、幾何学的な図形を描くことが可能になります。例えば、以下のコードならばどうでしょうか。

for i in range(36)
    pointer.circle(50)
    pointer.right(10)

図形の角度に対する知識や、亀の向きを考慮して、繰り返し同じ動作させることで様々な幾何学的な図形を書くことが出来るようになります。とにかく触ってみて、色々な図形を描いて遊んでみましょう。

whileを使った繰り返し

今度は、勝手に動き回る亀を作成してみましょう。反復処理forを利用して亀の自動運転をある程度実現しましたが、forでは、あらかじめ自分が指定した回数の繰り返ししかできませんでした。

その一方で、whileを利用すれば、永遠に動き続ける命令を亀に命じることが出来るようになります。

while True:
    pointer.circle(100)
    pointer.right(5)

このコードを実行すると、亀が5度ずつ角度を変えながら半径100pxの円を永遠に描き続けます。

circle2

Pythonインタラクティブシェル上で発生した無限ループを抜け出す、無限ループを止めるには、「CTRL+C」キーを押してください。KeyboardInterruptと表示されて、無限ループから抜け出すことが出来ます。

このように、whileは繰返回数を指定しない反復処理を指示するのに優れたステートメントであることがわかります。

randomモジュールとwhileの組み合わせ

さて、亀を移動させるためには、前進するピクセル数と、回転する際の角度を引数に指定して指示を出していました。

一方で、randomモジュールのrandint(引数1,引数2)メソッドは、引数1から引数2までの中の整数をランダムで発生させることが出来るメソッドです。復習がてら下記コードを打ってみましょう。

import random
random.randint(-360,360)
random.randint(-10,10)

-360から360の間の整数を発生させるメソッドと、‐10から10の間の整数を発生させるメソッドです。何度か繰り返してランダムな整数が返ってくることを確認してください。

これとwhileを組み合わせることで、永遠にランダムに動き続ける指示を書いてみましょう。

while True:
    pointer.forward(random.randint(-10,10))
    pointer.right(random.randint(-360,360))

放っておいたら、そのうち画面の外に亀が逃げ出していくので、「CTRL+C」で止めてあげましょう。

亀が動く角度を一定量に固定し、動く範囲を限定する条件を付与してあげると、簡単な自動運転の掃除ロボットのプログラムが組めるようになります。

発展的な内容になってきましたので、基礎編での説明はこの辺りにしておきます。

ターミナルで起動したPythonを終了するには、以下のコマンドを入力してください。

quit()

今回の内容は以上で終了です!お疲れさまでした。

次回の記事はこちら

PR

プログラミング言語の人気オンラインコース
ITとソフトウェアの人気オンラインコース

コメント

タイトルとURLをコピーしました