想让 Coze 应用更有趣?猜数游戏加个排行榜,朋友圈互动感拉满,教程附详细步骤
我们还需要从数据库中查询该用户的最大总积分。假如一个人玩了多次,每次都会在数据库中增加一条记录。那么total_score,其实是需要统计的。我们要查找这个人的所有记录,然后取total_score的最大值。这里,添加一个SQL自定义节点,来查询数据库,查询用户累计得分的最大值。如果自己不想写sql语句,也可以编写自然语言,然后让AI生成SQL语句。回头开始节点处,这里有个问题,就是如果用户不是第
一 效果展示
应用链接: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组件。用于展示个人数据。
文本模板:
你的累计得分:****你的排名:****平均猜中轮次:****

预览测试:

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

没啥问题就发布吧~

更多推荐
所有评论(0)