So verwenden Sie GPT-4 zum Schreiben von Spielen (nehmen Sie das 24-Punkte-Spiel als Beispiel)

Inhaltsverzeichnis

Gib mir ein Blackjack-Spiel

Spielregeln

 Von GPT bereitgestellter Code

​Verbessern

 wieder verbessern


In letzter Zeit gab es eine Welle des GPT-4-Aufschwungs. Viele Leute wollen GPT-4 verwenden. Hier werde ich Werbung machen (hehe). Wenn Sie nicht wissen, wie man GPT in China verwendet, können Sie sich diesen Blog ansehen: GPT- 4 Kostenlose gemeinsame Nutzung von Methoden (Fortsetzung)_Ich liebe OJs Blog-CSDN-Blog

Wenn Sie derzeit GPT-4 verwenden möchten, ist ChatGPT Plus der Hauptkanal. Als Benutzer, der eine Abonnementgebühr bezahlt hat, können Sie ein Modell auswählen, das Sie während des Gesprächs verwenden möchten.

Ein weiterer Kanal besteht darin, die Warteschlange der offiziellen API zu beantragen. Als ich mich für Tongyi Qianwen bewarb, wurde meine Geduld vier oder fünf Tage lang gequält. Jeden Tag, wenn ich nach Hause ging, überprüfte ich gerne mein Telefon auf Textnachrichten. Also habe ich es nach der Anwendung dieses Mal beiseite gelegt. Überlassen Sie es Ihrem Schicksal, wann Sie den Antrag bestehen. (Dieses Mal werde ich das inländische GPT-3.5 zum Testen für alle verwenden.)

Gib mir ein Blackjack-Spiel

Spielregeln

„24 Uhr“ ist eine Art Pokerspiel, genau wie Schach und Go, eine Art Unterhaltung, die die Leute gerne hören und sehen.

Mit seinem ganz eigenen mathematischen Charme und seiner reichhaltigen Konnotation wird es nach und nach von immer mehr Menschen akzeptiert. Diese Art von Spiel ist leicht zu erlernen, kann das Gehirn und die Intelligenz stärken und ist eine äußerst wohltuende Aktivität.

Spezifischer Inhalt und Betriebsmethode

In einem Kartenspiel werden 52 Karten entfernt und 4 Karten zufällig gezogen, und die Zahl auf der Kartenoberfläche wird mithilfe von vier arithmetischen Operationen als 24 berechnet. Jede Karte kann nur einmal verwendet werden.

Spielfähigkeiten

1. Verwenden Sie zum Lösen 3×8=24, 4×6=24, 2×12=24.

Finden Sie eine Möglichkeit, die vier Zahlen auf der Karte zu 3 und 8, 4 und 6, 2 und 12 zusammenzusetzen, und multiplizieren Sie sie dann, um das Problem zu lösen. Die Praxis hat gezeigt, dass diese Methode die Methode mit der höchsten Auslastungsrate und der höchsten Trefferquote ist.

2. Verwenden Sie die Betriebseigenschaften 0 und 1, um das Problem zu lösen.

Beispielsweise können 3, 4, 4 und 8 3×8×(4÷4)=24 bilden. Ein weiteres Beispiel ist, dass 4, 7, 1, 1 4×1(7-1)×1=24 bilden kann.

3. Sehen Sie, ob es 2, 3, 4, 6, 8, Q,

Wenn ja, sollten Sie die Multiplikation in Betracht ziehen , um die verbleibenden drei Zahlen in entsprechende Zahlen umzuwandeln . Wenn es zum Beispiel zwei identische 6, 8, Q gibt, gibt es zwei 6er, solange der Rest zu 3, 4, 5, 24 gemacht werden kann. Wenn es zwei 8er gibt, kann der Rest gebildet werden in 2, 3, 4, es gibt bereits zwei Qs, solange der Rest 1, 2, 3 ausmachen kann, können Sie 24 berechnen, wie zum Beispiel (9, J, Q, Q). Wenn es keine 2, 3, 4, 6, 8, Q gibt, prüfen Sie zunächst, ob Sie eine der beiden Zahlen bilden können. Kurz gesagt, Multiplikation ist sehr wichtig und 24 ist die ganze Zahl mit den häufigsten Faktoren unter 30 .

4. Addiere und subtrahiere 4 Karten, um 24 zu erhalten.

5. Zuerst eine bestimmte Zahl multiplizieren, dann addieren und subtrahieren.

6. Während der Berechnung werden Punkte angezeigt. Es gibt eine Regel: Es seien 4 Zahlen a, b, c, d. Es muss ab+c=24 oder ab-c=24 d=a oder b geben. Wenn d=a, a(b+c/a)=24 oder a(bc/a)=24. Es gibt nur 17 Arten, die nur diese Methode verwenden können.

7. Im Berechnungsprozess erscheinen große Zahlen (über 30). Relativ schwierig, aber manchmal nur diese Lösung. Zum Beispiel ist (6, 9, 9, 10) 9×10÷6+9.

 Von GPT bereitgestellter Code

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
double eval(string s) // 计算字符串表达式的值
{
    int len = s.size();
    int p = 0; // 指向当前遍历到的位置
    double ans = 0.0; // 累计所有项的和
    int op = 1; // 当前符号的正负号,1表示加法或正号,-1表示减法或负号
    int last_op = 1; // 上一个符号的正负号
    double num = 0.0; // 当前遍历到的数值

    while(p < len)
    {
        char c = s[p];
        if(c == '+' || c == '-') // 遇到加减号
        {
            ans += op * last_op * num;
            num = 0.0;
            last_op = op = (c == '+') ? 1 : -1;
        }
        else if(c == '*' || c == '/') // 遇到乘除号
        {
            double next_num = 0.0;
            ++p;
            while(p < len && '0' <= s[p] && s[p] <= '9')
                next_num = next_num*10 + s[p++] - '0';
            num = (c == '*') ? num * next_num : num / next_num;
        }
        else if(c == '(') // 遇到左括号
        {
            int cnt = 1;
            int q = p + 1;
            while(q < len && cnt > 0)
            {
                if(s[q] == '(')
                    ++cnt;
                else if(s[q] == ')')
                    --cnt;
                ++q;
            }
            num = eval(s.substr(p+1, q-p-2));
            p = q;
        }
        else if(c == ' ') // 空格分隔符
        {
            ++p;
            continue;
        }
        else // 遇到数字
        {
            num = num*10 + c - '0';
            ++p;
        }
    }

    ans += op * last_op * num;

    return ans;
}
int main()
{
    srand(time(NULL)); // 初始化随机数生成器
    int a = rand()%9+1, b = rand()%9+1, c = rand()%9+1, d = rand()%9+1; // 生成四个1~9之间的整数
    cout << "请使用加、减、乘、除以及括号使得以下四个数构成算式的结果为24:" << endl;
    cout << a << " " << b << " " << c << " " << d << endl;

    bool found = false; // 标记是否找到合法的算式
    char ops[5] = {'+', '-', '*', '/'}; // 运算符集合
    for(int i=0; i<4 && !found; ++i) // 枚举第一个数到第四个数
        for(int j=0; j<4 && !found; ++j) // 枚举第二个数到第四个数
            if(j != i)
                for(int k=0; k<4 && !found; ++k) // 枚举第三个数到第四个数
                    if(k != j && k != i)
                        for(int l=0; l<4 && !found; ++l) // 枚举第四个数
                            if(l != k && l != j && l != i)
                            {
                                // 构造算式
                                string s = "";
                                s += to_string(a) + ops[i] + to_string(b) + ops[j] + to_string(c) + ops[k] + to_string(d);

                                // 枚举中间结果的算式
                                for(int i2=0; i2<4 && !found; ++i2)
                                    for(int j2=0; j2<4 && !found; ++j2)
                                        if(j2 != i2)
                                            for(int k2=0; k2<4 && !found; ++k2)
                                                if(k2 != j2 && k2 != i2)
                                                {
                                                    // 构造中间结果的算式
                                                    string s2 = "";
                                                    s2 += "(" + to_string(a) + ops[i] + to_string(b) + ")" + ops[i2] + "(" + to_string(c) + ops[j] + to_string(d) + ")" + ops[j2] + to_string(ops[k2] - '+' + '*');

                                                    // 计算结果
                                                    if(eval(s2) == 24)
                                                    {
                                                        cout << "恭喜您,找到了一个合法的算式:" << endl;
                                                        cout << s << " = " << eval(s) << endl;
                                                        found = true;
                                                    }
                                                }
                            }

    if(!found)
        cout << "很遗憾,没有找到合法的算式。" << endl;

    return 0;
}


Wenn es keinen Unfall gibt, wird es einen Unfall geben 

Ich habe jedoch lange im Internet gesucht und endlich weiß ich warum, weil meine C++-Version zu niedrig ist und die Lösung wie folgt sehr einfach ist

 Klicken Sie nacheinander auf das Menü: Extras -> Compiler-Optionen -> Codegenerierung/-optimierung (Einstellungen) -> Codegenerierung (Codegenerierung), suchen Sie den letzten Sprachstandard (Sprachstandard). Sie können sehen, dass die Zurück-Option standardmäßig leer ist.

Ziehen Sie die Optionsleiste herunter, wählen Sie ISO C++11 aus, klicken Sie auf „OK“ und kompilieren Sie dann ohne Fehler

 Nach dem Ausführen sieht es so aus:

Es ist ersichtlich, dass es kein Ausgabeergebnis gibt, also wurde ich wütend und sagte zu GPT

Verbessern

Unten finden Sie den korrigierten Code

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <vector>
using namespace std;

double eval(vector<string>& tokens) // 计算逆波兰表达式的值
{
    stack<double> nums;
    for(string& token: tokens)
    {
        if(token == "+") // 加法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 + num2);
        }
        else if(token == "-") // 减法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 - num2);
        }
        else if(token == "*") // 乘法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 * num2);
        }
        else if(token == "/") // 除法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 / num2);
        }
        else // 数字
        {
            nums.push(stod(token)); // stod() 可以将字符串转换为 double 类型
        }
    }

    return nums.top();
}

bool solve(vector<int>& nums, vector<string>& tokens) // 递归解决24点游戏
{
    if(nums.empty()) // 无数字剩余,得出解法
    {
        return eval(tokens) == 24;
    }

    for(int i=0; i<nums.size(); ++i)
    {
        int num = nums[i];
        nums.erase(nums.begin() + i); // 去掉当前数
        tokens.push_back(to_string(num)); // 转换为字符串并加入逆波兰表达式
        if(solve(nums, tokens)) // 尝试解决剩余的数字
            return true;
        tokens.pop_back();
        nums.insert(nums.begin() + i, num); // 还原当前数
    }

    return false;
}

int main()
{
    srand(time(NULL)); // 初始化随机数生成器
    vector<int> nums(4);
    for(int& num: nums)
        num = rand()%9+1; // 生成四个 1~9 之间的整数
    cout << "请使用加、减、乘、除以及括号使得以下四个数构成算式的结果为24:" << endl;
    cout << nums[0] << " " << nums[1] << " " << nums[2] << " " << nums[3] << endl;

    vector<string> tokens;
    if(solve(nums, tokens)) // 寻找解法
    {
        cout << "恭喜您,找到了一个合法的算式:" << endl;
        for(string& token: tokens)
            cout << token << " ";
        cout << "= 24" << endl;
    }
    else
    {
        cout << "很遗憾,没有找到合法的算式。" << endl;
    }

    return 0;
}

Ausgabeergebnis

 Natürlich ist diese Seite viel stärker, aber kann ich es so einfach machen, also stelle ich weiterhin Fragen:

 wieder verbessern

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <string>
#include <vector>

using namespace std;

double eval(vector<string>& tokens) // 计算逆波兰表达式的值
{
    stack<double> nums;
    for (string& token : tokens) {
        if (token == "+") // 加法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 + num2);
        }
        else if (token == "-") // 减法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 - num2);
        }
        else if (token == "*") // 乘法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 * num2);
        }
        else if (token == "/") // 除法
        {
            double num2 = nums.top();
            nums.pop();
            double num1 = nums.top();
            nums.pop();
            nums.push(num1 / num2);
        }
        else // 数字
        {
            nums.push(stod(token)); // stod() 可以将字符串转换为 double 类型
        }
    }

    return nums.top();
}

bool solve(vector<int>& nums, vector<string>& tokens, int step) // 递归解决24点游戏
{
    if (nums.empty()) // 无数字剩余,得出解法
    {
        if (eval(tokens) == 24)
        {
            cout << "恭喜您,找到了一个合法的算式:" << endl;
            for (string& token : tokens)
                cout << token << " ";
            cout << "= 24" << endl;
            return true;
        }
        else
        {
            return false;
        }
    }

    if (step == 0) // 已经尝试了 5 次,输出如何用这些数字组成 24
    {
        cout << "很遗憾,五次机会已用完。以下是如何用这些数字组成 24。" << endl;
        return false;
    }

    for (int i = 0; i < nums.size(); ++i) {
        int num = nums[i];
        nums.erase(nums.begin() + i); // 去掉当前数
        tokens.push_back(to_string(num)); // 转换为字符串并加入逆波兰表达式
        if (solve(nums, tokens, step - 1))
            return true;
        tokens.pop_back();
        nums.insert(nums.begin() + i, num); // 还原当前数
    }

    return false;
}

int main()
{
    srand(time(NULL)); // 初始化随机数生成器
    vector<int> nums(4);
    for (int& num : nums)
        num = rand() % 9 + 1; // 生成四个 1~9 之间的整数
    cout << "您有五次机会使用加、减、乘、除以及括号使得以下四个数构成算式的结果为 24:" << endl;
    cout << nums[0] << " " << nums[1] << " " << nums[2] << " " << nums[3] << endl;

    vector<string> tokens;
    bool found_solution = false; // 是否已经找到解法
    for (int i = 1; i <= 5; ++i) {
        cout << "第" << i << "次尝试:请输入您的算式(支持加减乘除和括号):" << endl;
        string input;
        getline(cin, input);
        tokens.push_back(input); // 将输入的字符串加入 vector 中
        if (eval(tokens) == 24)
        {
            cout << "恭喜您,找到了一个合法的算式:" << endl;
            cout << input << " = 24" << endl;
            found_solution = true;
            break;
        }
        else if (i < 5)
        {
            cout << "计算结果不为 24,请继续尝试。" << endl;
        }
        tokens.pop_back(); // 将输入的字符串从 vector 中弹出
    }

    if (!found_solution) // 五次机会用完,输出如何用这些数字组成 24
    {
        vector<string> empty_tokens;
        if (solve(nums, empty_tokens, 5))
        {
            // 已经在函数中输出了解法
        }
        else
        {
            cout << "无法组成 24,以下是如何使用这些数字组成 24:" << endl;
            // 输出如何用这些数字组成 24 的方法
            // ...
        }
    }

    return 0;
}

 GPT nimmt die Änderung des Codes wirklich ernst und der Laufeffekt ist wie folgt

 Ich kann mir einen Seufzer nicht verkneifen: Was kann man sonst noch C++ lernen?

Natürlich kann jeder erfahrene Programmierer auf die verschiedenen Mängel der GPT-4-unterstützten Programmierung hinweisen und dann behaupten, dass sie niemals einen hervorragenden Entwickler ersetzen kann.

Vergessen Sie nicht, dass GPT-4 erst seit weniger als einem Jahr veröffentlicht wird und viele große Sprachmodelle sich immer noch rasant weiterentwickeln. Und wer hat gesagt, dass das Ziel darin besteht, „hervorragende Entwickler“ zu ersetzen?

Derzeit habe ich keine Antwort. Möchten Sie Ihre Meinung hören? Hinterlassen Sie gerne eine Nachricht, lassen Sie uns gemeinsam austauschen und diskutieren

Ich denke du magst

Origin blog.csdn.net/qiuweichen1215/article/details/130905196
Empfohlen
Rangfolge