基于ChatGPT上线《你说我猜》小游戏

news2024/11/25 1:29:45

摘要

AIGC、GPT、休闲小游戏三者可以怎么结合?
AIGC、GPT与小游戏的结合为游戏体验带来了新的可能性。AIGC(Artificial Intelligence Game Content)作为一种人工智能技术,可以自动生成任务、剧情和角色对话等游戏元素,为小游戏注入丰富多样的内容。GPT(Generative Pre-trained Transformer)作为一种强大的自然语言处理模型,承担着在AIGC系统中生成各种游戏内容的角色,如对话、任务和地图等。GPT可以从大量的文本数据中学习,生成具有逻辑性和连贯性的游戏元素,为小游戏注入新颖、有趣和个性化的元素。

1、前言

自从 ChatGPT 去年上线以来,各种基于 ChatGPT 的应用层出不穷。笔者之前也写过很多关于 ChatGPT 的文章,帮很多初学者正确使用上了 ChatGPT。得到了很多读者好评反馈,最近有读者反馈能否基于 ChatGPT 给抖音、快手、视频号等直播间做《你说我猜》互动游戏。

关键词:ChatGPT、AIGC、GPT-4、大模型、RTC实时音视频、休闲小游戏

1.jpg

2、Demo使用的工具介绍

跟大家介绍AIGC小游戏实现流程之前,前置先介绍本次Demo使用的工具,以 GPT 为首的 AI 高效生产工具以及直播SDK。

  1. 直播产品:RTC SDK Android Java实时音视频实现流程 - 开发者中心
  2. GPT4.0:New bing
  3. GPT3.5:ChatGPT

3、AIGC直播间休闲小游戏

由于第三方直播平台不开放弹幕接口,这里我们使用即构 RTC平台接入小游戏来实现,即构 RTC 官方开发文档.如果读者需要接入到其他直播平台(如抖音、快手、B 站等),自行搜索相关弹幕接口替换本文弹幕接口即可。

基于实操经验,使用即构 RTC 实时音视频服务好处多多,即构的RTC产品采用的全链路自研音视频引擎,最低时延达79ms,79ms是什么概念呢,用户体验是人体毫无感知的。多平台开发是目前的趋势,我一直用即构RTC实现直播间,接入流程简单便捷容易上手,帮助我们项目快速上线多次抢占市场流量。据官网显示,即构实时音视频服务适配多达15000+终端设备、兼容25种开发平台,一次开发多端上线,为我节省了大量的开发成本,使我们更能专注业务本身。还有业内领先的Qos策略、强大的3A处理能力,推荐给独立开发者和创业团队,开发者在游戏中通过即构SDK可以快速实现实时语音能力,适合快速验证项目可行性。

先看本文实现的最终效果(gif压缩的厉害,读者可以直接跑附件代码或者私信笔者获取demo):
左图:房主视角 右图:玩家视角(观众视角)
2.gif

4 游戏规则设置

言归正传,先设置游戏交互过程。首先创建登录界面,用户可以输入房间号和昵称。接下来用户可以点击【进入房间】和【创建房间】按钮。

  • 如果点击进入房间按钮,需要验证房间是否存在,如果存在则进入,如果不存在则提示用户房间不存在。
  • 如果点击创建房间,需要先验证房间是否存在,如果存在提示创建失败,不存在则直接创建房间并进入。

在房间内:

  • 如果是房主,则可以设置猜词,比如“水杯”。然后组装提示词:“请描述水杯,10个字以内,不要出现水杯2个字”。
  • 得到ChatGPT的回复后,将回复的内容作为直播间的“本轮提示”。
  • 房主每次可以点击刷新按钮,将相同的提示词发送请求ChatGPT回复,并刷新“本轮提示”
  • 观众根据“本轮提示”猜词,猜词最快的4个用户的头像会出现在直播间大屏,享受胜者的荣誉。

观众视角(玩家视角)
3.jpg

游戏登录界面和猜词界面如上所示,机灵的读者可能会发现一个Bug:第一个用户如果回答正确并上墙了,后面的用户可以抄袭了。确实会有这个问题,这里主要是因为笔者没有搭建服务器,所以不好直接控制用户的弹幕。正确做法应该将回答正确的弹幕用星号(*)替换掉,防止答案被抄袭。这里留给读者来解决这个小问题。整个游戏逻辑流程如下:

4.png

5 代码实现

5.1 与 ChatGPT 对接

与ChatGPT对接实现代码在前面 **《人人都能用ChatGPT4.0做Avatar虚拟人直播》**一文中有详细描述如何调用,这里不再赘述。在附件下载源码后,执行如下命令安装必须的库:

npm install

接下来,启动http服务:

node main.js

依然使用**《人人都能用ChatGPT4.0做Avatar虚拟人直播》** 一文中封装好的接口(包含chatGPT3.5和BingGPT4.0), 这里我们使用OpenAI的ChatGPT3.5。如下所示,引入chatGPT接口后,接下引入Express启动Http服务。

var chatGPT = require("./robot/robot").chatGPT
var express = require('express');
var app = express(); 
app.post('/ask', function (req, res) {
    let ask = req.query["ask"];  
    chatGPT(ask, function (succ, txt) {
        if (succ) {
            res.send({ state: 0, txt });
        } else {
            res.send({ state: -1, txt: "" });
        }
    })
})

var server = app.listen(8888, function () {
    var port = server.address().port
    console.log("应用实例,访问地址为 http://%s:%s", '0.0.0.0', port)

})

只包含一个POST接口/ask,用户只需传入提示词,内部传递给ChatGPT,将ChatGPT回复的内容返回的用户。

5.2 接入即构 RTC

即构 RTC是一款实时音视频 SDK,时延最低79ms,70%丢包下保持流畅的视频通话,能给我们提供稳定、多平台互通的实时音视频能力。在音视频通话基础上提供超分辨率、背景分割、场景化降噪等高级音视频处理,同时提供万人连麦、状态实时同步等多种趣味玩法,可应用于多人语音、在线KTV、虚拟世界解决方案。
即构覆盖全球用户,每日服务超30亿分钟。更多详情可进入即构官方开发文档。接下来我们借助即构RTC强大的能力开发实时语音以及房间内弹幕同步能力, 以下是接入即构RTC大致流程。
5.png

在官网下载最新SDK,将SDK引入到项目后,接下来创建即构RTC引擎:

public class RTCMngr implements RTCHandler.IRTCEventListener {

    private static final String TAG = "RTCMngr";
    private ZegoExpressEngine mRTCEngine;
    private static RTCMngr mInstance;
    private RTCHandler mRTCHandler = new RTCHandler(this);
    private ZegoVideoConfig videoCfg = null;
    private IListener msgListener;
    private static Map<String, String> roomInfo = new HashMap<>();

    private RTCMngr(Application app) {
        mRTCEngine = createRTCEngine(app, mRTCHandler);
    }

    public static RTCMngr getInstance(Application app) {
        if (null == mInstance) {
            synchronized (RTCMngr.class) {
                if (null == mInstance) {
                    mInstance = new RTCMngr(app);
                }
            }
        }
        return mInstance;
    }

    private ZegoExpressEngine createRTCEngine(Application app, IZegoEventHandler handler) {
        ZegoEngineProfile profile = new ZegoEngineProfile();
        profile.appID = KeyCenter.APP_ID;
        profile.scenario = ZegoScenario.GENERAL;  // 通用场景接入
        profile.application = app;
        ZegoExpressEngine engine = ZegoExpressEngine.createEngine(profile, handler);
        return engine;
    }

登录房间

接下来实现登录房间,登录房间首先需要获取Token,获取Token的方式封装到RunOnServer类里面。

值得注意的是,RunOnServer类里的所有函数都是需要读者将其移到服务器端运行,否则有安全风险!

有了Token后,接下来调用ZegoExpressEngine的loginRoom函数,通过回调函数中的error参数判断是否登录成功。如果为error=0表示登录成功,否则,需要去官网查询具体错误原因。

//登录房间
public void loginRoom(User user, CB cb) {

    ZegoUser zuser = new ZegoUser(user.userId, user.userName);
    ZegoRoomConfig config = new ZegoRoomConfig();
    config.token = RunOnServer.getToken(user.userId, user.roomId); // 请求开发者服务端获取
    config.isUserStatusNotify = true;
    mRTCEngine.loginRoom(user.roomId, zuser, config, (int error, JSONObject extendedData) -> {
        if (error == 0) {
            Log.e(TAG, "登录房间:" + user.roomId);
            String hostId = null;
            try {
                hostId = extendedData.getString("hostId");
            } catch (JSONException e) {
                hostId = "";
            }
            cb._complete(error == 0, hostId);
        } else {
            Log.e(TAG, "Login Error, errorCode=" + error);
            cb._complete(error == 0, "login room error code:" + error);
        }
    });

}

退出房间

有登录就会有退出,退出房间之前,先停止拉流,如果有推流则需要停止推流。然后调用ZegoExpressEnginelogoutRoom函数。

    //离开房间
    public void leaveRoom(String roomId, CB cb) {
        mRTCEngine.stopPreview();
        mRTCEngine.stopPublishingStream();
        mRTCEngine.logoutRoom(roomId, new IZegoRoomLogoutCallback() {
            @Override
            public void onRoomLogoutResult(int errorCode, JSONObject extendedData) {
                cb._complete(errorCode == 0, "");
            }
        });
    }

发送弹幕
前面实现了登录房间和退出房间,有了房间的概念,那么接下来实现向房间发送弹幕消息,让房间每个人收到弹幕消息,直接调用ZegoExpressEnginesendBarrageMessage函数即可:

    /**
     * 发送弹幕消息
     */
    public void sendMsg(Msg msg, CB cb) { 
        mRTCEngine.sendBarrageMessage(msg.toUID,
                msg.decMsg, new IZegoIMSendBarrageMessageCallback() {
                    @Override
                    public void onIMSendBarrageMessageResult(int errorCode, String messageID) {
                        cb._complete(errorCode == 0, messageID);
                    }
                });

    }

    //其他相关代码略.....
}

以上代码创建RTC引擎、登录房间、离开房间、发送弹幕、推流等函数。基于这些基本能力后,我们就可以组装更多复杂功能了。接下来封装推流能力,由于语音实时画面是4个用户头像,无须实时视频推流。因此只需使用实时语音功能即可,在拉流时,将需要用到 canvas 参数的函数传入null。在推流时,调用 muteVideoPublish函数,禁掉视频的推流。另外,在调用startPreview前,先调用 enableCamera关闭摄像头,以避免SDK请求摄像头权限。或者干脆不请求摄像头权限,确保不会调用摄像头对实时画面推流。

//推流
public void pushStream(String streamId) {
    Log.e(TAG, "push streamID" + streamId);
    mRTCEngine.startPublishingStream(streamId);
    mRTCEngine.startPreview(null);

}

5.3 房主设题

房主有出题权限,整个游戏的节奏由房主来把控,比如:换题、刷新提示等。其中最重要的接口是与ChatGPT服务对接,大致流程如下:

6.png

具体代码如下:

private void reqGPT() {
    if (wordAns.length() <= 0) return;
    chatGPT.ask("请描述" + wordAns + ",10个字以内,不要出现" + wordAns + wordAns.length() + "个字", new CB() {
        @Override
        public void onResult(boolean succ, String res) {
            if (!succ) {
                toast(res);
            } else {
                Msg msg = Msg.newRoundMsg(mUser.roomId, res, mUser.userId);
                rtcMngr.sendMsg(msg, new CB() {
                    @Override
                    public void onResult(boolean succ, String err) {
                        onlineIds.clear();
                        onNewRound(msg);
                    }
                });
            }
        }
    });
}

注意到第三行代码中,组装了ChatGPT的提示词,加了10个字以内约束,防止ChatGPT返回一大段描述;另外,加了不要出现xx关键字,防止ChatGPT在返回的内容上把猜词给暴露了。

答案目前是由房主保存,房主在接收到观众的弹幕后,一一对比,如果是正确答案并且目前答对的用户不超过4人,就让用户头像上屏。这里由于我们没有单独与即构RTC对接的服务器,所以由房主发一条特殊包含了上屏用户信息的弹幕消息,所有人接收到这条特殊的弹幕后,解析展示上屏用户数据。

5.4 观众猜题

观众猜题逻辑比较简单,用户直接输入猜测的答案后,直接发送弹幕消息即可。点击发送按钮,对于房主和观众,走两条不同逻辑:

/**
 * 点击发送按钮
 */
public void onClkSendMsgBtn(View view) {
    String txt = sendET.getText().toString().trim();
    if (txt.length() <= 0) return;
    Msg msg = Msg.newRoomMsg(mUser.roomId, txt, mUser.userId, mUser.userName);
    if (mUser.isCreator) {//房主重新设置猜测词
        newRound(txt);
    } else {//观众发送弹幕
        rtcMngr.sendMsg(msg, new CB() {
            @Override
            public void onResult(boolean succ, String err) {
                addBarrageItem(msg);
            }
        });
    }
    sendET.setText("");
}

6、即构RTC社交小游戏解决方案

现在有越来越多的企业尝试通过在泛娱乐社交产品中引入小游戏,来提升用户社交互动的趣味性和产品粘性,同时去验证产品的商业化变现新思路。对于预算不多自研小游戏的中小企业或验证小游戏项目的企业。笔者推荐可选择接入带有小游戏的第三方音视频SDK,例即构RTC实时音视频。

据了解即构与多家头部游戏工作室达成合作,推出了社交+小游戏解决方案,当前已支持桌球、碰碰大作战、谁是卧底、你画我猜等多款热门休闲游戏,可应用在视频直播、一对一交友、语音电台、语聊房等泛娱乐行业常见的业务场景,同时即构也支持Ludo、Domino、UNO等出海本地化游戏,为中国出海企业的市场竞争提供新助力。

另外,即构的小游戏库持续扩充中,开发者只需接入一次,即可不断更新上线新游戏,适合想要低成本快速验证用户偏好的团队或开发者。即构官方还推出了很多泛娱乐行业应用场景的产品demo,就算不想使用即构 RTC,也强烈推荐进去看看相关 Demo,说不定能给你带来很多创业灵感。官网 Demo 列表网址

7、小游戏玩法延伸

本文主要通过房主设置题目、GPT提供对应的描述、观众猜题的逻辑实现“你说我猜”小游戏,GPT的描述有开盲盒的刺激感,是本游戏的亮点。

当然了,游戏玩法可以万变。博主提供几个思路,比如:

  1. GPT出题,无须房主,所有观众猜题
  2. 观众出题,GPT猜词

另外,不仅仅是“你说我猜”小游戏,还可以做一些更复杂的言语类游戏,比如:谁是卧底、狼人杀等时下流行游戏;另外,还可以结合AI画画实现“你画我猜”小游戏。只需简单几行代码接入即构RTC能力,几乎所有实时类游戏都可以简单接入。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓:Fragment

一、Fragment介绍 Fragment 是 Android 平台上的一种 UI 组件&#xff0c;用于构建灵活且可复用的界面模块。每个 Fragment 都有自己的生命周期&#xff0c;可以嵌入到 Activity 中&#xff0c;并在一个 Activity 内部管理其自己的布局和行为。通过使用 Fragment&#xff0c;可…

1000多道大厂Java真题汇总。刷完这一套高质量题集,这个金九银十妥妥的

又是一年金九银十&#xff01; 纵观今年的技术招聘市场&#xff0c;Java依旧是当仁不让的霸主&#xff01;即便遭受Go等新兴语言不断冲击&#xff0c;依旧岿然不动。究其原因&#xff1a; Java有着极其成熟的生态&#xff0c;这个不用我多说&#xff1b;Java在运维、可观测性…

el-table实现动态表头,自定义斑马纹等功能

需求&#xff1a;1.根据选择的日期时间&#xff0c;实现表头的动态显示功能 2.修改默认表头灰色样式&#xff0c; 3.斑马纹偶数灰色改为奇数为灰色 4.表格某一行加分割线区分 1.效果 2.动态表格实现 1.height&#xff1a;表格的高度设置&#xff0c;内容超出后会显示滚动条&a…

类和对象(二)

目录 一、类的六个默认成员函数 二、构造函数 2.1 概念 2.2 特性 三、析构函数 3.1 概念 3.2 特性 四、拷贝构造函数 4.1 概念 4.2 特性 五、赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载特性 六、const修饰成员函数 七、取地址及const取地址操作符重载 一…

Html基础知识学习——css精灵(十五)

这里写自定义目录标题 定义示例一示例二 定义 将网页用到的图片放在一张图片上&#xff0c;进行定位展示 优点:防止网页http请求次数过多&#xff0c;从而提高页面性能 缺点&#xff1a;降低开发效率。维护难度加大 示例一 使用图 网页制作图 <!DOCTYPE html> <…

如何能够极速浏览大体积tif影像文件?

在无人机航拍的高清正射影像中&#xff0c;大体积文件是普遍现象&#xff0c;几十GB的TIFF文件很常见。常规的浏览方式特别容易导致卡顿&#xff0c;用户需要花费半天时间等待影像图的呈现。 建议您尝试将tiff格式快速转换为mbtiles或lrp格式&#xff0c;mbtiles和lrp格式专门…

JSP+MySql实战

0目录 JSPMySql实战 创建maven工程和包 创建2张表 User表 Employee表 实体类封装 Util 包BaseDao类 Dao包 EmployeeDao类 UserDao类 实现接口方法 Dao包新建impl包 UserDaoImp EmployeeDaoImpl 新建Service包 接口方法 UserService EmployeeSe…

【分布式任务调度】XXL-JOB的任务调度实现原理(四)

文章目录 1.前言2.调度中心流程2.1.任务配置扫描流程2.2.计算任务触发时机2.2.1.已超时5秒以上2.2.2.超时未超过5秒2.2.3.还未到触发时间 2.3.任务触发流程2.3.1.任务触发线程池2.3.2.参数处理2.3.3.任务触发2.3.4.分片广播策略&#xff08;补充&#xff09; 3.执行器流程3.1.任…

笔记本安装Centos Stream9系统的详细安装教程

U盘刻录工具&#xff1a; Index of /downloadshttp://rufus.ie/downloads/

库迪身陷“价格”囹圄,融资苦难户还有突围的希望吗?

作者 | 心怡 来源 | 洞见新研社 三伏天已至&#xff0c;正是咖啡品牌借冰咖笑傲市场的好时机。没想到的是&#xff0c;靠低价狂奔的库迪却率先传出涨价的消息。 消息称&#xff0c;7月起&#xff0c;库迪划线价格上调1-2元&#xff0c;8.8元的团购价涨到9.9元&#xff0c;热门…

如何使用vb上位机串口通信

今天我来分享一下如何使用vb上位机串口通信。首先&#xff0c;我们需要准备一台具有串口的上位机设备和一台计算机。刚好&#xff0c;我这里有上位机入门&#xff0c;学习线路图&#xff0c;各种项目&#xff0c;需要留个6。接下来&#xff0c;我们需要安装相应的控件和程序包。…

【PHP面试题44】PHP5的版本和PHP7之间有哪些区别

文章目录 一、前言二、底层调整2.1性能提升2.2 新的引擎2.3 数据类型改进2.4 错误处理改进2.5 语言特性增加 三、应用层差异3.1 兼容性3.2 类和方法改进3.3 错误处理机制3.4 性能优化3.5 新的扩展支持 四、一些语法糖示例4.1 标量类型声明示例4.2 新增了Spaceship操作符&#x…

新字符设备驱动实验

目录&#xff1a; 1. 新字符设备驱动原理1.1. 分配和释放设备号1.2. 添加字符设备 2.自动创建设备节点2.1. mdev机制2.2. 创建和删除类2.3. 创建设备2.4. 新字符设备驱动框架总结 3. 文件结构体和文件私有数据4. 实验程序编写4.1. 驱动程序4.2. 应用程序 5. 运行测试 1. 新字符…

RabbitMQ 同样的操作一次成功一次失败

RabbitMQ 是一个功能强大的消息队列系统&#xff0c;广泛应用于分布式系统中。然而&#xff0c;我遇到这样的情况&#xff1a;执行同样的操作&#xff0c;一次成功&#xff0c;一次失败。在本篇博文中&#xff0c;我将探讨这个问题的原因&#xff0c;并提供解决方法。 我是在表…

DatenLord前沿技术分享 No.30

达坦科技专注于打造新一代开源跨云存储平台DatenLord&#xff0c;通过软硬件深度融合的方式打通云云壁垒&#xff0c;致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题&#xff0c;以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。在本周…

【雕爷学编程】Arduino动手做(161)---16路PWM舵机驱动板2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

windows搭建git服务器 无法识别 ‘git‘ 命令:exec: “git“: executable file not found in %PATH%

无法识别 git 命令&#xff1a;exec: "git": executable file not found in %PATH% 确保已经安装git&#xff0c;如下图配置环境变量即可。

ylb-接口7注册发送短信

总览&#xff1a; 在common模块下引入短信验证码的依赖项&#xff08;生成4位随机数&#xff09;&#xff1a; 在web模块下的resources/application.yml&#xff0c;添加配置信息&#xff08;京东万象&#xff09;&#xff1a; #短信配置 jdwx:sms:url: https://way.jd.com…

在 3ds Max 中使用Mental Ray渲染 wip 图像

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 本教程面向初学者&#xff0c;每个步骤都详细概述和显示。如果您是 3D Studio MAX 的新手&#xff0c;您可能想先尝试我们的其他一些教程。 使用默认的 3D Studio MAX 渲染器创建粘土渲染 步骤 1 在 3D S…

Unity DOTS如何优雅地实现ECS框架下的定时器Timer系统(无对象池,零GC)

实现定时器并不复杂&#xff0c;就是写个类存放回调&#xff0c;再写个类来统一管理这些回调类。但是ECS写代码的方式变了&#xff0c;所以还是有些区别的。 实现过程中需要注意的几点&#xff1a; 1、由于IComponentData不能存放managed类型的数据&#xff0c;所以无法用常规…