suna8’s blog

還暦を過ぎたジジーの気まぐれ日記

『ChatGPT』を試してみた

なにげにYouTubeを見たら、パソコン博士TAIKI氏(自称で博士って…)の下記の動画が目に入って来たので、『ChatGPTって実際どうなの?と思って見ていたら何やらすごい感じだと分かったので、自分でも試してみることにした。

【絶対使え!】驚異のAI!ChatGPTにの能力とは?【チャットGPT】

youtu.be

 

基本的には既存の検索エンジンの進化形なのだが、対話形式で知りたいことを教えてくれる。上記の動画の中で目立ったのがニュース記事などの長い文章を要約してくれる機能で、でもこれは専門の要約アプリも従来から存在していたのでそう驚かなかったが、そういう単一機能ではなく、チャット形式で様々な機能を実現しているようで、要約はその中の1つでしかない。

次の例として、プログラムを作らせるというのが登場して、思わず画面を見入ってしまった。実際にサイコロゲーム(簡単ではあるが)をC#とHTMLで作らせると、ちゃんと稼働するコードが表示されたのだ。これには驚いたが、おそらくネットにアップされている数多くのコードの中から最適なものを選んでコピペしているのだろう。それでも今まで地道に探していた作業が一気に時間短縮できる。

実際、Java言語のサンプルソースを探すことが多い(仕事上)ので、試しに『3目並べ』を例としてやってみたら、エラーなく稼働するソースコードが表示されたのだ。しかも、IDE風な色分け表示までして。

"お願い"するだけで目的を果たしてくれるのは超便利!

実際に表示されたコード全体は以下のとおり(Eclipseに読み込ませた後、多少編集している)。

import java.util.Scanner;

//  program by ChatGPT
public class TicTacToe {

    // ボードのサイズ
    private static final int BOARD_SIZE = 3;
    // ボードの状態を表す配列
    private static char board = new char[BOARD_SIZE][BOARD_SIZE];
    // 現在のプレイヤー
    private static char currentPlayer = 'X';
    // ゲームが終了したかどうか
    private static boolean gameEnded = false;

    public static void main(String[] args) {
        initializeBoard();
        printBoard();
        while (!gameEnded) {
            playerMove();
            printBoard();
            checkForEndOfGame();
            switchPlayers();
        }
    }

    // ボードを初期化する
    private static void initializeBoard() {
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                board[i][j] = '-';
            }
        }
    }

    // ボードを表示する
    private static void printBoard() {
        System.out.println("-------------");
        for (int i = 0; i < BOARD_SIZE; i++) {
            System.out.print("| ");
            for (int j = 0; j < BOARD_SIZE; j++) {
                System.out.print(board[i][j] + " | ");
            }
            System.out.println();
            System.out.println("-------------");
        }
    }

    // プレイヤーが移動する
    private static void playerMove() {
        System.out.println("現在のプレイヤー: " + currentPlayer);
        Scanner scanner = new Scanner(System.in);
        int row, col;
        do {
            System.out.println("行と列を入力してください(例:1 2)");
            row = scanner.nextInt() - 1;
            col = scanner.nextInt() - 1;
        } while (row < 0 || row >= BOARD_SIZE || col < 0 || col >= BOARD_SIZE || board[row][col] != '-');
        board[row][col] = currentPlayer;
    }

    // ゲームが終了したかどうかをチェックする
    private static void checkForEndOfGame() {
        if (checkForWin() || checkForDraw()) {
            gameEnded = true;
            System.out.println("ゲーム終了!");
        }
    }

    // 勝利条件をチェックする
    private static boolean checkForWin() {
        if (checkRowsForWin() || checkColumnsForWin() || checkDiagonalsForWin()) {
            System.out.println("プレイヤー " + currentPlayer + " の勝利!");
            return true;
        }
        return false;
    }

    // 行に勝利条件があるかをチェックする
    private static boolean checkRowsForWin() {
        for (int i = 0; i < BOARD_SIZE; i++) {
            if (board[i][0] != '-' && board[i][0] == board[i][1] && board[i][1] == board[i][2]) {
                return true;
            }
        }
        return false;
    }

    // 列に勝利条件があるかをチェックする
    private static boolean checkColumnsForWin() {
        for (int i = 0; i < BOARD_SIZE; i++) {
            if (board[0][i] != '-' && board[0][i] == board[1][i] && board[1][i] == board[2][i]) {
                return true;
            }
        }
        return false;
    }

    // 斜めに勝利条件があるかをチェックする
    private static boolean checkDiagonalsForWin() {
        if (board[0][0] != '-' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
            return true;
        }
        if (board[0][2] != '-' && board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
            return true;
        }
        return false;
    }

    // 引き分けかどうかをチェックする
    private static boolean checkForDraw() {
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                if (board[i][j] == '-') {
                    return false;
                }
            }
        }
        System.out.println("引き分け!");
        return true;
    }

    // プレイヤーを切り替える
    private static void switchPlayers() {
        currentPlayer = currentPlayer == 'X' ? 'O' : 'X';
    }
}

まあ、テキストベース(コンソール表示)の人間同士が対戦するミニマムな仕様だが、ちゃんと勝敗判定もしているし(たいていは引き分けのゲームではあるが)、なかなかすごいと思った。

Eclipse での実行結果

ちなみに、例として挙げた『3目並べ』(TicTacToe)は、1980年代の映画『WARGAMES』に出てくるが、この映画に登場する戦略用コンピュータ”WAPR”はこの時代にすでに人工知能的な会話が出来ていたので(もちろん架空ではあるが)、やっと現実が追いついた感じなのかな、と。

youtu.be (ネタバレ注意)

 

来月(2023年3月)には、Microsoft検索エンジンである「Bing」と連携するらしいので、どのような形で提供されるのか興味深い。

 

他の実例(および解説)も見つかったので参考までに。

dapanblog.com