手把手教你用C#做疫情傳播模擬
阿新 • • 發佈:2020-02-09
手把手教你用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
這四個狀態。
細節介紹二 - 居民的狀態變更流
居民狀態扭轉過程如下所示:
(有傳染性,傳染給健康人)