AIでプログラミングをやってみた！

日付：2022/10/05
分類：AI プログラミング　主にc++
場所：https://aiprogrammer.hashlab.jp/
前提：なし、多少のプログラム知識
名称：AI Programmer
社名：有限会社ASReal

AIの文章理解力とプログラム作成能力をチェックしてみました。

感想はとにかくすげーのひとこと、

細かいことや、いろんな言語を覚える必要が無くなり、プログラマの仕事が大きく変わりそうです。


以下は詳細です。

# 最小値をもとめる


与えた文章:
配列「３，６，７，２」のなかで一番小さい数字を出す

AIの出したコード：
```diff_cpp
#include <iostream>
using namespace std;

int main() {
  int array[4] = {3, 6, 7, 2};
  int min = array[0];

  for (int i = 1; i < 4; i++) {
    if (array[i] < min) {
      min = array[i];
    }
  }

  cout << min << endl;
}

```
感想：完璧だ！感想はあくまで私個人の感想です（以下同）



### ゲーム制作

与えた文章:
インベーダーゲームを作る

AIの出したコード：
```diff_cpp
#include <iostream>
using namespace std;

int main() {
cout << "Hello, world!" << endl;
return 0;
}
```
感想:
これはぜんぜん想定と違う結果、流石に無茶振りでした



### 配列の中身を大きい順に並べて表示

与えた文章:
配列の中身を大きい順に並べ替える関数を作成してください。
配列の中身を表示する関数を作成してください。

AIの出したコード：
```diff_cpp
#include <iostream>
using namespace std;

void printArray(int array[], int size) {
for (int i = 0; i < size; i++) {
cout << array[i] << " ";
}
cout << endl;
}

void sort_big(int array[], int size) {
for (int i = 0; i < size; i++) {
for (int j = i + 1; j < size; j++) {
if (array[i] < array[j]) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
}

int main() {
int array[] = {3, 6, 7, 2,8,2,1,3};
int size=sizeof(array)/sizeof(int)   ; 
sort_big( array,  size);
printArray( array ,size);
}
```
感想:
これは実は人の手を加えつつ作成しています。
１つ１つの文章から関数をつくって組み合わせてみました。
関数を組み合わせる能力は要求されるが、プログラマは言語のこまかい規則を覚えなくて良くなるという点でかなりたすけになりますね！


### クラス作成

与えた文章:

「名前、年齢、性別、ID番号」を持つ社員クラスを作成してください

AIの出したコード：
```diff_cpp
class Employee {
public:
  string name;
  int age;
  string gender;
  int id;
};
```
感想:
おおおークラスを理解しているのか！
しかもすらすら書きやがって、おれなんかクラスがかけるまでに20年もかかったというのにｗ

### クラスを適当なデータで実体化
与えた文章:
「名前、年齢、性別、ID番号」を持つ社員クラスを作成、３人分インスタンスを作成してください

AIの出したコード：
「名前、年齢、性別、ID番号」を持つ社員クラスを作成、３人分インスタンスを作成し、それぞれの情報を出力する
```diff_cpp
#include <iostream>

class Employee {
    public:
        std::string name;
        int age;
        std::string gender;
        int id;
};

int main() {
    Employee e1, e2, e3;

    e1.name = "John";
    e1.age = 25;
    e1.gender = "Male";
    e1.id = 1;

    e2.name = "Jane";
    e2.age = 32;
    e2.gender = "Female";
    e2.id = 2;

    e3.name = "Mike";
    e3.age = 41;
    e3.gender = "Male";
    e3.id = 3;

    std::cout << "Name: " << e1.name << ", Age: " << e1.age << ", Gender: " << e1.gender << ", ID: " << e1.id << std::endl;
    std::cout << "Name: " << e2.name << ", Age: " << e2.age << ", Gender: " << e2.gender << ", ID: " << e2.id << std::endl;
    std::cout << "Name: " << e3.name << ", Age: " << e3.age << ", Gender: " << e3.gender << ", ID: " << e3.id << std::endl;

    return 0;
}
```
--------------プログラムの実行結果--------------

Name: John, Age: 25, Gender: Male, ID: 1
Name: Jane, Age: 32, Gender: Female, ID: 2
Name: Mike, Age: 41, Gender: Male, ID: 3

--------------
感想：これは震撼する！　もとの文章を補完してくれて、さらに３人分てきとうなデータを用意して、結果を表示
かなり楽だが、下手なプログラマはいらなくなる感じ、やばい！




### 簡易RPGをつくってみる

与えた文章:

「名前、体力、攻撃力、防御力」を持つモンスタクラスを作成、３匹分インスタンスを作成し、バトルさせてください
AIの出したコード：

```diff_cpp


class Monster {
public:
string name;
int hp;
int attack;
int defense;
};

Monster monster1;
Monster monster2;
Monster monster3;
```
--------------
感想：さすがにバトルだけじゃ無理だ！



### 簡易RPGをつくってみる、文章の改良版
与えた文章:

「名前、体力、攻撃力、防御力」を持つモンスタクラスを作成、３匹分適当なデータでインスタンスを作成し、バトルさせてください。

AIの出したコード：
```diff_cpp
class Monster {
public:
string name;
int hp;
int attack;
int defense;
};

Monster m1 = {"スライム", 10, 3, 2};
Monster m2 = {"ゴブリン", 15, 5, 3};
Monster m3 = {"ドラゴン", 100, 20, 15};
```
--------------感想--------------
文章を変えてみたが、やはり無理っぽい！	でも適当なデータで埋めるのはすごい、しかもattackやdefenceはHPよりも小さな値になっている！
これってどこで学習したんだろうか




### 文章の改良版
与えた文章：

「名前、体力、攻撃力、防御力」を持つモンスタクラスを作成、３匹分適当なデータでインスタンスを作成し、それぞれを戦わせてください。
戦いとは敵の体力を削ることです。ダメージは敵の攻撃力まいなす自分の防御力で決まり、体力からダメージを引きます

AIの出したコード：
```diff_cpp

class Monster {
public:
    std::string name;
    int HP;
    int attack;
    int defense;
};

int main() {
    Monster monster1, monster2, monster3;

    monster1.name = "モンスター1";
    monster1.HP = 10;
    monster1.attack = 5;
    monster1.defense = 2;

    monster2.name = "モンスター2";
    monster2.HP = 20;
    monster2.attack = 10;
    monster2.defense = 5;

    monster3.name = "モンスター3";
    monster3.HP = 30;
    monster3.attack = 15;
    monster3.defense = 10;

    while (true) {
        // モンスター1の攻撃
        int damage = monster1.attack - monster2.defense;
        monster2.HP -= damage;
        std::cout << monster1.name << "は" << monster2.name << "に" << damage << "のダメージを与えた" << std::endl;

        // モンスター2の攻撃
        damage = monster2.attack - monster3.defense;
        monster3.HP -= damage;
        std::cout << monster2.name << "は" << monster3.name << "に" << damage << "のダメージを与えた" << std::endl;

        // モンスター3の攻撃
        damage = monster3.attack - monster1.defense;
        monster1.HP -= damage;
        std::cout << monster3.name << "は" << monster1.name << "に" << damage << "のダメージを与えた" << std::endl;

        if (monster1.HP <= 0 && monster2.HP <= 0 && monster3.HP <= 0) {
            std::cout << "モンスターは全滅した" << std::endl;
            break;
        }
    }
    return 0;
}
```
感想：
まだ想定通りになってはいないが、かなり近づいてきています！
というか俺の与えた文章じゃこうなるわなー、文章の与え方が、肝になる、当たり前かｗ
ダメージの計算方法は想定通りにやってくれていて驚きです！



### 文章の改良、その２
与えた文章:
「名前、体力、攻撃力、防御力」を持つモンスタクラスを作成、２匹分適当なデータでインスタンスを作成し、それぞれを戦わせてください。
戦いとは敵の体力を削ることです。ダメージは敵の攻撃力まいなす自分の防御力で決まり、体力からダメージを引きます。
一方の体力がゼロになったところで勝負が決まります

AIの出したコード：

```diff_cpp

#include <iostream>
#include <string>
using namespace std;

class Monster {
public:
    string name;
    int HP;
    int attack;
    int defense;
};

int main() {
    Monster monster1, monster2;
    monster1.name = "モンスター1";
    monster1.HP = 100;
    monster1.attack = 10;
    monster1.defense = 5;
    monster2.name = "モンスター2";
    monster2.HP = 120;
    monster2.attack = 8;
    monster2.defense = 4;
    int damage;
    while(true) {
        damage = monster2.attack - monster1.defense;
        monster1.HP -= damage;
        cout << monster1.name << "は" << damage << "のダメージを受けた" << endl;
        if(monster1.HP <= 0) {
            cout << monster2.name << "は" << monster1.name << "との戦いに勝利した" << endl;
            break;
        }
        damage = monster1.attack - monster2.defense;
        monster2.HP -= damage;
        cout << monster2.name << "は" << damage << "のダメージを受けた" << endl;
        if(monster2.HP <= 0) {
            cout << monster1.name << "は" << monster2.name << "との戦いに勝利した" << endl;
            break;
        }
    }
    return 0;
}
```

感想：
#include <iostream>
#include <string>
using namespace std;
は追加したが、あとは全自動で、ほぼ想定通りでした。
プログラムの実行結果は以下の通りです

--------------
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1は3のダメージを受けた
モンスター2は6のダメージを受けた
モンスター1はモンスター2との戦いに勝利した



### ついにここまで来たか、という感じです。ただし、現時点では仕事を分割してAIが作りやすい形にもっていってあげる必要はありますね。なのでプログラマとしては根底となる仕組みの理解がますます重要になりそうです。