聚会娱乐机器人

几年前大家开始通过微信拜年,基于vbot折腾过机器人,想要给所有alias不为空的好友发送定制问候,在发送不到10人消息之后,自己微信的WEB端口被封。无奈尝下没有技术和被墙的泪水。

作为码农,能自动化处理的事情,为什么一定得人工?

项目说明

几天前无意中浏览到Wechaty,于是再次萌发了做个机器人的想法。这次做一个娱乐向的机器人~

游戏特色

本次开发了谁是卧底小游戏,房主无法设置游戏角色及人数,要求至少4人参加。每轮游戏结束后会重新分配各角色人数,增加随机趣味性。[扫最下方的二维码,发送ding自动加好友体验~]

假定总人数为ALL
平民人数[P]:默认 总人数一半 + 1 向下取整
卧底人数[W]:默认 随机 1 到 总人数 - 平民人数
白板人数[B]:ALL - P - W
额外分配:若W大于3则会再次分配,随机减少 0 或 W - 2人数,减少的人数加到P头上
因此一般的人数规律是:3/1/0,3/1/1,3/2/0,4/1/1,4/2/0....

游戏规则:

游戏结束:
存活人数/游戏人数 <= 1/2时,即 2/4,2/5,3/6,3/7,4/8
胜利条件:
1.平民淘汰所有卧底和白板 平民胜
2.卧底存活至游戏结束 卧底胜
3.所有卧底出局后白板仍然存活 白板胜

附上部分逻辑代码说明。

/**
 * 定义当前轮次游戏角色数目
 * @param  {Number} playLength [游戏总人数]
 * @return {Array}             [平民、卧底、白板每种角色的具体人数]
 */
Word.defRoleNum = function (playLength) {
    let Civilian, Undercover = 0
    Civilian = parseInt(playLength / 2) + 1 // 一半 + 1
    Undercover = randomNum(1, playLength - Civilian) // 随机卧底数目
    if (Undercover > 3) { // 如果卧底大于3个
        const rand = randomNum(0, Undercover - 2)
        Civilian += rand // 最少保留1个卧底 其它归到平民
        Undercover -= rand
    }
    const Blank = playLength - Civilian - Undercover // 白板人数
    return [Civilian, Undercover, Blank];
}
// 定义当前轮次每玩家对应角色
Word.defTurn = function (playsList) {
    const playLength = playsList.length
    if (playLength < 4) {
        return
    }
    const roles = this.defRoleNum(playLength)
    const roleList = deepClone(roles)
    const randomWord = randomNum(1) ? this.randomWord() : this.randomWord().reverse()
    // 难得再转化 直接汉字
    let role = '平民';
    let word = '';
    let newPlaysList = []
    for (var i = 0; i < playLength; i++) {
        var index = randomNum(playsList.length - 1); //随机下标
        if (roles[2]) {
            role = '白板';
            word = '';
            roles[2]--;
        } else if (roles[1]) {
            role = '卧底';
            word = randomWord[1];
            roles[1]--;
        } else {
            role = '平民';
            word = randomWord[0];
        }
        playsList[index].role = role
        playsList[index].word = word
        // 顺便按顺序排号
        newPlaysList.push(playsList[index])
        playsList.splice(index, 1); //    将随机出的元素在arr中删除
        // console.log(roles)
    }
    // 排序
    newPlaysList.sort((a, b) => {
        return a.self_id - b.self_id
    })
    const first = randomNum(1, newPlaysList.length)
    return { roleList, playsList: newPlaysList, first }
}

项目使用

目录结构

  • config文件夹存放公共配置文件以及flyio请求相关配置
  • imgs存放相关图片
  • listeners存放机器人初始化后一系列事件处理(分模块)
    • games 游戏模块
      • iswho.js 谁是卧底核心模块
    • on-friendship.js 处理好友请求
    • on-login.js 处理登录
    • on-message.js 处理用户消息、群消息
    • on-scan.js 处理登录二维码
    • on-work.js 做一些额外任务
  • schedule 对定时任务node-schedule库进行了封装
  • migrations 数据库迁移文件
  • api 存放所有的数据请求、接口封装都在此
  • utils 公用方法的封装
  • app.js 入口文件
  • db.js 数据库入口文件
  • knexfile.js 数据库配置文件

如何使用

  1. 修改config配置 打开config/index.js 文件,将里面的配置改为自己的。 token 和 name 必填 appToken.tianxin 也必填
  2. 修改天行接口配置 天行 api 官网 :https://tianapi.com/
    注册成功后,申请以下接口:
  3. 依赖sqlite3 和 redis, redis应需要单独安装

然后就可以运行了

npminstall
npm run initdb
npm start

已实现功能

  • 发送加群关键字,自动拉人进群。
  • 场景模式
    • 谁是卧底
  • 神回复
  • 英语一句话
  • 天气查询
  • 发送关键字,踢人

列几个有趣的功能,后续慢慢完善:

  • 随机匿名好友聊天
  • 生活向文字冒险游戏

谁是卧底小游戏

Image text Image text Image text Image text

作者: osindex Code: Github

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解非平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值