一、人格分类类型(共28种)
1.1 常规人格类型(25种)
常规人格类型通过15维度Pattern匹配计算得出,每种人格有固定的维度模式。
| 序号 | 代码 | 中文名称 | 核心标签 | Pattern模式 |
|---|---|---|---|---|
| 1 | CTRL | 拿捏者 | 宇宙熵增定律的天然反抗者,行走的人形自走任务管理器 | HHH-HMH-MHH-HHH-MHM |
| 2 | ATM-er | 送钱者 | 永远在"支付"时间、精力、耐心的人形ATM机 | HHH-HHM-HHH-HMH-MHL |
| 3 | Dior-s | 屌丝 | 犬儒主义先贤第欧根尼的精神传人,看穿一切"上进"的尽头 | MHM-MMH-MHM-HMH-LHL |
| 4 | BOSS | 领导者 | 手里永远拿着方向盘的人,永恒向上定律的践行者 | HHH-HMH-MMH-HHH-LHL |
| 5 | THAN-K | 感恩者 | 永不枯竭的正能量发射塔,能从霉斑里发现梵高星空 | MHM-HMM-HHM-MMH-MHL |
| 6 | OH-NO | 哦不人 | 秩序的守护神,所有意外和风险的扼杀者 | HHL-LMH-LHH-HHM-LHL |
| 7 | GOGO | 行者 | 所见即所得的极致实践者,只分"已完成"和"即将完成" | HHM-HMH-MMH-HHH-MHM |
| 8 | SEXY | 尤物 | 天生的魅力发射器,存在本身就是华丽的赋 | HMH-HHL-HMM-HMM-HLH |
| 9 | LOVE-R | 多情者 | 钢铁森林时代最后的吟游诗人,情感处理器是彩虹制的 | MLH-LHL-HLH-MLM-MLH |
| 10 | MUM | 妈妈 | 温柔的治愈者,超强共情力,对自己的温柔常常打折 | MMH-MHL-HMM-LMM-HLL |
| 11 | FAKE | 伪人 | 八面玲珑的社交变色龙,面具下空得很 | HLM-MML-MLM-MLM-HLH |
| 12 | OJBK | 无所谓人 | 帝王般的淡然,尔等凡俗的选择皆为蝼蚁 | MMH-MMM-HML-LMM-MML |
| 13 | MALO | 吗喽 | 灵魂停留在树上荡秋千的快乐时代,看透文明的无聊 | MLH-MHM-MLH-MLH-LMH |
| 14 | JOKE-R | 小丑 | 把笑话穿在身上,用最大笑声盖住心碎的声音 | LLH-LHL-LML-LLL-MLM |
| 15 | WOC! | 握草人 | 双系统运行:表面系统负责大惊小怪,后台系统负责冷静分析 | HHL-HMH-MMH-HHM-LHH |
| 16 | THIN-K | 思考者 | 大脑长时间处于思考状态,信息审判专家 | HHL-HMH-MLH-MHM-LHH |
| 17 | SHIT | 愤世者 | 嘴上骂世界是屎,手上默默收拾烂摊子的矛盾体 | HHL-HLH-LMM-HHM-LHH |
| 18 | ZZZZ | 装死者 | 直到死线才爆发的潜力股,不鸣则已一鸣惊人 | MHL-MLH-LML-MML-LHM |
| 19 | POOR | 贫困者 | 欲望断舍离后的资源再分配专家,精力压成一束激光 | HHL-MLH-LMH-HHH-LHL |
| 20 | MONK | 僧人 | 看破红尘,个人空间是神圣不可侵犯的结界 | HHL-LLH-LLM-MML-LHM |
| 21 | IMSB | 傻者 | 内心住着两个不死不休的战士:冲啊vs我是个傻逼 | LLM-LMM-LLL-LLL-MLM |
| 22 | SOLO | 孤儿 | 把软肋藏起来,用最硬的刺对着世界的刺猬 | LML-LLH-LHL-LML-LHM |
| 23 | FUCK | 草者 | 荒野上最后那一声狼嚎,情绪开关是物理拨片式的 | MLL-LHL-LLM-MLL-HLH |
| 24 | DEAD | 死者 | 看透一切的终极贤者,对一切"失去"了兴趣 | LLL-LLM-LML-LLL-LHM |
| 25 | IMFW | 废物 | 太没防备,太容易认真,需要精确控制环境的珍稀人格 | LLH-LHL-LML-LLL-MLL |
1.2 特殊人格类型(3种)
特殊人格类型不参与常规Pattern匹配,通过特定条件触发。
| 序号 | 代码 | 中文名称 | 触发条件 | 核心标签 |
|---|---|---|---|---|
| 26 | HHHH | 傻乐者 | 常规人格匹配度 < 60% | 思维回路过于清奇,标准人格库全面崩溃的兜底人格 |
| 27 | DRUNK | 酒鬼 | 特殊题目选择"将白酒灌在保温杯当白开水喝" | 体内流淌的不是血液,是美味的白酒 |
| 28 | (隐藏) | - | - | - |
二、十五维度评分系统
2.1 维度定义
测试采用15个维度进行评估,分为5个模型组:
自我模型(S系列)
情感模型(E系列)
态度模型(A系列)
行动驱力模型(Ac系列)
社交模型(So系列)
2.2 维度评分等级
每个维度根据得分划分为三个等级:
| 等级 | 代码 | 分数范围 | 含义 |
|---|---|---|---|
| 低 | L | ≤ 3分 | 该维度特征较弱 |
| 中 | M | = 4分 | 该维度特征中等 |
| 高 | H | ≥ 5分 | 该维度特征较强 |
2.3 维度等级解读
S1 自尊自信
S2 自我清晰度
S3 核心价值
E1 依恋安全感
E2 情感投入度
E3 边界与依赖
A1 世界观倾向
A2 规则与灵活度
A3 人生意义感
Ac1 动机导向
Ac2 决策风格
Ac3 执行模式
So1 社交主动性
So2 人际边界感
So3 表达与真实度
三、测试判定计分逻辑
3.1 题目结构
常规题目(30道)
- 每个维度对应2道题目
- 每道题目有3个选项,分值分别为1、2、3分
{
id: 'q1',
dim: 'S1', // 所属维度
text: '题目内容',
options: [
{ label: '选项A', value: 1 },
{ label: '选项B', value: 2 },
{ label: '选项C', value: 3 }
]
}
特殊题目(2道)
用于触发特殊人格类型:
题目1:饮酒爱好筛选题
{
id: 'drink_gate_q1',
special: true,
kind: 'drink_gate',
text: '您平时有什么爱好?',
options: [
{ label: '吃喝拉撒', value: 1 },
{ label: '艺术爱好', value: 2 },
{ label: '饮酒', value: 3 }, // 选择此项会触发第二道特殊题
{ label: '健身', value: 4 }
]
}
题目2:酒鬼触发题
{
id: 'drink_gate_q2',
special: true,
kind: 'drink_trigger',
text: '您对饮酒的态度是?',
options: [
{ label: '小酌怡情,喝不了太多。', value: 1 },
{ label: '我习惯将白酒灌在保温杯,当白开水喝,酒精令我信服。', value: 2 } // 选择此项触发DRUNK人格
]
}
3.2 计分流程
步骤1:计算原始分数
// 初始化所有维度分数为0
rawScores = { S1: 0, S2: 0, S3: 0, E1: 0, E2: 0, E3: 0, A1: 0, A2: 0, A3: 0, Ac1: 0, Ac2: 0, Ac3: 0, So1: 0, So2: 0, So3: 0 }
// 累加每个维度的题目分数
questions.forEach(q => {
rawScores[q.dim] += Number(app.answers[q.id] || 0);
});
每个维度最高分 = 2题 × 3分 = 6分
每个维度最低分 = 2题 × 1分 = 2分
步骤2:转换为等级
function sumToLevel(score) {
if (score <= 3) return 'L'; // 低分
if (score === 4) return 'M'; // 中分
return 'H'; // 高分(5-6分)
}
步骤3:生成用户向量
// 维度顺序
const dimensionOrder = ['S1','S2','S3','E1','E2','E3','A1','A2','A3','Ac1','Ac2','Ac3','So1','So2','So3'];
// 将等级转换为数字(L=1, M=2, H=3)
const userVector = dimensionOrder.map(dim => levelNum(levels[dim]));
// 示例:[3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 2, 3, 2]
步骤4:匹配人格类型
// 对每个常规人格类型计算距离
const ranked = NORMAL_TYPES.map(type => {
// 解析人格的Pattern(如 "HHH-HMH-MHH-HHH-MHM" → [3,3,3,2,3,2,3,3,3,3,3,3,2,3,2])
const vector = parsePattern(type.pattern).map(levelNum);
let distance = 0; // 总距离
let exact = 0; // 精准命中数
for (let i = 0; i < vector.length; i++) {
const diff = Math.abs(userVector[i] - vector[i]);
distance += diff;
if (diff === 0) exact += 1;
}
// 计算匹配度百分比
const similarity = Math.max(0, Math.round((1 - distance / 30) * 100));
return { ...type, distance, exact, similarity };
});
步骤5:排序规则
// 按以下优先级排序:
// 1. 距离越小越好
// 2. 精准命中数越多越好
// 3. 匹配度越高越好
ranked.sort((a, b) => {
if (a.distance !== b.distance) return a.distance - b.distance;
if (b.exact !== a.exact) return b.exact - a.exact;
return b.similarity - a.similarity;
});
3.3 结果分配规则
规则1:酒鬼优先判定
if (app.answers['drink_gate_q2'] === 2) {
finalType = TYPE_LIBRARY.DRUNK; // 直接分配酒鬼人格
modeKicker = '隐藏人格已激活';
badge = '匹配度 100% · 酒精异常因子已接管';
special = true;
}
规则2:傻乐者兜底判定
else if (bestNormal.similarity < 60) {
finalType = TYPE_LIBRARY.HHHH; // 强制分配傻乐者
modeKicker = '系统强制兜底';
badge = `标准人格库最高匹配仅 ${bestNormal.similarity}%`;
special = true;
}
规则3:常规匹配
else {
finalType = bestNormal; // 分配匹配度最高的人格
modeKicker = '你的主类型';
badge = `匹配度 ${bestNormal.similarity}% · 精准命中 ${bestNormal.exact}/15 维`;
}
3.4 匹配度计算公式
其中:
- distance = Σ|用户维度值 - 人格维度值|
- 最大可能距离 = 15维度 × (3-1) = 30
- 最小可能距离 = 0(完全匹配)
示例计算
假设用户向量:[3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 2, 3, 2]
CTRL人格向量:[3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 2, 3, 2]
计算:
- distance = |3-3| + |3-3| + ... + |2-2| = 0
- exact = 15(全部精准命中)
- similarity = (1 - 0/30) × 100 = 100%
四、测试交互判定规则
4.1 答题流程
开始测试
function startTest(preview = false) {
app.previewMode = preview;
app.answers = {};
// 1. 随机打乱30道常规题目
const shuffledRegular = shuffle(questions);
// 2. 随机插入第一道特殊题目
const insertIndex = Math.floor(Math.random() * shuffledRegular.length) + 1;
app.shuffledQuestions = [
...shuffledRegular.slice(0, insertIndex),
specialQuestions[0], // drink_gate_q1
...shuffledRegular.slice(insertIndex)
];
renderQuestions();
showScreen('test');
}
题目显示逻辑
function getVisibleQuestions() {
const visible = [...app.shuffledQuestions];
const gateIndex = visible.findIndex(q => q.id === 'drink_gate_q1');
// 如果选择了"饮酒"选项,插入第二道特殊题
if (gateIndex !== -1 && app.answers['drink_gate_q1'] === 3) {
visible.splice(gateIndex + 1, 0, specialQuestions[1]); // drink_gate_q2
}
return visible;
}
4.2 选项勾选逻辑
单选机制
- 每道题目只能选择一个选项
- 使用 radio 单选按钮实现
- 选择后立即保存答案
input.addEventListener('change', (e) => {
const { name, value } = e.target;
app.answers[name] = Number(value);
// 特殊处理:饮酒筛选题
if (name === 'drink_gate_q1') {
if (Number(value) !== 3) {
delete app.answers['drink_gate_q2']; // 清除酒鬼触发题答案
}
renderQuestions(); // 重新渲染题目列表
return;
}
updateProgress();
});
4.3 提交限制
完整性检查
function updateProgress() {
const visibleQuestions = getVisibleQuestions();
const total = visibleQuestions.length;
const done = visibleQuestions.filter(q => app.answers[q.id] !== undefined).length;
// 计算进度百分比
const percent = total ? (done / total) * 100 : 0;
progressBar.style.width = `${percent}%`;
progressText.textContent = `${done} / ${total}`;
// 判断是否完成
const complete = done === total && total > 0;
// 控制提交按钮状态
submitBtn.disabled = !complete;
// 更新提示文字
testHint.textContent = complete
? '都做完了。现在可以把你的电子魂魄交给结果页审判。'
: '全选完才会放行。世界已经够乱了,起码把题做完整。';
}
提交条件
- 必须完成所有可见题目
- 常规情况:31题(30常规 + 1特殊)
- 选择"饮酒"后:32题(30常规 + 2特殊)
4.4 结果跳转触发
触发条件
document.getElementById('submitBtn').addEventListener('click', renderResult);
点击"提交并查看结果"按钮时:
- 按钮必须处于启用状态(所有题目已完成)
- 调用
renderResult()函数 - 计算并显示结果
结果页面渲染
function renderResult() {
const result = computeResult(); // 计算结果
const type = result.finalType;
// 更新页面元素
document.getElementById('resultModeKicker').textContent = result.modeKicker;
document.getElementById('resultTypeName').textContent = `${type.code}(${type.cn})`;
document.getElementById('matchBadge').textContent = result.badge;
document.getElementById('resultTypeSub').textContent = result.sub;
document.getElementById('resultDesc').textContent = type.desc;
document.getElementById('posterCaption').textContent = type.intro;
// 渲染十五维度列表
renderDimList(result);
// 切换到结果页面
showScreen('result');
}
4.5 页面流转规则
开始测试
答题中...
进度: X/31
人格类型
十五维度
4.6 特殊交互规则
饮酒题目分支逻辑
├─ 选择"小酌怡情" → 继续常规流程
└─ 选择"白酒当水喝" → 触发DRUNK人格
题目随机化
- 30道常规题目每次测试随机打乱顺序
- 第一道特殊题目随机插入到常规题目中
- 保证每次测试体验不同
五、技术实现细节
5.1 核心数据结构
人格类型库
const TYPE_LIBRARY = {
"CTRL": {
"code": "CTRL",
"cn": "拿捏者",
"intro": "怎么样,被我拿捏了吧?",
"desc": "详细描述..."
},
// ... 其他人格类型
};
人格Pattern配置
const NORMAL_TYPES = [
{ "code": "CTRL", "pattern": "HHH-HMH-MHH-HHH-MHM" },
{ "code": "ATM-er", "pattern": "HHH-HHM-HHH-HMH-MHL" },
// ... 其他人格Pattern
];
维度元数据
const dimensionMeta = {
S1: { name: 'S1 自尊自信', model: '自我模型' },
S2: { name: 'S2 自我清晰度', model: '自我模型' },
// ... 其他维度
};
5.2 关键函数
| 函数名 | 功能 | 输入 | 输出 |
|---|---|---|---|
shuffle(array) |
随机打乱数组 | 数组 | 打乱后的新数组 |
sumToLevel(score) |
分数转等级 | 分数(2-6) | 等级(L/M/H) |
levelNum(level) |
等级转数字 | 等级(L/M/H) | 数字(1/2/3) |
parsePattern(pattern) |
解析Pattern | Pattern字符串 | 等级数组 |
getDrunkTriggered() |
检查酒鬼触发 | 无 | 布尔值 |
computeResult() |
计算测试结果 | 无 | 结果对象 |
renderResult() |
渲染结果页面 | 无 | 无 |
5.3 状态管理
const app = {
shuffledQuestions: [], // 打乱后的题目列表
answers: {}, // 用户答案 { questionId: value }
previewMode: false // 预览模式标志
};
六、总结
6.1 测试特点
- 娱乐性质强:测试结果采用荒诞、自嘲式的标签,如"死者"、"狗屎人"、"吗喽"等
- 半随机算法:题目顺序随机,但计分逻辑固定
- 多维度评估:采用15维度系统,比传统MBTI更细致
6.2 与MBTI对比
| 对比项 | SBTI | MBTI |
|---|---|---|
| 维度数量 | 15个维度 | 4个维度 |
| 人格类型 | 28种 | 16种 |
| 计分方式 | 向量距离匹配 | 二分法分类 |
| 结果风格 | 娱乐化、自嘲式 | 专业化、严肃 |
| 特殊人格 | 有(酒鬼、傻乐者等) | 无 |
6.3 技术架构
- 前端技术:原生HTML + CSS + JavaScript,无框架依赖
- 部署方式:纯静态可部署,可直接在浏览器打开运行
- 数据存储:所有数据内嵌于JavaScript代码中
- 交互实现:基于DOM操作和事件监听