1. 程式人生 > >手把手教你用C#做疫情傳播模擬

手把手教你用C#做疫情傳播模擬

手把手教你用C#做疫情傳播模擬

姐妹篇:手把手教你用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這四個狀態。

細節介紹二 - 居民的狀態變更流

居民狀態扭轉過程如下所示:

 (有傳染性,傳染給健康人)