7時間目タイトル_166

「かめののろい」でPython #7時間目(2/2)

7時間目 for と変数でturtleをさらにさらに操ってみる④のつづき

こんにちは!ヒラバヤシヤスキです。
今日は昨日の続きからです!

◆ 次 はスクリーン 中心 を 円 の 中心 として 半径 100 ピクセルの 円 を 描 く 方 法 を 考 えてみよう。
① 新 しいファイル"test07-2.py"を 作 る。
 ②カメを 出 現 させる
③スクリーン 中心 から 100 ピクセル 前 進 させる。
④カメを 90° 上 向 きにする。 (下 向 きにしない)
⑤カメを 100 ピクセルの 半径 で 円 を 描 く。

とのこと。この指示に従って、プログラムをはじめから書いてみます。

#test07-2-1
#②カメを出現させる
import turtle
kame=turtle.Turtle()
kame.home()
kame.shape('turtle')
kame.shapesize(2,2,2)
#③スクリーン中心から100ピクセル前進させる
kame.forward(100)
#④カメを90°上向きにする
kame.left(90)
#⑤100ピクセルの半径で円を描く
kame.circle(100)

これくらいであればサクサクかけるようになってきました!
実行します。

久しぶりのGIF動画です笑 中心に見えないのはごめんなさい笑
そして、真ん中の線が気になりますが、これは
turtle.penup #ペンをあげなさい!
turtle.pendown #ペンをさげなさい!

というコマンドで解決できるそうです。

#②カメを出現させる
import turtle
kame=turtle.Turtle()
kame.home()
kame.shape('turtle')
kame.shapesize(2,2,2)

kame.penup() #ペンをあげなさい!
#③スクリーン中心から100ピクセル前進させる
kame.forward(100)

kame.pendown() #ペンをさげなさい!

#④カメを90°上向きにする
kame.left(90)

#⑤100ピクセルの半径で円を描く
kame.circle(100)

お、線がなくなってきれいな円になりました。

スクリーンの中心から五重円を描くプログラムにも挑戦!

では、 スクリーンの 中心 から for 文 を 使 って、 5 重 丸 を 描 くプログラム をファイル 名 は"test07-3.py"で 書 いてみましょう。

課題が出たので、ノーヒントでかけるか挑戦します。

import turtle
kame=turtle.Turtle()
kame.home()
kame.shape('turtle')
kame.shapesize(2,2,2)
kame.penup()
kame.forward(40)
kame.pendown()
kame.left(90)
hankei=[40,60,80,100,120]
iro=['red','blue','tomato','lime','black']
for a in range(5):
   kame.pencolor(iro[a])
   kame.circle(hankei[a])

これでどうかな!?実行!(静止画です)

こ、コレジャナイ感…笑
もっとこう、中心が同じ5つの円になってほしいですよね笑

うーん、たぶん、カメさんが円を書き終わって右端にきたら20pixelさらに右にずれてから、また円を描き始める、というのを繰り返せば良さそうなので、こんな感じかな?

import turtle
kame=turtle.Turtle()
kame.home()
kame.shape('turtle')
kame.shapesize(2,2,2)

kame.left(90)

hankei=[40,60,80,100,120]
iro=['red','blue','tomato','lime','black']

for a in range(5):
    kame.penup()
    kame.forward(hankei[a])
    kame.pendown()
    kame.pencolor(iro[a])
    kame.circle(hankei[a])

実行!

ど、どこにいくカメさん笑
もっとこれじゃない感が笑

気を取り直して、しっかり考えます!
まず、カメさんの暴走を反省すると…。
①円を描き終えたら、右に90を向いてからカメさんを進めるべきだった(今回、そのまま上方向に進んでしまった)。また、進んだ後は、左を向かせる。そうしないと円の方向がそろわない。
kame.forward(hankei[a])だと、どんどん進む距離が大きくなる
なので、kame.forward(20)でよい。
これらを踏まえて、もう一度書き直します。

import turtle
kame=turtle.Turtle()
kame.home()
kame.shape('turtle')
kame.shapesize(2,2,2)

#半径と色の変数リストをセット
hankei=[40,60,80,100,120]
iro=['red','blue','tomato','lime','black']

#まず40前進させておく
kame.penup()
kame.forward(40)
kame.pendown()
kame.left(90)
   
for a in range(5): #aには0~4の4つが順番にはいっていく
  #円を描く
   kame.pencolor(iro[a]) #iroリストのa番目の色が入る
   kame.circle(hankei[a]) #hankeiリストのa番目の値が入る
  #次の円を描く準備
   kame.penup()
   kame.right(90)
   kame.forward(20)
   kame.left(90)
   kame.pendown()

実行します!(静止画です)

今度は、(カメさんの位置が微妙ですが)いい感じです。
と、自分なりの解答ができたところで答え合わせをします。

テキストの解答はこんな感じ!

#五重円を描く例1
import turtle
kame=turtle.Turtle()
kame.home()
kame.shape('turtle')
kame.shapesize(2,2,2)
hankei=[40,60,80,100,120]
for a in hankei:
  kame.penup()
  kame.home() #カメさんをホームポジションに
  kame.forward(a) #hankeiのa番目の距離前進
  kame.pendown()
  kame.left(90)
  kame.circle(a)
 

これが解答例の1です。ずいぶんすっきりしています。
turtle.home() はこういう使い方ができるんですね。
試しに実行してみると…

カメさん…!超人(?)的な動きです笑

そして、解答例その2

#五重円を描く例2
import turtle
kame=turtle.Turtle()
kame.home()
kame.shape('turtle')
kame.shapesize(2,2,2)
hankei=40
for a in range(5):
  kame.penup()
  kame.home() #カメさんをホームポジションに
  kame.forward(hankei) 
  kame.pendown()
  kame.left(90)
  kame.circle(hankei)
  hankei=hankei+20 #hankeiに+20します

変数hankeiをはじめ40と定義して繰り返すたびに20ずつ足していくわけですね、なるほど!
動きは解答例1と同じだったので、省略します。

これにて7時間目は終了です。
今回もお読みいただきありがとうございました!

【今回の学び】
・カメさんの動きをかなり詳細に想像してから作らないと、とんでもないプログラムに仕上がる
・同じ結果を求めるのに、本当にたくさんのやり方がある。よりシンプルなものを考えるのが楽しい!
・まだ for文の構文があいまいになることがある
 - rangeをもちいるパターンと、変数リストをいれるパターンの違い
・カメさんは超人的な動きができる
【未解決の疑問】
・kame=turtle と kame=turtle.Turtle() は同じ働きをする。テキストではあえて後者なのはなぜか?
・長い動画をアップする方法

「かめののろい」の目次

0時間目 まずパソコンにPythonをインストール
1時間目 IDLEを起ち上げ まずはコマンドラインでカメさん登場
2時間目 楽してカメさん エディターを使いこなそう!
3時間目 変数(箱)を使ってturtleを操ってみる
4時間目 同じ命令の繰り返しfor を使ってturtleを操ってみる
5時間目 for を使ってturtleをさらに操ってみる②
6時間目 for を入れ子にしてturtleをさらに操ってみる③
7時間目 for と変数でturtleをさらにさらに操ってみる④
8時間目 randomを使ってturtleを操ってみる①
9時間目 randomを使ってturtleをさらに操ってみる②
10時間目 条件文if elseともう1つのくり返しwhileで数当てゲームを作る
11時間目 条件文ifとelif・elseでおみくじを作る
12時間目 おみくじの結果でカメがよろこぶ
13時間目 座標(ざひょう)を操って多角形を書く
14時間目 座標(ざひょう)を操って多角形を書く②
15時間目 今まで学習したメソッドを駆使して図形を描く①
16時間目 今まで学習したメソッドと演算子で図形を描く
17時間目 今まで学習したメソッドを駆使して図形を描く②
18時間目 同じ模様の書き方をアルゴリズムのちがいで書いてみる
19時間目 inputを使って大きさのちがう複雑な図形を描いてみる
20時間目 少し複雑な図形を描いてみる
21時間目 変数とfor・if文で少し複雑な図形を書いてみる
22時間目 図形から離れて少し遊んでみる
23時間目 関数を作って遊んでみる
24時間目 自動計算とループ処理で多角形を書く



この記事が気に入ったらサポートをしてみませんか?