手把手教你用C#做疫情传播仿真

在上篇文章中,我介绍了用C#做的疫情传播仿真程序的使用和配置,演示了其运行效果,但没有着重讲其中的代码。

今天我将抽丝剥茧,手把手分析程序的架构,以及妙趣横生的细节。

首先来回顾一下运行效果:

注意看,程序中的信息,包含信息统计、城市居民展示和医院展示三个部分,其中居民按状态的不同,显示为不同的颜色。

本文将先从程序员的角度,说说程序中的实现细节,细节中会聊一聊与与Java版的不同,最后进行总结。

细节介绍

细节介绍一 · 从“人”说起

居民类如下所示:

struct Person
{
    public PersonStatus Status;
    public Vector2 Position;
    public float EstimateDays;
    public float Direction;

    public static Person Create(float citySize)
    {
        // ...
    }

    public void Draw(DeviceContext ctx, XResource x)
    {
        // ...
    }

    public void MoveAroundInCity(float dt, float citySize)
    {
        // ...
    }
}

enum PersonStatus
{
    Healthy, // 健康
    InfectedInShadow, // 被感染,处于潜伏期
    Illness, // 发病
    InHospital, // 发病并进入医院
    Cured, // 治愈
    Dead, //死亡
}

一个城市将会模拟5000个居民,因此在设计这个类的时候,应该尽可能地考虑性能、节约内存。

所以,状态最好越少越好,在设计这个类的时候,我谨慎地保留了状态Status、当前位置Position、用于做状态机的EstimateDays和移动方向Direction这四个状态。

细节介绍二 – 居民的状态变更流

居民状态扭转过程如下所示:

 (有传染性,传染给健康人)
    
版权声明:本文为sdflysha原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sdflysha/p/20200209-ncp-simulation-dotnet-tutorial.html