Pythonのturtleグラフィックスでペンギンを描いてみよう（ChatGPTのコードを読んでみる編）

# はじめに

　前回の記事で、自分なりにPythonのturtleでペンギンを描く計画を立てました。その時にふと思ったのが、「ChatGPTはコードも書けるようになったらしいけど、まずそっちに聞いて修正するほうが早いのでは？」ということでした。

　と、いうことで、今回はChatGPTに書いてもらったコードをPython初心者なりに読み解いてみよう（可能であれば直そう）、という記事です。

↓ 前回記事

https://qiita.com/awonohata/items/9a54d119c2d03ab92f6a

:::note warn
ChatGPT4（月額課金版）を利用。

今回の記事では、**Pythonがメイン**なので、プロンプトエンジニアリングについては考慮しません。プロンプトを工夫したら確実に描いてくれそう！という記事は別記事で書きたいと思います。
:::

# Pythonのturtleグラフィックスでペンギンを描いてみよう（ChatGPTのコードを読んでみる）

## まずはChatGPTにコードを出力してもらう

:::note info
かなり長文になってしまったので、実際のコードは折りたたんでいます。
気になる方は↓をクリックしてご確認ください。
:::

<details><summary>ChatGPTへの問いかけ</summary>
~~~
おはようございます！
あなたはPythonの達人です。
Pythonのturtleグラフィックスを使って、ペンギンを描くコードを書いてくれませんか？
~~~

</details>

<details><summary>ChatGPTからの返答</summary>

 ~~~
 もちろん、Pythonのturtleグラフィックスを使ってペンギンを描くコードを書くことができます。
 このコードはシンプルなペンギンの形を作成します。まずは基本的な形から始めましょう。

残念ながら、現在の環境では `turtle` モジュールを使ってグラフィックを表示することができません。
代わりに、ペンギンを描くためのコードの概要を説明します。
このコードはあなたのコンピュータで `turtle` モジュールを利用して実行できます。

以下のステップでペンギンを描くことができます：

1. **耳を描く**: 黒色で円を描いて耳を表現します。
2. **顔を描く**: 白色で大きな円を描いてペンギンの顔を作ります。
3. **目を描く**: 顔の上部に黒色で小さな円を描き、その中にもう一つ白色の小さな円を描いて目を表現します。
4. **くちばしを描く**: オレンジ色の小さな円を描いてくちばしを作ります。
5. **お腹を描く**: 白色で大きな円を描いてペンギンのお腹を表現します。
6. **足を描く**: オレンジ色で小さな円を描いて足を作ります。

このコードは `turtle` モジュールを使用して、各パーツを順番に描いていきます。
あなたの環境でこのコードを実行して、ペンギンを描いてみてください。
また、色や形を変えることで、よりユニークなペンギンを作ることもできます。
~~~

</details>

<details><summary>出力されたコード</summary>

~~~Python
import turtle

def draw_penguin():
    screen = turtle.Screen()
    screen.title("Turtle Penguin")

    # Creating a turtle object(pen)
    pen = turtle.Turtle()

    # Defining method to draw a colored circle with a dynamic radius
    def ring(col, rad):
        # Set the fill
        pen.fillcolor(col)

        # Start filling the color
        pen.begin_fill()

        # Draw a circle
        pen.circle(rad)

        # Ending the filling of the color
        pen.end_fill()

    # Draw first ear
    pen.up()
    pen.setpos(-35, 95)
    pen.down
    ring('black', 15)

    # Draw second ear
    pen.up()
    pen.setpos(35, 95)
    pen.down()
    ring('black', 15)

    # Draw face
    pen.up()
    pen.setpos(0, 35)
    pen.down()
    ring('white', 40)

    # Draw first eye
    pen.up()
    pen.setpos(-18, 75)
    pen.down
    ring('black', 8)

    # Draw second eye
    pen.up()
    pen.setpos(18, 75)
    pen.down()
    ring('black', 8)

    # Draw belly
    pen.up()
    pen.setpos(0, 35)
    pen.down()
    ring('white', 40)

    # Draw first eye
    pen.up()
    pen.setpos(-18, 77)
    pen.down()
    ring('white', 4)

    # Draw second eye
    pen.up()
    pen.setpos(18, 77)
    pen.down()
    ring('white', 4)

    # Draw beak
    pen.up()
    pen.setpos(0, 45)
    pen.down()
    ring('orange', 8)

    # Draw feet
    pen.up()
    pen.setpos(-15, -25)
    pen.down()
    ring('orange', 10)

    pen.up()
    pen.setpos(15, -25)
    pen.down()
    ring('orange', 10)

    turtle.done()

draw_penguin()

~~~

</details>

**実際に出力されたペンギン**

![penguin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/6483ba4e-fa6b-a2a1-b1f9-90725232d8a8.gif)


## あれ？ ChatGPTさん？？？？

## 何がおかしかったのか

　とりあえず、ChatGPTが「以下のステップで〜」と書いてくださっているので、日本語文＋該当しそうなコードの箇所を追って読んでいきたいと思います。「〜」で囲んだ分は私の心の叫びです。

### 0. 定義

~~~Python
import turtle

def draw_penguin():
    screen = turtle.Screen()
    screen.title("Turtle Penguin")

    # Creating a turtle object(pen)
    pen = turtle.Turtle()

    # Defining method to draw a colored circle with a dynamic radius
    def ring(col, rad):
        # Set the fill
        pen.fillcolor(col)

        # Start filling the color
        pen.begin_fill()

        # Draw a circle
        pen.circle(rad)

        # Ending the filling of the color
        pen.end_fill()
~~~

* タイトル名を"Turtle　Penguin"にしているの面白いですね。
* 関数名がpenなの分かってるぅ（なお他の人に伝わるかは…）
* 色つけまで考えてくれてるっぽい？

### 1. 耳を描く 〜ペンギンに耳はないよ〜

　ファーストステップから違っていて面白過ぎますが、見ていきましょう。

~~~
1. 耳を描く: 黒色で円を描いて耳を表現します。
~~~

~~~Python
    # Draw first ear
    pen.up()
    pen.setpos(-35, 95)
    pen.down
    ring('black', 15)

    # Draw second ear
    pen.up()
    pen.setpos(35, 95)
    pen.down()
    ring('black', 15)
~~~

* もしかしたら途中までパンダを描いてくれるつもりだったのかもしれません。
* setposで正確な場所に始点を置いているのは勉強になりました。（どうやって割り出しているんだろう…）

### 2. 顔を描く 〜これは良さそう〜

~~~
2.顔を描く: 白色で大きな円を描いてペンギンの顔を作ります。
~~~

~~~Python
    # Draw face
    pen.up()
    pen.setpos(0, 35)
    pen.down()
    ring('white', 40)
~~~

### 3. 目を描く 〜OK！〜

~~~
3.目を描く: 顔の上部に黒色で小さな円を描き、その中にもう一つ白色の小さな円を描いて目を表現します。
~~~

~~~Python
    # Draw first eye
    pen.up()
    pen.setpos(-18, 75)
    pen.down
    ring('black', 8)

    # Draw second eye
    pen.up()
    pen.setpos(18, 75)
    pen.down()
    ring('black', 8)
~~~

### 4. くちばしを描く　〜それっぽい！〜

~~~
4.くちばしを描く: オレンジ色の小さな円を描いてくちばしを作ります。
~~~

~~~Python
    # Draw beak
    pen.up()
    pen.setpos(0, 45)
    pen.down()
    ring('orange', 8)
~~~

### 4.5 目の光っている部分？

~~~Python
   # Draw first eye
    pen.up()
    pen.setpos(-18, 77)
    pen.down()
    ring('white', 4)

    # Draw second eye
    pen.up()
    pen.setpos(18, 77)
    pen.down()
    ring('white', 4)
~~~

### 5.　お腹を描く　 〜体も描いてくれてえらい！〜

~~~
5.お腹を描く: 白色で大きな円を描いてペンギンのお腹を表現します。
~~~

~~~Python
    # Draw belly
    pen.up()
    pen.setpos(0, 35)
    pen.down()
    ring('white', 40)
~~~

* 顔を描くときと同じ座標に同じ大きさの白い円を描いてしまっているので、せっかく描いた顔が上書きされてしまっています。
* 位置を下にずらせば上手くいきそう。

### 6.　足を描く 〜足も描いてくれてえらい！〜

~~~
6.足を描く: オレンジ色で小さな円を描いて足を作ります。
~~~

~~~Python
    # Draw feet
    pen.up()
    pen.setpos(-15, -25)
    pen.down()
    ring('orange', 10)

    pen.up()
    pen.setpos(15, -25)
    pen.down()
    ring('orange', 10)
~~~

# まとめ
　ChatGPTがどうというよりも、最初のプロンプトが一番まずかった気がするので、プロンプトエンジニアリングを改めて学びたいなと思いました。文章の要約などは割と使い始めたんですが、まだまだですね…。
 
　ChatGPTで出力されたコードを使いこなすには、ある程度のコードの知識がないとどこが間違っているか分かりにくいなと思いました。ただ、その分、知識があれば大まかな形を作ってくれる＋補完してくれるのでコーディングがもっと楽になりそう！　と思います。

# おまけ

　最後に、ChatGPTが書いてくれたコードを参考にして、私もコードを書いてみました！
　元の要素を組み合わせると思ったよりも良い感じになりました！

https://qiita.com/awonohata/items/f2c489d2e22824dfc99b