suna8’s blog

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

やっぱり趣味のプログラミングは楽しい(Part4)

Part3より

 

やはりというか、ChatGPTは万能ではないということで(もともと文章を生成する機能に特化したものだし)諦めればいいのに、しつこく再度トライすることにしました。

RubyでだめならPrologがあるさ」

ということで、今度はこんな感じで、ChatGPTにお願いしました。

 

以下のPrologのプログラムをJava言語に書き換えてください。

%;;;; -*-   coding: utf-8 -*-
%
% tofu.prolog  -  イスカンダルのトーフ屋ゲーム(Prolog版)
%   by たけおか (take at takeoka.net)
%   ver.1.0
%   2012/DEC/09
%  for SB-Prolog or GNU Prolog
%
% Copyright (C) 1978 - 2000 by Nobuhide Tsuda
% http://vivi.dyndns.org/tofu/tofu.html
% 著作権は津田伸秀さん (ntsuda@beam.ne.jp) にあります。
%
% この Prolog版は、たけおか しょうぞうが、
% 永野圭一郎氏の(gano@is.s.u-tokyo.ac.jp) perl版 tofu.plを元に
% 書き直したものです。
%
%
% consult('/home/take/src/tofuya/tofu-prolog/tofu.prolog').
% ?- tofu.

% millisleep
%#+sbcl (defun millisleep(x) (sleep (/ x 1000)))
millisleep(X) :- XX is X/1000.0, sleep(XX).


% 乱数初期化
:- dynamic(irandom/2).
defRand :- retractall(irandom(_,_)),defRand1.
defRand :- defRand1.

defRand1 :-
    current_prolog_flag(prolog_name,'GNU Prolog'),
    %%for GnuProlog
    !,asserta((irandom(R,N) :- !,random(RR),R is floor(RR * N + 0.0))).
defRand1 :-
    %%for SWIProlog
    !,asserta((irandom(R,N) :- (!,R is random(N)))).

% 0 - 100の整数乱数
random100(R) :- irandom(R, 101).

(以下略)

 

以下はJava言語に書き換えたプログラムです。

import java.util.Random;
import java.util.Scanner;

public class TofuGame {
    private static Random random = new Random();

    private static void millisleep(long milliseconds) {
        try {
            Thread.sleep(milliseconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static int random100() {
        return random.nextInt(101);
    }

    private static int calc(int comp, int hare, int ame) {
        int x;
        if (hare >= 50) {
            x = 500;
        } else if (ame > 30) {
            x = 100;
        } else {
            x = 300;
        }
        return Math.min(comp / 40, x);
    }

    private static void disp(String str) {
        System.out.print(str);
    }

    private static void displn(String str) {
        System.out.println(str);
    }

    private static void dispShojikin(String name, int gold) {
        int ggg = gold / 1000;
        System.out.print("   " + name + " " + gold + " 円  ");
        for (int i = 0; i < ggg; i++) {
            System.out.print("■");
        }
        for (int i = 0; i < Math.max(30 - ggg, 0); i++) {
            System.out.print("□");
        }
        System.out.println();
    }

    private static void dispYohou(int hare, int kumori, int ame) {
        int hhh = hare * 10 / 25;
        int kkk = kumori * 10 / 25;
        int aaa = 1000 / 25 - (hhh + kkk);
        System.out.println();
        System.out.println("明日の天気予報: 晴れ " + hare + "%  くもり " + kumori + "%  雨 " + ame + "%");
        for (int i = 0; i < hhh; i++) {
            System.out.print("◎");
        }
        for (int i = 0; i < kkk; i++) {
            System.out.print("・");
        }
        for (int i = 0; i < aaa; i++) {
            System.out.print("●");
        }
        System.out.println();
    }

    private static int inpTofu(int limit) {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.print("トーフを何個作りますか?(1〜" + limit + ")> ");
            int x = scanner.nextInt();
            if (x > 0 && x <= limit) {
                return x;
            }
        }
    }

    private static int profit(int n, int sold) {
        return Math.min(sold, n) * 50 - (n * 40);
    }

    private static void dispResult(int player, int comp) {
        if (player > comp) {
            System.out.println("あなたの勝ちです。");
        } else if (player < comp) {
            System.out.println("コンピュータの勝ちです。");
        } else {
            System.out.println("引き分けです。");
        }
    }

    private static void tofu() {
        defRand();
        displn("イスカンダルのトーフ屋ゲーム (Java版)");

 

(中略)

 

このように修正することで、プレイヤーとコンピュータのトーフの作成、天候の設定、利益の計算などが行われます。ゲームは所持金が30,000円以上になるかどちらかの勝利条件が満たされるまで続きます。

(ChatGPT)

 

と、うまく行きそうに思えたのですが、必要となるメソッドが何故か抜けているのです。

 

calc メソッドを表示して

申し訳ありませんが、提供されたコードには calc メソッドが含まれていません。おそらく、別のコードやメソッドを参照している可能性があります。もしくは、calc メソッドについて詳細な説明を教えていただければ、その内容に基づいてお手伝いできるかもしれません。ご提供いただいた情報が不十分な場合は、追加の詳細を教えていただけますか?

(ChatGPT)

 

いやいや、元のソースコードにcalcメソッドに相当する部分は含まれていますよ。どこかで抜け落ちたのだろうということで、今度はChatGPTが生成したJava言語のソースを貼り付けてみたのです。

 

このJavaのコードを正しく修正してください。

import java.util.Random;
import java.util.Scanner;

public class TofuGame {
    private static Random random = new Random();

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("イスカンダルのトーフ屋ゲーム (Java版)");
        System.out.println("ルール説明しますか?[y/n]");
        String input = scanner.nextLine();
        if (input.equalsIgnoreCase("y")) {
            displayRules();
        }
        tofu();
        System.out.println("プレイを続けますか?[y/n]");
        input = scanner.nextLine();
        if (input.equalsIgnoreCase("y")) {
            main(args);
        }
    }

(以下略)

 

修正されたコードは以下の通りです。

(コードは略)

これで修正が完了しました。修正したコードを試してみてください。修正内容は、不要なmainメソッドを削除し、calcメソッドを追加している点です。また、関数名の日本語表記を英語表記に修正しています。

ご不明な点があれば、遠慮なくお知らせください。

(ChatGPT)

 

なんとなくうまく行ったような末尾の文章でしたが、結局は未完成のプログラムでしかなかったのです。当然でしょうね。もともと仕様が不明だと言って抜け落ちていたcalcメソッドを何の情報も与えない状況で”勝手に生成”したのですから。

 

Part5へつづく