## 【python】利用turtle库可视化模拟新冠疫情
## 高阶版运行结果展示
![](https://www.writebug.com/myres/static/uploads/2022/2/18/3aeec2d0e7a39d95e090a5b251799603.writebug)
*随着模拟程序的运行,图中的点会逐渐由绿色变红,最终图中的点全部变为灰色,并不再移动。*
*点的颜色不同分别代表个体处于不同的健康状态:**绿色为健康,黄色为潜伏期,红色为感染,而灰色则代表死亡。***
*计算机以绝对理性且冰冷的态度追随代码的运行让一个个点在无序运动逐渐变化颜色*,*但这却是2020年新冠肺炎爆发以来无数条因此丧生的鲜活生命。*
*愿疫情早日结束!*
## 代码讲解
### 基础版:模拟新冠疫情爆发早期,新冠病毒刚开始出现
- 面向对象:设计人的类应有的方法和属性
- 属性:
- 健康状态 `status`,分为`健康`和`患病`
- 此时人们没有在意健康问题,都不戴口罩
- 方法
- `__init__`:定义对象的属性
- `move`:人的随机运动
- `infect`:健康人与患者距离小于50,则有50%的概率感染
- 画布尺寸:设置人员位置,活动范围
- 实现病毒的传播,即新冠肺炎可以由患者传染给健康的人
#### python代码
``` python
# 相关类库的导入
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)
# 距离计算函数,计算两个人之间的距离
def dis(a,b):
d = math.sqrt((a.x-b.x)**2 + (a.y - b.y)**2)
return d
# turtle的相关设定
turtle.setup(TOTAL_W*2+200,TOTAL_H*2,0,0)
turtle.screensize(TOTAL_W, TOTAL_H)
turtle.clearscreen()
turtle.hideturtle()
turtle.tracer(False)
# 实验的人数参数设定
total_num = 100
infected_num = random.randint(0,total_num) # 这里以随机数确定起始感染人数
healthy_num = total_num - infected_num
# 所有人的数组
persons = []
# 健康人
for i in range(healthy_num):
t1 = person(0)
persons.append(t1)
# 患者
for i in range(infected_num):
t1 = person(1)
persons.append(t1)
# 记录程序开始运行的时间
start = datetime.datetime.now()
while infected_num<total_num:
# 遍历每两个人
for a in persons:
for b in persons:
if id(a)==id(b):
continue
elif a.status == 0 and b.status > 0 and dis(a,b) < DANGER_DIS :
#如果 a 健康,b 感染 ,且距离小于安全距离,则a可能被感染
a.infect(RATE)
# 每个人都会运动
for a in persons:
a.move()
turtle.update()
time.sleep(1 / 300)
turtle.bye()
end = datetime.datetime.now()
print("全部感染计算机用时",end-start)
```
### 进阶版:模拟新冠疫情爆发初期,民众防疫意识加强,开始佩戴口罩
- 面向对象:为人的类`person`添加新的方法和属性
- 属性:
- **类属性`total_num`:实验总人数**
- **类属性`infected_num`:感染人数**
- 实例属性 `status`,表示该对象的健康状态,分为`健康`和`患病`
- **实例属性 `mask`,表示该个体是否佩戴口罩,分为`佩戴口罩`和`不佩戴口罩`**
此时人们开始关注新冠疫情,部分人开始佩戴口罩。
佩戴口罩可以有效降低感染率(**以下数据为主观猜测,未经验证和校对**)
具体情况如下:
| 患者是否佩戴口罩 | 健康人是否佩戴口罩 | 健康人的感染率 |
| ---------------- | ------------------ | -------------- |
| 佩戴 | 佩戴 | 1 % |
| 佩戴 | 不佩戴 | 15 % |
| 不佩戴 | 佩戴 | 30 % |
| 不佩戴 | 不佩戴 | 80 % |
- 方法
- `__init__`:定义对象的属性
- `move`:人的随机运动
- `infect`:健康人与患者距离小于50,则有根据他们是否佩戴口罩,有不同的概率感**染**
- **turtle标题可以显示当前天数和感染人数**
- **引入天数的概念**
``` python
# 相关类库的导入
import math
import random
import turtle
import time
import datetime
# 有关参数的定义
TOTAL_W = 500 #模拟场地总宽度
TOTAL_H = 400 #模拟场地总高度
DANGER_DIS = 50 #传染距离
# 感染率
# W = without Mask 不带口罩
# M = Mask 带口罩
# IR Infection Rate 传染率
# 前面的是 患者是否戴口罩
# 后面的是 健康是否戴口罩
# 值表示的是健康人员的传染概率
IR_WW = 0.8 #双方都不带口罩的传染率
IR_MM = 0.01 #双方都戴口罩的传染率
IR_WM = 0.3 #患病一方不戴口罩,健康者戴口罩
IR_MW = 0.15 #患病一方戴口罩,健康者不戴口罩
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 ==
没有合适的资源?快使用搜索试试~ 我知道了~
COVID-19Simulation-python-master.zip
共6个文件
py:3个
md:1个
license:1个
需积分: 9 0 下载量 122 浏览量
2023-01-29
10:01:37
上传
评论
收藏 12KB ZIP 举报
温馨提示
基于turtle实现的新冠疫情传播模
资源推荐
资源详情
资源评论
收起资源包目录
COVID-19Simulation_python-master.zip (6个子文件)
covid-19simulation_python
LICENSE 1KB
高阶版.py 6KB
基础版.py 3KB
.gitignore 2KB
进阶版.py 5KB
README.md 21KB
共 6 条
- 1
资源评论
计算机毕设论文
- 粉丝: 1w+
- 资源: 399
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功