一、人格分类类型(共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系列)

S1
自尊自信
S2
自我清晰度
S3
核心价值

情感模型(E系列)

E1
依恋安全感
E2
情感投入度
E3
边界与依赖

态度模型(A系列)

A1
世界观倾向
A2
规则与灵活度
A3
人生意义感

行动驱力模型(Ac系列)

Ac1
动机导向
Ac2
决策风格
Ac3
执行模式

社交模型(So系列)

So1
社交主动性
So2
人际边界感
So3
表达与真实度

2.2 维度评分等级

每个维度根据得分划分为三个等级:

等级 代码 分数范围 含义
L ≤ 3分 该维度特征较弱
M = 4分 该维度特征中等
H ≥ 5分 该维度特征较强

2.3 维度等级解读

S1 自尊自信

L对自己下手比别人还狠,夸你两句你都想先验明真伪。
M自信值随天气波动,顺风能飞,逆风先缩。
H心里对自己大致有数,不太会被路人一句话打散。

S2 自我清晰度

L内心频道雪花较多,常在"我是谁"里循环缓存。
M平时还能认出自己,偶尔也会被情绪临时换号。
H对自己的脾气、欲望和底线都算门儿清。

S3 核心价值

L更在意舒服和安全,没必要天天给人生开冲刺模式。
M想上进,也想躺会儿,价值排序经常内部开会。
H很容易被目标、成长或某种重要信念推着往前。

E1 依恋安全感

L感情里警报器灵敏,已读不回都能脑补到大结局。
M一半信任,一半试探,感情里常在心里拉锯。
H更愿意相信关系本身,不会被一点风吹草动吓散。

E2 情感投入度

L感情投入偏克制,心门不是没开,是门禁太严。
M会投入,但会给自己留后手,不至于全盘梭哈。
H一旦认定就容易认真,情绪和精力都给得很足。

E3 边界与依赖

L容易黏人也容易被黏,关系里的温度感很重要。
M亲密和独立都要一点,属于可调节型依赖。
H空间感很重要,再爱也得留一块属于自己的地。

A1 世界观倾向

L看世界自带防御滤镜,先怀疑,再靠近。
M既不天真也不彻底阴谋论,观望是你的本能。
H更愿意相信人性和善意,遇事不急着把世界判死刑。

A2 规则与灵活度

L规则能绕就绕,舒服和自由往往排在前面。
M该守的时候守,该变通的时候也不死磕。
H秩序感较强,能按流程来就不爱即兴炸场。

A3 人生意义感

L意义感偏低,容易觉得很多事都像在走过场。
M偶尔有目标,偶尔也想摆烂,人生观处于半开机。
H做事更有方向,知道自己大概要往哪边走。

Ac1 动机导向

L做事先考虑别翻车,避险系统比野心更先启动。
M有时想赢,有时只想别麻烦,动机比较混合。
H更容易被成果、成长和推进感点燃。

Ac2 决策风格

L做决定前容易多转几圈,脑内会议常常超时。
M会想,但不至于想死机,属于正常犹豫。
H拍板速度快,决定一下就不爱回头磨叽。

Ac3 执行模式

L执行力和死线有深厚感情,越晚越像要觉醒。
M能做,但状态看时机,偶尔稳偶尔摆。
H推进欲比较强,事情不落地心里都像卡了根刺。

So1 社交主动性

L社交启动慢热,主动出击这事通常得攒半天气。
M有人来就接,没人来也不硬凑,社交弹性一般。
H更愿意主动打开场子,在人群里不太怕露头。

So2 人际边界感

L关系里更想亲近和融合,熟了就容易把人划进内圈。
M既想亲近又想留缝,边界感看对象调节。
H边界感偏强,靠太近会先本能性后退半步。

So3 表达与真实度

L表达更直接,心里有啥基本不爱绕。
M会看气氛说话,真实和体面通常各留一点。
H对不同场景的自我切换更熟练,真实感会分层发放。

三、测试判定计分逻辑

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 匹配度计算公式

匹配度 = max(0, round((1 - distance / 30) × 100))

其中:

  • 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);

点击"提交并查看结果"按钮时:

  1. 按钮必须处于启用状态(所有题目已完成)
  2. 调用 renderResult() 函数
  3. 计算并显示结果

结果页面渲染

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 页面流转规则

首页 (intro)
开始测试
↓ 点击"开始测试"
测试页 (test)
答题中...
进度: X/31
↓ 所有题目完成 + 点击"提交"
结果页 (result)
人格类型
十五维度
↓ "重新测试" / "回到首页"
返回首页或重新开始

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 测试特点

  1. 娱乐性质强:测试结果采用荒诞、自嘲式的标签,如"死者"、"狗屎人"、"吗喽"等
  2. 半随机算法:题目顺序随机,但计分逻辑固定
  3. 多维度评估:采用15维度系统,比传统MBTI更细致

6.2 与MBTI对比

对比项 SBTI MBTI
维度数量 15个维度 4个维度
人格类型 28种 16种
计分方式 向量距离匹配 二分法分类
结果风格 娱乐化、自嘲式 专业化、严肃
特殊人格 有(酒鬼、傻乐者等)

6.3 技术架构

  • 前端技术:原生HTML + CSS + JavaScript,无框架依赖
  • 部署方式:纯静态可部署,可直接在浏览器打开运行
  • 数据存储:所有数据内嵌于JavaScript代码中
  • 交互实现:基于DOM操作和事件监听