如何用 GPT-4 帮你写游戏(以24点游戏举例)

目录

给我一个24点游戏

游戏规则

 GPT给的代码

​改进

 再改进


最近呢掀起了一阵GPT-4的热潮,很多人都想用GPT-4,这里呢我就打一个广告(嘿嘿),如果不知道国内如何使用GPT的,可以看看这个博客:GPT-4的免费使用方法分享(续)_我爱OJ的博客-CSDN博客

目前你想要用上 GPT-4,主要的渠道是 ChatGPT Plus 。作为交了订阅费的用户,你可以在对话的时候选择模型来使用。

另一种渠道,就是申请官方 API 的排队。我在申请通义千问的时候,耐心被折磨了4,5 天了,每天回家都兴致勃勃的看手机有没有短信。所以这次申请完就放在一边了。啥时候通过申请,听天由命吧。(所以这次我就拿国内的GPT-3.5来为大家测试)

给我一个24点游戏

游戏规则

“24点”是一种扑克牌游戏,正如象棋、围棋一样是一种人们喜闻乐见的娱乐活动。

它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受。这种游戏方式简单易学,能健脑益智,是一项极为有益的活动。

具体内容及操作方法

一副牌中抽去大小王剩下52张,任意抽取4张牌,利用四则运算把牌面上的数算成24。每张牌能且只能用一次。

游戏技巧

1.利用3×8=24、4×6=24、2×12=24求解。

把牌面上的四个数想办法凑成3和8、4和6、2和12,再相乘求解。实践证明,这种方法是利用率最大、命中率最高的一种方法。

2.利用0、1的运算特性求解。

如3、4、4、8可组成3×8×(4÷4)=24。又如4、7、1、1可组成4×1(7-1)×1=24。

3.看4张牌中是否有2,3,4,6,8,Q,

如果有,考虑用乘法,将剩余的3个数凑成对应数。如果有两个相同的6,8,Q,比如已有两个6,剩下的只要能凑成3,4,5都能算出24,已有两个8,剩下的只要能凑成2,3,4,已有两个Q,剩下的只要能凑成1,2,3都能算出24,比如(9,J,Q,Q)。如果没有2,3,4,6,8,Q,看是否能先把两个数凑成其中之一。总之,乘法是很重要的,24是30以下公因数最多的整数。

4、将4张牌加加减减得到24。

5、先相乘再加、减去某数。

6、在计算过程中有分数出现。有一个规律,设4个数为a,b,c,d。必有ab+c=24或ab-c=24 d=a或b。若d=a 有a(b+c/a)=24 或 a(b-c/a)=24。只能用此法的只有17种。

7、在计算过程中有较大数(30以上)出现。相对较难,但有时也只有该解法。比如(6,9,9,10)为9×10÷6+9。

 GPT给的代码

#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;
}

不出意外的话意外就要来了 

但是但是,我上网找了半天,终于知道为什么了,因为我的C++版本太低了,解决办法也很简单 ,如下

 依次点击菜单:工具(Tools)->编译选项(Compiler Options) -> 代码生成/优化(Settings) ->代码生成( Code Generation),找到最后一项语言标准(即Language standard),可以看到后面的选项默认是空的。

下拉选项栏,选中ISO C++11,点击确定后再进行编译就不会报错了

 运行后是这样的:

可以看到,没有输出结果,这时我就来气了,就对GPT说

改进

下面是改正后的代码

#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;
}

输出结果

 很明显,这边已经强多了,但是我能让它这么轻而易举吗,于是我继续提问题:

 再改进

#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真的很认真修改代码,之后运行效果是这样的

 我不禁感慨了一句感慨:还学啥C++

当然,任何一个有经验的程序员,都可以站出来指出 GPT-4 辅助编程的种种缺点,然后断言它永远替代不了优秀的开发者。

你别忘了, GPT-4 发布才不到一年,目前一众大语言模型还在以狂飙的姿态进化中。再说了,谁说它的目标是替代「优秀的开发者」了?

目前,我还没有答案。想听听你的看法。欢迎留言,咱们一起交流讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57798.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发送Email、接收Email

邮件软件称为MUA&#xff1a;Mail User Agent&#xff0c;意思是给用户服务的邮件代理&#xff1b; 邮件服务器则称为MTA&#xff1a;Mail Transfer Agent&#xff0c;意思是邮件中转的代理&#xff1b; 最终到达的邮件服务器称为MDA&#xff1a;Mail Delivery Agent&#xff0…

Android studio通过lame生成把pcm转成MP3的so库以及音频的录制和播放附源码

1.先新建C项目 2. 在cpp目录下创建目录map3lame(名字随便起) &#xff0c;接下来要用到 3.下载lame 地址lame 最新版本是3.100&#xff0c;解压完成后如下图 把libmp3lame目录中的所有.c和.h文件(注意其他类型的文件和目录不需要)都复制到项目中新建的map3lame目录中&#xff…

香港金曲奖分析(1983-2017 by SIRMAN)

以前的金曲奖就是华语音乐的代表&#xff0c;特别是80、90年代&#xff0c;谭张争霸&#xff0c;四大天王等&#xff0c;虽然近来影响力已不如之前&#xff0c;但让我们来看看1983-2017的获奖名单。数据来源于百度百科“十大劲歌金曲颁奖典礼”&#xff0c;由于名单较多&#x…

Android中Pcm文件转换为Mp3

刚完成了一个pcm转成mp3的小工作&#xff0c;记录下自己解决这个问题的过程&#xff0c;以便以后可以参考。pcm转换mp3首选的就是lame这个开源框架&#xff0c;下载地址lame&#xff0c;下载完成后需要ndk编译lame。安卓ndk环境配置可以百度。下面记录下ndk编译lame的过程 首先…

NCM转MP3神奇的网页

由于毕业演出需要&#xff0c;下了QQ音乐上的一首需要会员的歌&#xff0c;发现是NCM格式&#xff0c;没有办法打开&#xff0c;于是在网上找方法&#xff0c;然后就发现了这个好方便的网页&#xff0c;直接线上转格式&#xff01;赶紧记下来&#xff0c;以备下次用&#xff01…

使用Lame库实现wav、pcm转mp3

文章目录 前言 一、Lame库是什么&#xff1f; 二、使用步骤 0.创建native项目 1.下载Lame库 2.pcm转MP3 3.wav转MP3 4、native方法如下 三、注意 总结 前言 因为使用android录音后生成的文件是wav或者pcm格式&#xff0c;项目要求最后的文件需要是mp3格式&#xff0c;于…

Android集成LAME库,实现pcm转mp3

一、交叉编译LAME库 LAME是一种非常优秀的MP3编码引擎&#xff0c;在业界&#xff0c;转码成MP3格式的音频文件时&#xff0c;最常用的编码器就是LAME库。 1. 下载LAME库源码 https://sourceforge.net/projects/lame/files/lame/ 进入LAME官网下载LAME源码&#xff0c;我选择…

[opcv图像处理] C/C|++将图片转换为马赛克效果

这个程序将图片转换为马赛克效果。 算法原理&#xff1a;求出每个小方块内所有像素的颜色平均值&#xff0c;然后用来设置为该小方块的颜色。依次处理每个小方块&#xff0c;即可实现马赛克效果。 完整代码如下&#xff1a; / // 程序名称&#xff1a;将图片转换为马赛克效果…

从入门到入土:Python实现爬取网易云歌词|评论生成词云图

写在前面&#xff1a; 此博客仅用于记录个人学习进度&#xff0c;学识浅薄&#xff0c;若有错误观点欢迎评论区指出。欢迎各位前来交流。&#xff08;部分材料来源网络&#xff0c;若有侵权&#xff0c;立即删除&#xff09; Python实现爬取网易云歌词|评论生成词云图 免责声明…

用python写一个爬取周杰伦所有歌词的爬虫

写一个爬虫爬一下周董的所有歌词看看这么多年他为啥这么火 唱的都是什么主题的歌可以这么经久不衰&#xff0c;他凭啥被称为流行歌曲天王。废话不多说 直接上代码 今天比较晚了 之后再慢慢完善讲解。代码比较low因为是编自学边完成的&#xff0c;所以只是实现了基本的功能&…

buuoj 来首歌吧 writeup

题目&#xff08;二十三&#xff09;&#xff1a; 【题型】Misc 【题目】来首歌吧 【来源】&#xff08;buuoj&#xff09;https://buuoj.cn/challenges#%E6%9D%A5%E9%A6%96%E6%AD%8C%E5%90%A7 【思路】通过音频的节奏得出摩斯密码&#xff0c;得到flag。 【具体步骤】 Step1&a…

chatgpt赋能python:Python打折代码:为你的电商网站提供更便捷的价格管理工具

Python打折代码&#xff1a;为你的电商网站提供更便捷的价格管理工具 在当前这个竞争激烈的市场&#xff0c;随时提供大量的优惠促销活动是吸引消费者注意力和提高销售额的必要手段之一。而电商网站在进行促销活动时&#xff0c;一个鲜为人知的秘密是——打折代码。打折代码作…

利用Python实现有道翻译的功能

这是上学期在Python课堂上老师讲的利用Python实现有道翻译的功能。 流程如下&#xff1a;网址&#xff1a;有道翻译 输入翻译名称&#xff0c;按F12对网页进行分析&#xff0c;通过查询到translate开头的连接中我们找到了翻译的数据参数 首先将参数以urlencode编码的方式传入到…

中英文自动翻译(有道翻译、彩云小译)

一.有道翻译 1&#xff09;获取应用ID 和 应用密钥 https://ai.youdao.com/doc.s#guide 2&#xff09;遵循接口参数接入 具体参考接口文档&#xff1a;https://ai.youdao.com/DOCSIRMA/html/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E7%BF%BB%E8%AF%91/API%E6%96%87%E6%A1%A3/…

Unity 接入有道智云AI - 文本翻译

接入接口前首先需要申请应用ID和应用秘钥&#xff0c;登录有道智云AI开放平台&#xff0c;创建应用&#xff0c;获取应用ID和秘钥。 定义接口响应类数据结构&#xff0c;接口实际返回内容和官方文档有点出入&#xff0c;大概是文档未更新吧。 以下是官方文档给出的说明&#x…

【Python爬虫】有道翻译新旧API接口

&#x1f308;据说&#xff0c;看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言&#xff1a; &#x1f9e1;作者简介&#xff1a;大家好我是 user_from_future &#xff0c;意思是 “ 来自未来的用户 ” &#xff0c;寓意着未来的自己一定很棒~ ✨个…

Translate插件的有道翻译

在plugins下载Translate插件 setting-> Tools->Translation 没有id和密钥就申请注册 登录后 创建应用 创建成功后输入id和密钥 点击鼠标右键即可使用 翻译效果 over

python利用有道词典翻译_Python利用有道词典接口制作即时翻译的工具

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于Python 实用宝典&#xff0c;作者Python 实用宝典 前言 在编程时经常会遇到需要将中文词汇翻译成英文的情况。 比如变量名的定义、取一个合…

如何用python“优雅的”调用有道翻译

文章目录 前言分析分析url分析参数01分析参数02加密分析 模拟请求注意点请求代码执行结果 结语 前言 其实在以前就盯上有道翻译了的&#xff0c;但是由于时间问题一直没有研究(我的骚操作还在后面&#xff0c;记得关注)&#xff0c;本文主要讲解如何用python调用有道翻译&…

Python 调用有道的翻译接口

最近为了熟悉一下 js 用有道翻译练了一下手&#xff0c;写一篇博客记录一下&#xff0c;也希望能对大家有所启迪&#xff0c;不过这些网站更新太快&#xff0c;可能大家尝试的时候会有所不同。 首先来看一下网页 post 过去的数据 大家不难发现&#xff0c;我们翻译的内容是…