双点医院吧 关注:14,374贴子:47,786
  • 2回复贴,共1

关于诊断率和治疗率的计算公式,来自反编译源码

取消只看楼主收藏回复

治疗:
public struct TreatmentCalculationBreakdown
{
public float ChanceOfSuccess; //治疗成功率,取决于下面的各种因素
public float DiagnosisCertainty; //诊断率
public float StaffSkill; //医生\护士治疗技能,等于病人治疗成功率界面的“员工技能”
//房间加成,包括仪器(升级)+药柜,等于病人治疗成功率界面的“升级”/2
public float RoomModifiers;
// 最小治疗成功率,取决于疾病类型, = 100% - 疾病难度
public float MinTreatmentEffectiveness;
public float MaxTreatmentEffectiveness; //最大治疗成功率,取决于疾病类型
}
成功率 = 诊断率x(最小成功率 + (最大成功率-最小成功率)x(min(100%,医生技能+房间加成))
最小成功率 = 100% - 疾病难度
房间加成 = 显示的“升级”数值/2
min(a,b)等于取a和b里的最小值,也就是“医生技能+房间加成”最大为100%,溢出的部分不算。
例:诊断率100%, 疾病难度60%, 最大成功率100%,医生技能50%,界面显示的房间加成50%,则
最小成功率 = 100% - 60% = 40%
房间加成 = 50/2 = 25
医生技能+房间加成 = 50+25 = 75
最终治疗成功率 = 100%x(40% + (100%-40%)x75%) =40% + 45% = 85%, 有时候这里会-1,也就是84%.
几个结论:
1,治疗会溢出,如果房间能堆到最大100/2 = 50(升级仪器或堆药柜),那么技能只要50就行了,LV5白板就50,心情加成还有10,对于药房来说仪器+50,护士学个专用技能+20,再升个两级就堆满了,技能栏可以拿去填别的。病房LV5+2专用技能+10个药柜,可以省出3个技能槽学别的,不堆药柜就学3专用技能。
2,最大成功率如果是100%(没找到来源,默认是100),那么最大成功率-最小成功率=100-最小成功率=疾病难度,公式可以简化为:
诊断率x((100%-疾病难度)+疾病难度*min(100%, 医生技能+房间加成))
也就是诊断率x((100%-疾病难度)+疾病难度*(医生技能+房间加成)), 其中医生技能+房间加成最大100%
诊断:
public struct DiagnosisCalculationBreakdown
{
public float Certainty; // 最终诊断率,由下面这些因素共同决定
public float Illness; // 基础诊断率,取决于疾病类型和诊断房间类型,有些疾病在特定诊断房间效果好,最低10%。
public float RoomMultiplier; // 房间加成,包括家具。
public float ItemMultiplier; // 病人和某个道具交互,得到的加成???? 不确定
public float RevistGP; // 第2次及以后重返全科诊断室的加成,
public float UpgradeMultiplier; // 科研加成
public float StaffMultiplier; // 护士\医生加成
}
公式很简单,把所有因素累乘:
Certainty = Illness * RoomMultiplier * ItemMultiplier * RevistGP * UpgradeMultiplier * StaffMultiplier
每进行一次新诊断,计算Certainty,和之前进行过的累加。
几个结论:
1,诊断技能不会溢出
2,如果有多个不同房间都可以进行诊断,会优先选择诊断率增加最高的
3,1-2-1三次诊断对有些病可能是无法避免的,那么是否有必要全科诊断技能5就见仁见智。
4,诊断加价会在每次诊断时减病人心情,所以便宜的诊断就别加价了,医生天赋和技能可以加心情,可以考虑堆一些技能到价格加倍也可以+心情。


IP属地:浙江1楼2018-09-18 21:36回复
    补充一下,治疗成功率<=0时必死,>=100时必成功。位于两者之间时先判断治疗是否成功:
    1,基础概率 = 成功率
    2,对基础概率进行修正,每次治疗成功会减少下一次的成功率,每次治疗失败会增加下一次的成功率,这样保证了不会总是成功,也不会总是失败。
    治疗失败后,有概率死亡:
    1,疾病类型决定基础死亡概率
    2,同样的方法进行概率修正,保证不会总是死,也不会总是不死。


    IP属地:浙江3楼2018-09-18 21:58
    回复(2)
      2025-08-21 20:43:03
      广告
      不感兴趣
      开通SVIP免广告
      选诊室的具体过程:
      1,先选出候选诊室队列:从所有已建立的诊室中选,每类型选一个。如果同一类型有多个,那么选择打分最低的那个(最好的),打分取决于排队长度+距诊室(门)距离+诊室员工是否满员+诊室是否开放,队伍长、距离远、没有满员、没开放都会加分(分越高越差)。
      2,如果已经访问过一次,就不再访问,从候选列表中删除。
      3,从剩下的候选诊室列表里,按下面的规则进行筛选,选择一个去访问:
      public static Room GetNextDiagnosisRoom(List<Room> rooms, Patient patient, Staff staff, ResearchManager researchManager)
      {
      if (rooms.Count == 0)
      {
      return null;
      }
      rooms.Shuffle(RandomUtils.GlobalRandomInstance); //乱序排列,似乎没什么意义,因为下面要排序
      //按诊断效果从大到小排序 ,即降序排列
      rooms.Sort(delegate(Room lhs, Room rhs) {
      float certainty = GameAlgorithms.GetDiagnosisCertainty(patient, lhs, staff, researchManager).Certainty;
      float certainty2 = GameAlgorithms.GetDiagnosisCertainty(patient, rhs, staff, researchManager).Certainty;
      if (certainty < certainty2)
      {
      return 1;
      }
      if (certainty > certainty2)
      {
      return -1;
      }
      return 0;
      });
      //随机选索引
      int num = RandomUtils.GlobalRandomInstance.Next(0, staff.RankDefinition.FurtherDiagnosisChoiceCount );
      //从队列里选取索引指向的诊室,如果索引超出了队列范围,则选择队列里最后一个。
      return (num < rooms.Count) ? rooms[num] : rooms[rooms.Count - 1];
      }
      这里的问题在于RandomUtils.GlobalRandomInstance.Next(0, staff.RankDefinition.FurtherDiagnosisChoiceCount );,这是产生一个[0, staff.RankDefinition.FurtherDiagnosisChoiceCount]中的随机整数,作为诊室候选列表的索引,比如索引0表示列表中的第一个,1表示第2个,5表示第6个,但是这里的FurtherDiagnosisChoiceCount似乎是一个常量1(虽然从名字看是和员工等级相关的一个值),也就是随机[0,1),结果永远等于0,也就是永远选择候选队列里的第一个,也就是诊断效果最好的。


      IP属地:浙江7楼2018-09-19 15:40
      回复(1)