瘟疫模拟——群体建模专题设计
疫情模拟器
设计思想
为了更真实直接的展示疫情的发展速度,让公众提高警惕不要外出,设计一个疫情模拟器来模拟此次新冠肺炎的传播。在此疫情模拟器中,通过UGUI面板来制作简单的UI,展示健康人数、患病人数、潜伏期人数、医院床位,以及可以在一定范围内自定义城市人数、初始感染人数、传播率、潜伏时间、医院床位、医院收治时间、流动意向等参数,来显示不同情况下的疫情传播,使大家能明白疫情的严峻性,从而让大家都安心呆在家里,直到我们战胜疫情。
技术方案
核心划分
四个关键类:人、城市、医院、病毒
整体架构
红色是患病、绿色是住院、白色是健康、黄色是潜伏。
人物随机移动:方向为上下左右,不超过边界。
计算传播率=传播概率/100f*流动意向/100f。
UI界面
首先利用UGUI的相关组件拼面板,分为6个部分,左边的InformPanel,标题面板TitlePanel,右边的SettingPanel,下方的DownPanel,中央的TipsPanel,和City面板。结果如图:
逻辑:在实验中,会变化的板块只有左边的InformPanel(各种人数会随疫情模拟的情况不同变化),右边的SettingPanel(实现自定义各种数值,从而对疫情模拟产生影响),中央的提示条(数据加载中,点击开始模拟按钮后,数据条会变成倒计时的字样,然后消失),其余的板块都是固定的不会发生变化。所以此处为了控制三个不同板块的变化,就写三个脚本(InformPanel,SettingPanel,TipsPanel)分别挂载到对应的板块上。
各脚本核心功能和主要代码简介:
(1) InformPanel:在当前数据面板中,主要声明了四个会随实验进行而变化的数据,由于此脚本中声明的许多变量可能在其它面板脚本中被调用,所以声明静态变量,方便后续调用。即:public static InformPanel instance;
写四个函数,分别用于显示各类人数:
//设置面板显示的健康人数
public void SetJKNum(int num)
{
txtJKNum.text = num + "人";
nowJKNum = num;
}
public void SetJKNum(int num)
{
txtJKNum.text = num + "人";
nowJKNum = num;
}
//设置面板显示的潜伏人数
public void SetQFNum(int num)
{
txtQFNum.text = num + "人";
nowQFNum = num;
}
//设置面板显示的爆发人数
public void SetBFNum(int num)
{
txtBFNum.text = num + "人";
nowBFNum = num;
}
//设置面板显示的剩余床位
public void SetCWNum(int num)
{
txtCWNum.text = num+"/"+Virus.HOSPITAL_BED_NUM;
nowBedNum = num;
}
再写四个改变各类人数的方法:
//改变健康人数的方法
public void ChangeJKNum(bool isAdd=false)
{
nowJKNum += isAdd ? 1 : -1;
SetJKNum(nowJKNum);
}
//改变潜伏人数的方法
public void ChangeQFNum(bool isAdd = true)
{
nowQFNum += isAdd ? 1 : -1;
SetQFNum(nowQFNum);
}
//改变爆发人数的方法
public void ChangeBFNum(bool isAdd = true)
{
nowBFNum += isAdd ? 1 : -1;
SetBFNum(nowBFNum);
}
//改变床位人数的方法
public void ChangeBedNum(bool isAdd = false)
{
nowBedNum += isAdd ? 1 : -1;
SetCWNum(nowBedNum);
}
在初始化面板函数中调用上述设置人数的方法,但要注意调用时的参数都与后续的Virus类相关。如城市的健康人数=总人数-患病人数,患病人数即Virus中被感染的人数,即://健康人数=城市人数-患病人数
SetJKNum(num - Virus.INFECTION_NUM);
(2)SettingPanel:从UI中可以看出,在此面板中有许多可自定义数值的框,所以在这个脚本中首先要做的就是声明这些变量。同时为了方便调用,也将该脚本声明为静态变量。
public static SettingPanel instance;
//城市人口
public InputField inputNum;
//初始感染人数
public InputField inputInitNum;
//传播概率
public InputField inputRateNum;
//潜伏时间
public InputField inputTime;
//医院床位
public InputField inputCWNum;
//医院收治时间
public InputField inputSZTime;
//流动意向
public InputField inputLD;
在UI中输入值后,点击“开始模拟”按钮,就可以模拟不同的疫情情况。点击开始模拟,首先是会在城市中创建人。所以写一个ClickBegin()函数,由于用户输入值时不排除有乱输或者输入值过大导致程序崩溃的情况,于是如果有不太合适的数字就赋给默认值代替。如下: