一 效果展示

应用链接:https://www.coze.cn/store/project/7542447825532485686?entity_id=1&bid=6hbmcg2ks1g12

首页

猜数字

排行榜

二 Bot设计

先分析一下猜数字的思路。

  • step1,系统先产生随机数,同时存入到一个应用变量里:guess_num。

  • step2,玩家循环猜测,直到猜对为止。 A:先展示给玩家数字范围:1-100。让玩家在这个范围内猜数。两个变量min_num=1,和max_num=100,表示猜数的范围。 B:根据玩家的猜数:answer_number,来跟系统随机数进行比较大小。以计算下次玩家要猜数的范围。 C:如果玩家猜数,大于系统随机数:answer_number>guess_num。玩家猜大了,下次猜数范围:min_num-answer_number。所以修改max_num为answer_number。 D:如果玩家猜数,小于系统随机数:answer_number<guess_num。玩家猜小了,下次猜数范围:answer_number-max_num。所以修改min_num为answer_number。 E:玩家每猜测一次,都要统计,最终要知道玩家猜对的时候,一共猜测多少轮数。

  • step3,统计分数:根据玩家猜测轮数,来统计分数

  • step4,写入数据库:将玩家id,用户昵称,猜测轮数,系统随机数,本轮得分,以及总分都要写入数据库。这里总分,需要获取用户的最高得分,加上本轮分数。

三 创建应用

首先创建一个应用

四 创建数据库

这里,我们要把用户每次玩的时候,产生的一些数据,存入到数据库中。包含了用户的id,用户昵称,本轮待猜的数字,用户猜测几轮才猜中,本局得分多少,总得分多少。

4.1 新建数据库

新建一个数据库

填入数据库的名称和描述

名称:game_board 描述:游戏成绩榜单

4.2 多用户模式

这里切换为多用户模式,因为要有一个所有玩这个游戏的总榜单,那么数据库中要存储所有玩家的数据,所以这里使用多用户模式。

4.3 数据表结构

数据表结构:

  • sys_uuid,用户id

  • user_name,用户昵称

  • guess_number,猜中数字

  • guess_round,猜中轮次

  • score,本局得分

  • total_score,用户累计得分

五 对话流 - 猜数缓解

先创建一个对话流:

填写对话流的名称和描述

名称:guess_number_game 描述:猜数字游戏

5.1 开始节点

开始节点默认不变

5.2 用户变量

这里设置一个用户变量, 用于存储玩家昵称。

  • username,玩家昵称,默认值:神秘来客

记得点击保存按钮。

5.3 问答节点 - 询问用户昵称

这里添加一个问答节点,询问用户的昵称。

询问内容:


你好呀~新朋友,请问怎么称呼你?

要记得从高回复中提取字段,这里提取用户昵称。

5.4 变量赋值节点 - 存储用户昵称

接下来,添加一个变量赋值节点,用于保存用户的昵称

5.5 代码节点 - 生成随机数

这里添加一个代码节点,用于生成一个1-100的随机数。

代码如下:

import randomasync def main(args: Args) -> Output:    # params = args.params    # 构建输出对象    ret: Output = {        "random_num":  random.randint(1, 100)    }    return ret

5.6 应用变量

这里我们再创建几个应用变量。就是用户猜数过程中,需要存储几个变量:系统产生的随机数,也就是谜底。用户每次猜测的数字,这个要存储,因为后面需要判断用户是否猜对,猜大了还是猜小了。还有用户下次应该在哪个取值范围内猜测。

要设置以下变量:

  • guess_num,本局游戏的谜底数字

  • answer_number,用户回答的数字

  • min_num,最小范围,默认值1

  • max_num,最大范围,默认值100

表示要在1-100之间进行猜测。后面就要根据用户每轮猜测的数字,来判断用户猜大了还是猜小了。来对min_num和max_num进行修改,调整每次要猜测的范围。

举例:系统随机数是80,用户猜数的范围是(min_num,max_num),此时是(1,100)。 假如用户猜数是50,说明用户猜小了,那么下次用户应该在(50,100)之间猜测。所以就该修改min_num的值为50。 假如用户猜数是90,说明用户猜大了,那么下次用户应该在(1,90)之间猜测。所以就该修改max_num的值为90。

记得点击保存按钮。

5.7 变量赋值节点 - 存储系统产生随机数

添加一个变量赋值节点,用于存储上一个代码节点,输出的随机数。

5.8 循环节点 - 玩家循环猜数

接下来,就该玩家猜数了,因为不一定几次能猜中,所以循环方式选择无限循环。

这里需要设置两个中间变量:

  • guess_round,表示循环猜了几轮了。初始值为0

  • result,玩家上一轮猜测的结果。如果猜测轮次等于0,没有上一轮结果

1.大模型节点-生成引导词

添加一个大模型节点,用来生成每次游戏和用户的交互内容。类似于游戏主持人的引导词。

输入参数:

  • username,用户昵称是

  • guess_round,当前的用户猜测轮次是

  • result,用户上一轮猜测的结果是

输出参数:

  • output,本轮和用户的交互

系统提示词:

# 角色你是一个幽默有魅力的猜数字游戏主持人。## 工作步骤### 步骤一:首轮游戏引导1. 当用户猜测轮次等于0时,输出一句游戏开始的引导语,引导用户给出他猜测的数字。2. 输出示例如下:欢迎你呀,{{username}}!现在这个神秘的数字已经握在我的手里啦,它是一个1~100之间的整数,快来猜猜看吧!### 步骤二:大于第一轮游戏引导1. 当用户猜测轮次大于0时,则进入本步骤。2. 根据当前用户猜数字的进度,输出一句话来告知用户上一轮猜测的结论,并鼓励用户继续玩下去。一般来说如果猜测的轮次越大,用户可能会感觉到挫败,需要鼓励,请你使用适合的话术鼓励用户继续游戏。3. 输出示例如下:亲爱的{{username}},你上一轮的结果是:**{{result}}**这时候放弃就太早啦!再来试试吧💪🏻## 限制- 只需要按目标输出,不涉及其他无关内容的回复。- 严格遵守输出示例进行输出。- 绝对不可以直接告知用户谜底数字。- 你可以卖萌、可以幽默、可以鼓励、可以挑逗、可以激将,但不可以辱骂用户,请你自行判断当前适合使用的话术。

用户提示词:

用户昵称是:{{username}}当前的用户猜测轮次是:{{guess_round}}用户上一轮猜测的结果是:{{result}}

测试一下:

第一轮:

不是第一轮:

2.问答节点 - 用户猜数

接下来,添加一个问答节点,来询问用户猜测的数字。

输入参数:

  • question,上一个大模型节点的输出。

输出参数:

  • answer_number,从用户回答中提取到的数据

提问内容:

{{question}}来猜猜这个神秘的幸运数字是多少吧?

3.变量赋值节点 - 存储用户猜数

接下来,我们把用户猜的数字,存储一下。

4.选择器节点

添加一个选择器节点,来判断用户猜测的数字和系统生成的随机数,比较大小。

两个整数相比,其实就3种情况:

  • 系统随机数 > 用户猜数。说明用户猜小了,应该修改min_mum为用户猜数。这样保证用户下次可以在(用户猜测的数字-max_num)之间猜测。

  • 系统随机数 < 用户猜数。说明用户猜大了,应该修改max_num为用户猜数。这样保证用户下次可以在(min_num-用户猜测的数字)之间猜测。

  • 系统随机数 = 用户猜数。说明用户猜中了。

5.变量赋值节点

添加两个变量赋值节点,用于修改min_num或者max_num的值为用户猜测的数字。

6.文本处理节点

两个数相比,有3种结果,针对这3种结果,需要提供3个文本描述。所以增加3个文本处理节点。

猜小了话术:

答错了!你猜的数字比答案要小哦!再来试试吧,正确数字就在{{String1}}~{{String2}}之中!

猜大了话术:

答错了!你猜的数字比答案要大哦!再来试试吧,正确数字就在{{String1}}~{{String2}}之中!

猜对了话术:

恭喜你!答对啦!正确答案就是:{{String1}}

7.大模型节点 - 游戏裁判

接下来,添加一个大模型节点,来进行判断。判断后,要给出最终的结果result,以及是否猜对is_success,还有猜测轮数要加1。

输入参数:

  • guess_round,之前的猜测轮数

  • output_e1,猜大了文本

  • output_e2,猜小了文本

  • output_c,猜对了文本

输出参数:

  • is_sucess,是否猜中,要求是Boolean类型:True或False。后面用于判断是否需要结束循环。

  • result,猜测的结果:猜大了还是猜小了,下次在哪个范围猜。还是猜对了。

  • new_guess_round,猜测轮数累计啊1

系统提示词:

# 目标

你是猜数字游戏的裁判,请根据用户猜数字的结果输出用户是否成功猜对了,并且计算用户的猜测轮次。

## 输出格式

请严格按以下格式要求输出:

- 如果猜对了,则{is_sucess}输出:true,{result}输出:{{output_c}}

- 如果猜错了,则{is_sucess}输出:false,{result}输出:{{output_e1}}{{output_e2}}

- 并在当前用户的猜测轮次数字{{guess_round}}上+1,输出为新的轮次统计数字{new_guess_round}。

## 限制

- 绝对不可以直接告知用户谜底数字。

- 严格按照输出格式要求进行输出,不需要回答其他问题。

用户提示词:

本次用户猜测的结果是:{{output_e1}}{{output_e2}}{{output_c}}

本局游戏当前的猜测轮次是:{{guess_round}}
8.设置变量

循环中间变量的值,要想变化,需要通过设置变量节点。

9.选择器节点

添加一个选择器节点,用于判断是否需要终止循环。也就是判断是大模型节点的输出:is_success的值是True还是False。

10.终止循环

如果is_success的值为True,就证明用户猜对了,那就可以结束掉循环了。否则就继续下一轮循环。

11.循环节点的输出参数

循环节点的输出参数需要配置一下,我们需要将用户猜测的轮数,传递出去。

12.测试一下循环

目前工作流如下(还没写完):

我们可以先连接到结束节点上,先测试一下猜数环节:

可以正常猜数,直到猜对为止。

5.9 代码节点 - 统计本轮得分

这里我们添加一个代码节点,用来统计得分,规则如下:

    猜测轮次为:1,得分:10猜测轮次为:2,得分:9猜测轮次为:3,得分:8猜测轮次为:4,得分:7猜测轮次为:5,得分:6猜测轮次为:6,得分:5猜测轮次为:7,得分:4猜测轮次为:8,得分:3猜测轮次为:9,得分:2猜测轮次为:10,得分:1猜测轮次>10,得分:0

    输入参数:

    • guess_round,玩家猜中的轮数

    输出参数:

    • score,本轮得分

    代码如下:

    async def main(args: Args) -> Output:    params = args.params    guess_round = params["guess_round"]    # 根据猜测轮次计算得分    if guess_round == 1:        score = 10    elif guess_round == 2:        score = 9    elif guess_round == 3:        score = 8    elif guess_round == 4:        score = 7    elif guess_round == 5:        score = 6    elif guess_round == 6:        score = 5    elif guess_round == 7:        score = 4    elif guess_round == 8:        score = 3    elif guess_round == 9:        score = 2    elif guess_round == 10:        score = 1    else:  # 猜测轮次>10        score = 0    # 构建输出对象    ret: Output = {        "score": score    }    return ret

    如果自己不想写,可以让AI编写: 提示词如下:

    编写python代码,请根据以下规则输出本轮游戏的得分{score}:- 猜测轮次为:1,得分:10- 猜测轮次为:2,得分:9- 猜测轮次为:3,得分:8- 猜测轮次为:4,得分:7- 猜测轮次为:5,得分:6- 猜测轮次为:6,得分:5- 猜测轮次为:7,得分:4- 猜测轮次为:8,得分:3- 猜测轮次为:9,得分:2- 猜测轮次为:10,得分:1- 猜测轮次>10,得分:0注意:只输出0~10之间的整数在以下模板中进行编写:async def main(args: Args) -> Output:    params = args.params    guess_round = params["guess_round"]    # 构建输出对象    ret: Output = {        "score":     }    return ret

    5.10 系统变量

    接下来要用到查询数据库的操作。这里我们需要用户的sys_uuid,作为唯一标识。

    5.11 SQL自定义节点

    我们还需要从数据库中查询该用户的最大总积分。

    假如一个人玩了多次,每次都会在数据库中增加一条记录。那么total_score,其实是需要统计的。

    我们要查找这个人的所有记录,然后取total_score的最大值。

    这里,添加一个SQL自定义节点,来查询数据库,查询用户累计得分的最大值。

    SQL语句:

    SELECT MAX(total_score) AS total_score_old FROM game_board WHERE sys_uuid = '{{sys_uuid}}'

    如果自己不想写sql语句,也可以编写自然语言,然后让AI生成SQL语句。

    5.12 代码节点

    添加一个代码节点,用于计算新的total_score。就是从数据库中取出最大的total_score,加上本轮得分。

    输入变量:

    • score,本轮得分

    • total_score_old,数据库中查询到的最大的total_score

    输出变量:

    • total_score_new,新的total_socre

    代码如下:

    async def main(args: Args) -> Output:    params = args.params    # 检查参数是否有值,无值则按0处理    score = params["score"] if params["score"] is not None else 0    total_score_old = params["total_score_old"] if params["total_score_old"] is not None else 0    # 计算新的总分    total_score_new = score + total_score_old    # 构建输出对象    ret: Output = {        "total_score_new": total_score_new    }    return ret

    如果自己不想写代码,也可以让豆包写: 提示词:

    编写python代码,统计两个参数的和,但是先判断两个参数是否有值,没有值,就按照0来求和。在以下框架中编写代码:async def main(args: Args) -> Output:    params = args.params    score = params["score"]    total_score_old = params["total_score_old"]    # 构建输出对象    ret: Output = {        "total_score_new":    }    return ret

    5.13 新增数据节点

    接下里,我们就可以把这些数据,写入数据库了,添加一个新增数据节点。

    按照数据表中的列,进行设置参数。

    5.14 SQL自定义节点

    回头开始节点处,这里有个问题,就是如果用户不是第一次玩,那就不用询问用户姓名了。因为已经存储过了。

    输入变量

    • sys_uuid,用户id

    输出变量

    • game_times,这里要和sq语句对应上

    SQL语句:

    SELECT COUNT(*) AS game_times FROM game_board WHERE sys_uuid = '{{sys_uuid}}'

    自己不想写sql语句,可以用自然语言转化为SQL语言。

    5.15 选择器

    判断一下查询到的次数是否是0,如果数据库中没有当前sys_uuid的数据,那么查询到的次数就是0。就表示是新用户,就要询问用户昵称。否则就不是新用户那么无需再询问了。

    判断题条件就是刚刚检索的game_times的次数是否为0。

    5.16 结束节点

    结束节点这里,我们需要返回的数据:系统随机数,猜测轮数,本轮得分。

    回单内容:

    恭喜你~答案是{{guess_num}}! 你本次游戏总共猜测轮次为:{{guess_round}},得分:{{score}}欢迎再来哦~

    5.17 测试

    完整的工作流如下,可以测试一下

    清除之前的交互,重新输入开始

    六 工作流 - 排行榜

    新建一个工作流,用于检索数据库里的前10名。

    设置工作流名称和描述

    名称:load_game_board 描述:读取游戏得分榜单

    6.1 开始节点

    开始节点无需传入参数,所以去除默认的input参数即可。

    6.2 SQL自定义节点 - 统计当前用户总分&平均轮数

    首先查询一下当前用户的总分,以及平均轮数。

    输入变量:

    • sys_uuid,

    输出变量:

    • total_score,总分,数据类型:Integer

    • avg_round,平均轮数,数据类型:Number

    SQL语句:

    SELECT MAX(total_score) AS total_score, AVG(guess_round) AS avg_round FROM game_board WHERE sys_uuid = '{{sys_uuid}}'

    如果自己不想写,可以通过自然语言进行转化SQL语句

    测试一下,先查看一下数据库:

    这里我们有两条王二狗的数据。

    6.3 SQL自定义节点 - 统计前10名

    解析来,排行榜页面,我们展示前10名的数据。

    输入变量,无

    输出变量

    • sys_uuid,用户id

    • user_name,用户昵称

    • max_total_score,用户最高总分

    统计前10名SQL语句:

    SELECT sys_uuid, user_name, MAX(total_score) AS max_total_score FROM game_board GROUP BY sys_uuid ORDER BY max_total_score DESC LIMIT 10

    不想自己写SQL语句,可以通过编写自然语言转为SQL

    6.4 豆包编写一些测试假数据

    现在想测试一下这个节点的结果,但是我们的数据库里目前只有当前用户自己的两条数据。为了快速积攒一些数据,我们可以让豆包按照数据表结构,编写一些数据。

    先下载批量导入的模板:下载的模板是空的,所以自己粘贴进去一条数据。然后让豆包照着编。

    然后让豆包编几条:

    提示词:

    参照表格中的第一条数据,生成20条类似数据。guess_round+score=11。score取值范围:0-10。guess_number取值范围:1-100。user_name,尽可能看起来是真实名字。

    效果如下:

    然后导入:

    接下来,就可以测试了

    6.5 SQL自定义节点(可选)

    因为排行榜仅展示前10名数据,如果游戏比较火,玩的人多,那么当前用户的排名可能很靠后,所以排行榜上不一定上榜。那么就可以单独查询一下当前用户排多少,单独显示即可。

    这个功能是我额外加的,之所以可选,是觉得可以不做。但是如果要写的话,sql语句有一点麻烦,因为需要用到子查询。

    输入变量:

    • sys_uuid,用户id

    输出白娘:

    • my_rank,用户排名

    这里的思路是:先根据sys_uuid分组,然后检索出每个用户的最高总分。然后再查询出当前用户的最高总分。然后统计比用户最高总分的其他用户的数量,那么就是当前用户的排名了。

    SQL语句

    SELECT COUNT(*) AS my_rankFROM (    SELECT sys_uuid, MAX(total_score) AS max_total_score, bstudio_connector_id  ,bstudio_ref_type,bstudio_ref_id    FROM game_board     GROUP BY sys_uuid, bstudio_connector_id ,bstudio_ref_type,bstudio_ref_id) AS subqueryWHERE max_total_score >= (SELECT MAX(total_score) AS total_score FROM game_board WHERE sys_uuid = '{{sys_uuid}}')

    说明:1、这里的bstudio_connector_id ,bstudio_ref_type,bstudio_ref_id 3个字段,是数据表中的隐藏字段,不加会报错。但是和这条sql语句,其实没啥关系。 2、忽略多个用户总分相同的情况。

    测试一下,为了方便查看,清理了一下数据表,仅保留2条总分高于当前用户的数据。

    测试一下:

    6.6 结束节点

    结束节点要将数据返回出去。

    输出变量:

    • output,用户的成绩:总分和平均轮数

    • my_rank,用户的排名

    • outputList,排行榜前10名数据

    6.7 测试

    完整工作流如下

    测试一下

    七 UI界面设计 & 数据绑定

    现在所有的后台逻辑都实现了,接下来该将数据展示到前端页面上了。 首先选择布局,这里建议选择H5端。

    7.1 首页

    7.1.1 首页布局

    首页先搞俩DIV,一个展示个好看的宣传图,一个放俩按钮,进行跳转到两外两个页面。

    然后上传一张图片,设置一下高度和宽度都适应内容。

    文本框就设置:猜数字

    样式就标题一即可。

    然后DIV2里,放俩按钮,设置一下文本。

    7.1.2 底部导航

    修改底部导航:

    7.2 猜数字页

    7.2.1 新建页面

    新建一个页面,用于玩家猜数字。

    7.2.2 首页点击按钮跳转页面

    设置首页上“开始玩”按钮的点击事件

    7.2.3 页面布局

    拖进来一个对话组件

    7.2.4 设置对话流

    对话设置里,设置好对话流

    然后配置一下角色logo,这里可以自己放一张网图地址,也可以使用系统的icon。

    展开后,选择appInfo中的icon。

    然后再设置一下开场白和预置问题等。

    开场白:欢迎来到猜数字游戏,现在开始吗? 预置问题:开始

    7.2.5 预览测试

    然后点击预览:

    测试一下,没啥问题

    7.3 排行榜页面

    7.3.1 新建页面

    1、再新建个页面,用来展示排行榜

    7.3.2 首页点击按钮跳转页面

    首页上的另一个按钮,“排行榜”,点击后,要跳转到页面3。

    7.3.3 调用工作流

    然后在页面3的事件中,调用load_game_board工作流。工作流的结束节点返回的数据,需要展示在这个页面上。

    7.3.4 页面布局

    里面放俩DIV,一个用于展示前10名,一个展示当前用户自己的数据。

    第一个DIV里拖入一个列表

    在结构中展开list,去掉Image组件,这里用不到图片。

    将Text3复制一个,这样DIV5里就3个Text了。然后将这个DIV改为横向布局。

    7.3.5 绑定数据-排行榜

    A.先给List绑定数据,要绑定的就是load_game_board工作流返回的前10名数据。

    B.对于Text2组件,用于展示排名的序号。No.1,No.2,以此类推。设置完数据,样式调整为标题五。

    C.对于Text3组件,用于显示用户昵称,这个数据是工作流中返回的数据。

    D.Text4组件,用于显示用户的总分。

    5、页面优化

    绑定数据后,发现页面数据有点紧凑,那么就拉大一下数据之间的间距。

    7.3.6 当前用户数据

    在第二个DIV里,添加一个Markdown组件。用于展示个人数据。

    文本模板:

    你的累计得分:****你的排名:****平均猜中轮次:****

    预览测试:

    八 测试 & 发布

    从首页上预览。然后测试一下游戏是否可玩,排行榜是否显示数据。

    没啥问题就发布吧~

    ​​​​​​​

    Logo

    有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

    更多推荐