[AI #1]ChatGPTでプログラムを組ませてみた

## はじめに
こんにちは
今回はAI編で**ChatGPT**についてご紹介したいと思います。
ChatGPTは**簡単で気軽に使用できる**ので便利だなと感じてます。
そんなChatGPTに**プログラムを組ませたらどんな返答がくるか**を検証したいと思います。

## ChatGPTとは
ChatGPTとは**Chat Generative Pre-trained Transformer**の略称であり、OpenAIが開発した生成AIによる「<font color=red>**対話型のチャットサービス**</font>」です。
従来の人工知能からとても技術が向上し、**人間を相手にするのとほとんど遜色ないレベルで対話を行える**のが大きな特徴と思います。

## ChatGPTの<font color=red>得意分野</font>
①既存の文章の要約
→文章を要約して**短い文章に書き換えることが最も得意**とされています。

②テキストの誤字脱字のチェック
→**文章の添削も得意**としていて、誤字脱字や日本語表現のおかしな部分を丁寧に添削してくれます。しかし**文章量が多いと途中で省かれるので注意が必要**です。

③外国語の翻訳や文章作成
→ChatGPT以外にも翻訳ツールはありますが、文章の意図やニュアンスまで指定できるので、柔軟に活用ができます。

④<font color=red>**プログラムコードの作成**</font>
今回のお題でもある**プログラムの作成**ができます。
複雑なコードの作成はできませんし、手直しをしないと上手く実行されないのが大半ですが、**手間かけずに作成したい**という方に向いております。こちらは後ほど実践いたします。

## ChatGPTの<font color=blue>苦手分野</font>
①最新の情報の出力
→最新への情報の対応が苦手であり、時事的な話題は**正確性を欠くことが多い**です。

②実在の人物、店舗、作品などの認識
→これらの情報をアウトプットする際に、誤情報が含まれていることが多いです。

③独創的なアイデア
→ChatGPTが出力する情報は必然的に**Webにある情報の平均値**となるため、アイデアや表現の品質としては、どこまでも凡庸の域を出ません。なので、人間による手直しはほぼ必要でしょう。

④マイナーな話は注意
→Webから充分な情報を取得できないとアウトプットの質が大幅に低下します。

## プログラムを組ませてみた
では今回のお題でもある **「ChatGPTにプログラムを組ませてみた」** をやっていきたいと思います。やり方はとても簡単です。ChatGPTに**どんな処理をさせたいか**オーダーを出します。
それだけです！
![スクリーンショット 2024-06-10 175933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/31ea990d-5872-6903-fcf1-d4e7edd49898.png)
[**ChatGPTはこちら**](https://chatgpt.com/)
まず登録したいアカウントでChatGPTを開きます（私はGoogleアカウントを用いて開きました）。開けたら上図のような画面になるかと思います。
一番下の「**ChatGPTにメッセージを送信する**」の部分で記載していきます。

今回はChatGPTに「**[C言語](https://hnavi.co.jp/knowledge/blog/c/)**」でプログラムの作成をしてもらおうと思います。
ここで注意点ですが要件は「**なるべく具体的に記載すること**」です。
あまりにも抽象的な内容だと受け取る側もよく理解できていない状態でコードを生成してしまいます。
![スクリーンショット 2024-06-10 234405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/69996f58-405f-2e32-1e21-dc6c1a1075e1.png)
今回はChatGPTにこのオーダーを出したいと思います。
複雑なソースコードは難しいためキー入力でオブジェクトが移動するというシンプルなオーダーにしました。ではどんなお返事が来たか確認してみましょう。
![スクリーンショット 2024-06-10 234652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/7ca23061-c69b-ced4-bb8d-f86726442749.png)
なんとオーダーの内容を確認し、GPT側で概要を定義しております。
そして以下がGPTの書いたコードになります。
```c
#include <stdio.h>
#include <stdlib.h>

// 点を表す構造体
typedef struct {
    int x;
    int y;
} Point;

// 点を指定した距離だけ移動させる関数
void move_point(Point *p, int dx, int dy) {
    p->x += dx;
    p->y += dy;
}

// 画面をクリアする関数
void clear_screen() {
    // Windowsの場合は system("cls") を使用
    // Linux/Unix/macOSの場合は system("clear") を使用
    system("clear");  // or system("cls");
}

// 現在の位置を表示する関数
void display_position(Point p) {
    printf("Current position: (%d, %d)\n", p.x, p.y);
    printf("Use WASD keys to move (W: up, A: left, S: down, D: right), Q to quit.\n");
}

int main() {
    Point p = {0, 0};  // 初期位置は (0, 0)
    char input;

    clear_screen();
    display_position(p);

    while (1) {
        input = getchar();  // キー入力を取得

        // 改行を無視
        if (input == '\n') {
            continue;
        }

        switch (input) {
            case 'w':  // 上へ移動
                move_point(&p, 0, -1);
                break;
            case 's':  // 下へ移動
                move_point(&p, 0, 1);
                break;
            case 'a':  // 左へ移動
                move_point(&p, -1, 0);
                break;
            case 'd':  // 右へ移動
                move_point(&p, 1, 0);
                break;
            case 'q':  // 終了
                return 0;
            default:
                printf("Invalid input. Use WASD keys to move, Q to quit.\n");
                break;
        }

        clear_screen();
        display_position(p);
    }

    return 0;
}

```
たったの数秒でそこそこあるコードを記載してくれました。
では早速エラーが無いか**ビルド**をかけて確認してみましょう

※ビルド -> プロジェクト全体をコンパイルして実行モジュールを生成する操作（ショートカットキーはCtrl + B）
![スクリーンショット 2024-06-11 091711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/ff8db93a-3e89-1d2f-2cf4-824d7bd3fe94.png)
ビルドが正常に完了するとこのような表示になるかと思います。
では実行結果を見てみましょう。
## 実行結果
![スクリーンショット 2024-06-11 130154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/eee6c9cb-40ee-bcf6-686e-553aa826f59b.png)
実行画面に表示されている「Current position:(0,0)」は**現在位置（座標）** を示しています。
実行時は初期位置が「(0,0)」とあるので図で説明すると最初はこの赤点の位置にいます。
![AI_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/814b7a7d-d539-a7db-1c37-e353af6cbc05.png)
では実行画面に戻ってキー入力でオブジェクトを移動させます。
![スクリーンショット 2024-06-11 130302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/e02aabb2-a891-030e-c01a-965a3586f482.png)

「dキー」を入力してEnterキーを押します。そして右に1つオブジェクトが移動できるか確認します。正しくできた場合、x座標で正の向きに1つ移動するので「Current position:(1,0)」となるはずです。
![スクリーンショット 2024-06-11 130358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/c38f4cd4-8f94-7918-5234-8ced9918622f.png)
正しく表示されましたね。残りの方向（上、左、下）でも試してみます。
![スクリーンショット 2024-06-11 140419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/73859fa3-2f29-a5ad-ab37-33c4e7f1c206.png)

こちらも各方向に正しく移動できているのが確認できました。
因みに原点(0,0)にいる時、上方向(up)や左方向(left)は負の向きとなり「－（マイナス）」の値が返ってきます。(upが負の方向でdownが正の方向ってなんかややこしいですね:sweat_smile:)
### おまけ
![スクリーンショット 2024-06-11 101258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/f4d9797c-bb14-a787-eae8-372f080f59ae.png)
先ほどまでは1字ずつ入力して実行していましたが、一気に複数入力して結果を見たいと思います。試しに「wwasssdd」と入力しました。
この場合各方向ずつ区切ると
ww → Y座標負の方向に2移動(0,-2)
a → X座標負の方向に1移動(-1,-2)
sss → Y座標正の方向に3移動(-1,1)
dd → X座標正の方向に2移動(1,1)
従って座標は(1,1)となるはずです。
![スクリーンショット 2024-06-11 140237.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/dbadc9e5-cfc4-bb90-ecbe-f6773a375bfb.png)
一番下で「Current position: (1,1)」と表示されているので正しい値が返ってきました。
とりあえずオーダー通りのプログラムが作成されて正常に動作できたので成功と言って良いと思います。:upside_down:
## おわりに
AIはプログラムだけでなく絵を描かせたり:writing_hand:、作曲させたり:musical_note:、Webサイト:desktop:を構築させたりと・・・クリエイティブなものが自動生成できる時代ですし、これからもその技術は向上していくと考えています。そして最近だと「[ChatGPT-4o](https://www.ai-souken.com/article/summary-of-chatgpt-updates)」が出て、より人間に近いAIと話すことができるニュースを見て驚きましたね。:open_mouth:

しかし便利な時代だからこそ変に悪知恵が効くこともできるので、扱いには充分注意が必要だと改めて感じました。
最後までお読みいただきありがとうございました！


> **「参考サイト」**
[ChatGPTで何ができる？](https://x.gd/8KtrH)

> **「参考サイト」**
[ChatGPTでプログラミングをするコツ](https://www.onamae.com/business/article/12459/)