行为树及其实现在笔者的项目中 NPC 要有自动化的行为, 例如怪物的巡逻, 寻敌和攻击, 宠物的跟随和战斗等. 完成这些需求最好的做法是使用行为树(Behavior Tree). 笔者查阅资料, 研究并实现了一个行为树, 可以满足游戏中相关的需求. 这里笔者简单作一些总结和分享, 推荐想要深入研究的同学去看文章最下面的参考资料, 这个一个非常好的行为树教程. 行为树的结构 顾名思义, 行为树首先是一棵树, 它有 November 18, 2019 #design
使用协程处理耗时过程游戏服务器常常有一些耗时的操作, 比如说给全服玩家发放奖励. 如果直接写一个循环, 遍历全服玩家, 给每个玩家发放奖励, 那么整个过程可能持续几分钟, 十几分钟甚至几十分钟, 整个进程都阻塞在这个过程中了. 解决这个问题的一种做法是使用定时器, 比如说每处理完 50 个玩家, 就停 1 秒, 1 秒后继续处理, 就像这样: 123456789101112131415function deal(li November 7, 2019 #lua
关于容错和断言的一些思考实际项目中的代码总是多多少少会有一些问题的. 面对一些问题, 我们有两种做法: 一种是容错, 把错误自行消化掉, 让代码能够继续往下运行; 另一种是加断言, 让错误发生时抛出异常, 把错误暴露出来, 并且能中断当前过程, 避免后续行为未定义. 这两种策略中, 笔者更偏爱后者. 因为无脑的容错最后会导致问题的根源不被解决, 使问题堆积, 导致代码腐败. 毕竟解决问题的第一步是面对问题, 而不是回避它 November 4, 2019 #experience
RSA算法背后的数学原理1. 引言 RSA算法(RSA algorithm)是一种非对称加密算法, 广泛应用在互联网和电子商务中. 它使用一对密钥进行加密和解密, 分别称为公钥(public key)和私钥(private key). 使用公钥加密的内容只能用私钥解密, 使用私钥加密的内容只能用公钥解密, 并且不能通过公钥在可行的时间内计算出私钥. 这使得加密通信不需要交换私钥, 保证了通信的安全. 那么它是怎么做到这一 October 24, 2019 #featured #math
通过 UNIX domain socket 在进程间传递文件描述符Linux 提供了一系列系统调用使我们能在进程间传递文件描述符. 这里的 “传递文件描述符” 不是简单地传递文件描述符这个32位整数, 而是真正地把这个文件句柄传递给目标进程, 使目标进程可以对文件执行读写操作. 现在假设 进程B 要给 进程A 发送文件描述符, 我们来看具体做法. 1. UNIX domain socket 要想传递文件描述符, 首先需要建立进程间通信. 这里我们需要用到 UNI October 11, 2019 #linux
解数独算法1. 引言 数独是一种经典的数字游戏, 玩家需要在一个 9*9 的棋盘上填数字, 保证每一行, 每一列和每一个小九宫格里的数字都是 1-9 且没有重复. 通常盘面上会给出一些提示数让玩家推导. sudoku 通常数独的解是唯一的, 但随着提示数的减少, 数独也可以有多个解; 极端情况下, 没有提示数, 数独也是可以解的, 只不过解的数量会非常多. 本文讨论解数独的算法, 并且尝试求出一个数独 October 7, 2019 #algorithms #featured
详解寻路算法(2)-生成图1. 引言 上篇文章 中主要讲解了 A* 算法. 然而 A* 算法只是一个图搜索算法, 我们在游戏中的地图通常是用一些不规则图形定义的一片行走区域, A* 算法并不能识别这样的地图. lol 因此我们要做的工作就是把一张这样的地图抽象成可用邻接矩阵或邻接链表表示的数学上的图 \(G=(V,E)\). 本文介绍两种方法, 可视图(visibility graph) 法和 导航网络(Naviga September 28, 2019 #algorithms #featured
编辑距离题目源自Leetcode: 编辑距离-leetcode 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例: 输入: word1 = “horse”, word2 = “ros” 输出: 3 解释: horse -> rorse (将 ‘h’ 替 September 23, 2019 #algorithms #leetcode
详解寻路算法(1)-图搜索1. 引言 寻路算法广泛应用在各种游戏中. 寻路算法要解决的问题是, 给定一个 “地图”(定义可行走区域), 一个起点, 和一个目标点, 求起点到目标点的最短路径. 解决寻路问题是一个复杂的过程, 涉及到若干个算法. 大体可以分为两个步骤: 1. 把 地图 抽象成 图. 这里的图指的是数学上的图 \(G=(V,E)\); 2. 对图进行搜索. 相比图搜索, 把地图抽象成图通常会比较复杂. 这篇文章 September 22, 2019 #algorithms #featured
牛顿迭代法求平方根1.先说结论 \(\sqrt{a}\) 可这样求得: 令 \(x_0\) 为任意实数, 执行以下迭代式: \[ x_i = \frac{x_{i-1}+\frac{a}{x_{i-1}}}{2} \tag{1} \] 迭代若干次, 当 \(\|x_i-x_{i-1}\|\) 小于想要的精度时便可停止迭代. 最终的 \(x_i\) 便可视为 \(\sqrt{a}\). 根据 (1) 式我们可以很快写 September 17, 2019 #math