关键词: python入门实践 少年编程教育 turtle 类与对象 新冠肺炎模拟
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
运行截图:
高阶版:黄色为潜伏期个体,灰色为死亡个体,不会再移动
窗口标题显示当前天数
,感染人数
,总人数
随着模拟程序的运行,图中的点会逐渐由绿色变红,最终图中的点全部变为灰色,并不再移动。表面中只是一个个小点,但却是现实生活中无数条在新冠疫情丧生的鲜活生命。远疫情早日结束
思路启发:
注意问题:
面向对象:引入隔离状态和免疫
属性:
类属性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]
有问题欢迎通过邮箱交流。