【python】利用turtle庫可視化模擬新冠疫情
關鍵詞: python入門實踐 少年編程教育 turtle 類與對象 新冠肺炎模擬
高階班程序運行展示
隨着模擬程序的運行,圖中的點會逐漸由綠色變紅,最終圖中的點全部變爲灰色,並不再移動。
點的顏色不同分別代表個體處於不同的健康狀態:綠色爲健康,黃色爲潛伏期,紅色爲感染,而灰色則代表死亡。
計算機以絕對理性且冰冷的態度追隨代碼的運行讓一個個點在無序運動逐漸變化顏色,但這卻是2020年新冠肺炎爆發以來無數條因此喪生的鮮活生命。
願疫情早日結束!
代碼講解
基礎版:模擬新冠疫情爆發早期,新冠病毒剛開始出現
- 面向對象:設計人的類應有的方法和屬性
- 屬性:
- 健康狀態
status
,分爲健康
和患病
- 此時人們沒有在意健康問題,都不戴口罩
- 健康狀態
- 方法
__init__
:定義對象的屬性move
:人的隨機運動infect
:健康人與患者距離小於50,則有50%的概率感染
- 屬性:
- 畫布尺寸:設置人員位置,活動範圍
- 實現病毒的傳播,即新冠肺炎可以由患者傳染給健康的人
類的相關代碼
如果對該程序興趣,可以私聊我獲取完整源碼
# 相關類庫的導入
import math
import random
import turtle
import time
import datetime
# 有關參數的定義
TOTAL_W = 500 #模擬場地總寬度
TOTAL_H = 400 #模擬場地總高度
DANGER_DIS = 50 #傳染距離
RATE = 0.5 #傳染率
class person(object):
def __init__(self,status):
self.turt = turtle.Turtle()
self.turt.shape('circle')
# 健康狀態,1 爲確診 0 爲健康
self.status = status
if self.status == 1:
self.turt.color("red")
else:
self.turt.color("green")
#隨機定義該點的位置
self.x = random.randint(-TOTAL_W*0.9,TOTAL_W*0.9)
self.y = random.randint(-TOTAL_H*0.9,TOTAL_H*0.9)
self.turt.penup()
self.turt.goto(self.x,self.y)
def move(self):
dx = random.randint(-2, 2)
dy = random.randint(-2, 2)
if - TOTAL_W*0.9 < self.x + dx < TOTAL_W*0.9:
self.x+=dx
else:
self.x-=dx
if - TOTAL_W*0.9 < self.y + dy < TOTAL_W*0.9:
self.y+=dx
else:
self.y-=dy
#如果他們超出了邊界就會往回走
self.turt.penup()
self.turt.goto(self.x, self.y)
def infect(self,rate):
x = random.randrange(0,100)
# 根據傳入的感染率的參數
if x/100 < rate:
self.status = 1 #此人被感染
self.turt.color('red')
def reset(self):
self.turt.penup()
self.turt.setpos(self.pos)
運行截圖
基礎版:綠色代表健康個體,紅色爲患病個體
進階版:模擬新冠疫情爆發初期,民衆防疫意識加強,開始佩戴口罩
-
面向對象:爲人的類
person
添加新的方法和屬性-
屬性:
-
類屬性
total_num
:實驗總人數 -
類屬性
infected_num
:感染人數 -
實例屬性
status
,表示該對象的健康狀態,分爲健康
和患病
-
實例屬性
mask
,表示該個體是否佩戴口罩,分爲佩戴口罩
和不佩戴口罩
此時人們開始關注新冠疫情,部分人開始佩戴口罩。
佩戴口罩可以有效降低感染率(以下數據爲主觀猜測,未經驗證和校對)
具體情況如下:患者是否佩戴口罩 健康人是否佩戴口罩 健康人的感染率 佩戴 佩戴 1 % 佩戴 不佩戴 15 % 不佩戴 佩戴 30 % 不佩戴 不佩戴 80 %
-
-
方法
__init__
:定義對象的屬性move
:人的隨機運動infect
:健康人與患者距離小於50,則有根據他們是否佩戴口罩,有不同的概率感染
-
-
turtle標題可以顯示當前天數和感染人數
-
引入天數的概念
類的相關代碼
如果對該程序興趣,可以私聊我獲取完整源碼
# 相關類庫的導入
import math
import random
import turtle
import time
import datetime
# 有關參數的定義
TOTAL_W = 500 #模擬場地總寬度
TOTAL_H = 400 #模擬場地總高度
DANGER_DIS = 50 #傳染距離
class person(object):
#類屬性
infected_num = 0
total_num = 0
def __init__(self,status,mask):
person.total_num += 1
self.turt = turtle.Turtle()
# 是否帶口罩,1圓形 爲戴口罩/0方形 爲不戴口罩,
self.mask = mask
if self.mask == 1:
self.turt.shape('circle')
elif self.mask == 0:
self.turt.shape('square')
# 健康狀態,1 爲確診/0 爲健康
self.status = status
if self.status == 1:
self.turt.color("red")
self.infected_day = 0
person.infected_num += 1
else:
self.turt.color("green")
#隨機定義該點的位置
self.x = random.randint(-TOTAL_W*0.9,TOTAL_W*0.9)
self.y = random.randint(-TOTAL_H*0.9,TOTAL_H*0.9)
self.turt.penup()
self.turt.goto(self.x,self.y)
def move(self):
dx = random.randint(-2, 2)
dy = random.randint(-2, 2)
if - TOTAL_W*0.9 < self.x + dx < TOTAL_W*0.9:
self.x+=dx
else:
self.x-=dx
if - TOTAL_W*0.9 < self.y + dy < TOTAL_W*0.9:
self.y+=dx
else:
self.y-=dy
#如果他們超出了邊界就會往回走
self.turt.penup()
self.turt.goto(self.x, self.y)
def infect(self,rate):
x = random.randrange(0,100)
if x/100 < rate:
self.status = 1 #此人被感染
self.infected_day = 0 #有了感染天數,且變爲0
self.turt.color('red')
person.infected_num+=1 #感染人數+1
def day(self):
if self.status == 1:
self.infected_day += 1
光理論是不夠的,在此送大家一套2020最新Python全棧項目視頻教程,點擊此處 免費獲取,希望大家一起進步哦!
運行截圖
進階版:方塊爲未佩戴口罩的個體,紅色爲佩戴口罩的個體
窗口標題顯示當前天數
,感染人數
,總人數
高階版:模擬新冠疫情爆發中期,人們逐漸瞭解肺炎的相關性質(潛伏、死亡等)
-
面向對象:引入潛伏期和患病天數的概念,引入死亡的概念
-
屬性:
-
類屬性
total_num
:實驗總人數 -
類屬性
infected_num
:感染人數 -
實例屬性
status
,表示該對象的健康狀態,分爲健康
、潛伏
、確診
-
實例屬性
infected_day
,表示患病天數,當患病天數大於4天后有一定概率由潛伏轉變爲確診,大於7天有一定概率死亡 -
實例屬性
mask
,表示該個體是否佩戴口罩,分爲佩戴口罩
和不佩戴口罩
此時人們開始關注新冠疫情,部分人開始佩戴口罩。
佩戴口罩可以有效降低感染率(以下數據爲主觀猜測,未經查證)
具體情況如下:患者是否佩戴口罩 健康人是否佩戴口罩 健康人的感染率 佩戴 佩戴 1 % 佩戴 不佩戴 15 % 不佩戴 佩戴 30 % 不佩戴 不佩戴 80 %
-
-
方法
__init__
:定義對象的屬性move
:人的隨機運動,但是健康患者不會到隔離區,確診患者只會在隔離區infect
:健康人與患者距離小於50,則有根據他們是否佩戴口罩,有不同的概率感染day
:如果這個人已患病,則調用這個函數其患病天數+1,當患病天數大於最短潛伏期後,一定概率轉爲確診,大於最短死亡期後,一定概率死亡
-
-
turtle標題可以顯示當前天數、感染人數、死亡人數、總人數
類的相關代碼
如果對該程序興趣,可以私聊我獲取完整源碼
# 相關類庫的導入
import math
import random
import turtle
import time
import datetime
class person(object):
#類屬性
infected_num = 0
total_num = 0
dead_num = 0
def __init__(self,status,mask):
person.total_num += 1
self.turt = turtle.Turtle()
# 是否帶口罩,1爲戴口罩 圓形/0爲不戴口罩 方形
self.mask = mask
if self.mask == 1:
self.turt.shape('circle')
elif self.mask == 0:
self.turt.shape('square')
# 健康狀態,2 爲確診 紅色/1 爲潛伏 黃色/0 爲健康 綠色
self.status = status
if self.status == 2:
self.infected_day = 0
person.infected_num += 1
self.turt.color("red")
elif self.status == 1:
self.infected_day = 0
person.infected_num += 1
self.turt.color("yellow")
else:
self.turt.color("green")
#隨機定義該點的位置
self.x = random.randint(-TOTAL_W*0.9,TOTAL_W*0.9)
self.y = random.randint(-TOTAL_H*0.9,TOTAL_H*0.9)
self.turt.penup()
self.turt.goto(self.x,self.y)
def move(self):
dx = random.randint(-2, 2)
dy = random.randint(-2, 2)
if - TOTAL_W*0.9 < self.x + dx < TOTAL_W*0.9:
self.x+=dx
else:
self.x-=dx
if - TOTAL_W*0.9 < self.y + dy < TOTAL_W*0.9:
self.y+=dx
else:
self.y-=dy
#如果他們超出了邊界就會往回走
self.turt.penup()
self.turt.goto(self.x, self.y)
def infect(self,rate):
x = random.randrange(0,100)
if x/100 < rate:
self.status = 1 #此人的狀態進入潛伏期
self.infected_day = 0 #有了感染天數,且變爲0
self.turt.color('yellow')
person.infected_num+=1
def day(self):
if self.status > 0:
if self.infected_day >= 7:
x = random.randrange(0,100)
if x/100 < DEATH_Rate: #死亡率爲5%
#確定死亡時返回某個值
return -1
if self.status == 1:
self.infected_day += 1
if self.infected_day >= 4:
x = random.randrange(0,100)
if x/100 < Diagnose_Rate:
self.status = 2
self.turt.color('red')
return 0
def dead(self):
# 死亡以後顏色變爲灰色
self.turt.color('gray')
person.total_num -= 1
person.dead_num += 1
if self.status>0:
person.infected_num -= 1
def __del__(self):
person.total_num -= 1
if self.status>0:
person.infected_num -= 1
運行截圖:
高階版:黃色爲潛伏期個體,灰色爲死亡個體,不會再移動
窗口標題顯示當前天數
,感染人數
,總人數
思路啓發:
- 治癒功能
- 免疫功能
- 隔離功能
- 新冠肺炎和年齡相關,是否加入年齡的屬性
- 是否加入性別
注意問題:
- python的turtle庫進行模擬,因爲極其耗費CPU,計算量太多了,有些功能不好實現,看下面的例子
【已經失敗】最終版:模擬新冠疫情爆發後期,政府開始組織治療、隔離
-
面向對象:引入隔離狀態和免疫
-
屬性:
-
類屬性
total_num
:實驗總人數 -
類屬性
infected_num
:感染人數 -
類屬性
dead_num
:死亡人數 -
類屬性
isolated_num
:隔離人數 -
實例屬性
status
,表示該對象的健康狀態,分爲健康
、潛伏
、確診
、免疫
認爲
康復
的人具備對新冠肺炎的抵抗力(僅爲主觀猜測,未查找相關資料求證) -
實例屬性
infected_day
,表示患病天數,當患病天數大於4天后有一定概率由潛伏轉變爲確診,大於7天有一定概率死亡 -
實例屬性
isolated
,表示該對象是否被隔離,一旦確診立刻送往隔離 -
實例屬性
mask
,表示該個體是否佩戴口罩,分爲佩戴口罩
和不佩戴口罩
此時人們開始關注新冠疫情,部分人開始佩戴口罩。
佩戴口罩可以有效降低感染率(以下數據爲主觀猜測,未經驗證和校對)
具體情況如下:患者是否佩戴口罩 健康人是否佩戴口罩 健康人的感染率 佩戴 佩戴 1 % 佩戴 不佩戴 15 % 不佩戴 佩戴 30 % 不佩戴 不佩戴 80 %
-
-
方法
__init__
:定義對象的屬性,但是起始狀態健康的人不會出現在隔離區move
:人的隨機運動,但是健康患者不會到隔離區,確診患者只會在隔離區內infect
:健康人與患者距離小於50,則有根據他們是否佩戴口罩,有不同的概率感染day
:如果這個人已患病,則調用這個函數其患病天數+1,當患病天數大於最短潛伏期後,一定概率(診斷率)轉爲確診,大於最短死亡期後,一定概率(死亡率)死亡isolated
:如果此人確診,則立即送往隔離區域heal
:對隔離區患者進行治療,如果治療成功則變爲免疫
狀態
-
-
分配隔離區域爲左上區域
-
編程失敗,隔離功能沒法寫,CPU效率不夠,會直接卡死
光理論是不夠的,在此送大家一套2020最新Python全棧項目視頻教程,點擊此處 免費獲取,希望大家一起進步哦!
如有幫助,歡迎點贊/轉載~
(聽說給文章點讚的人代碼bug特別少👀)
聯繫郵箱:[email protected]
有問題歡迎通過郵箱交流。