美文网首页
Python笔记-模拟病毒传染(第二版:彩色字符方式)

Python笔记-模拟病毒传染(第二版:彩色字符方式)

作者: 我开心0536 | 来源:发表于2020-03-02 10:04 被阅读0次

【功能】
模拟病毒传染,用彩色字符的方式做个模拟
(python 3.7版本下调试成功)
【比第一版的改变】
1、显示方式由数字变为彩色字符
2、已经达到病情最严重级别的人员,不在移动位置。

第二版:模拟病毒传染-最终结果.jpg

【以下为代码,右上角有复制按钮,可一键复制】

#用数组模拟病毒传染(彩色字符方式)    仅做演示 Ver:20200302.02
import numpy as np  #导入numpy库,用于数组生成
import random   #导入random库,主要用做下面代码中的生成随机数功能

#  ==============================
#  开始请设定以下初始值:
#  ==============================
changdi_x = 10      # 【场地X】初始空白场地高度,也就是几行,默认10行
changdi_y = 18      # 【场地Y】初始空白场地宽度,也就是几列,默认18列
renshu_1  = 10      # 【人数1】在这个空白场地上,初始有多少个健康的人(人数不能超过行x列的总和),默认20人
renshu_2  = 1       # 【人数2】在这个空白场地上,健康人中,初始有多少个感染病毒人员(初始感染病毒人数必须小于初始健康人数)(初始病毒人数越大,传染速度越快),默认1人
bingqingjibie = 99  # 【病情级别】病人病情级别达到多少级别时,代表这个病人已经死亡。 每一局病人病情自动增加1,代表病情加重1级,默认99级

def print_txt():  #用带颜色的字符,打印输出数组
    for x in range(0,changdi_x):        # 从第一行开始循环,直到最后一行
        for y in range(0,changdi_y):       #每行从第一列开始循环,直接最后一列
            if arr[x][y] == 0 :   # 空白的 正常颜色
                print('\033[0m□',end='')
            elif arr[x][y] == 1:  #1 健康的 显示为绿色
                print('\033[32m■' , end='')
            elif arr[x][y] == 2 :  #2 刚刚被感染的 显示为黄色
                print('\033[33m■' , end='')
            elif arr[x][y] >= 99 : # 最高级别的 显示为重红色
                print('\033[31m■' , end='')
            else: # 剩下的就是中间程度的  显示为淡红色
                print('\033[35m■' , end='')
        print('\033[0m\r')  #每行尾部换行,并设置成正常颜色
    print('图示:\033[0m□代表空白场地,\033[32m■代表健康人员,\033[33m■代表刚刚被感染的人员, \033[35m■代表中度感染的人员,  \033[31m■代表最严重人员。 \033[0m')

#创建指定长度或者形状的全零数组 zeros()函数, 此处代表创建空白场地,用全是0的数组来表示
arr = np.zeros((changdi_x,changdi_y))
print("第一步:空白场地已经生成如下,场地大小为:",changdi_x,"行x",changdi_y,"列")
#print(arr)
print_txt()

#开始向里放置健康人员
cishu=1  #循环次数,每放一个人加1次,当达到健康人数时停止循环
while cishu <= renshu_1 :
    x = random.randint(0, changdi_x-1)  #在这个场地中,开始随机放置人员,这是随机生成位置的【行】
    y = random.randint(0, changdi_y-1)  #在这个场地中,开始随机放置人员,这是随机生成位置的【列】
    if  arr[x][y] != 1: #如果这个行列位置已经是1(代表有人了),就换一个位置,直到这个位置是没人的行和列
        arr[x][y]= 1
        cishu = cishu + 1 #每放置成功一个人,计数加1
print('\n第二步:',renshu_1,'名健康人员已经随机放置进空白场地中')
#print(arr)
print_txt()

#开始放置数值为2的人(2代表感染病毒人员)
cishu=1  #循环次数,每放一个人加1次,当达到初始病毒人数时停止循环
while cishu <= renshu_2 :
    x = random.randint(0, changdi_x-1)  #在这个场地中,开始随机放置人员,这是随机生成位置的【行】
    y = random.randint(0, changdi_y-1)  #在这个场地中,开始随机放置人员,这是随机生成位置的【列】
    if  arr[x][y] == 1: #如果这个行列位置已经是1(代表有人了)
        arr[x][y]= 2
        cishu = cishu + 1 #每放置成功一个人,计数加1
print('\n第三步:初始',renshu_2,'名健康人员感染病毒发作')
#print(arr)
print_txt()

temp = input("\n初始准备已经完成,即将地开始病毒传染模拟\n 1、病人级别每天自动加重1级直到最重级别;\n 2、病人可传染上下左右相邻的健康人员;\n 3、人员可每天随机移动1格(达到严重病情的不移动);\n请在此处按任意键开始模拟: ")

#  ==============================
#  以上初始布局已经全部完成,下面开始循环
#  ==============================
cishu=1 # 开始局数设定为1,记录局数 ,或者代表天数
while sum(sum(arr)) < renshu_1 * bingqingjibie :  # 初始人数 x 最高病情级别,代表每个人都达到最重病情级别时结束:
    print('\n【第',cishu,'天模拟开始】 ')

    #  ==============================
    #  每局病人自身加重1级(数值加1),并且检测上下左右相邻是否有健康(数值是1)的人员,如果有就传染他(健康人员的数值从1变成2)
    #  ==============================
    for x in range(0,changdi_x):        # 从第一行开始循环,直到最后一行
        for y in range(0,changdi_y):       #每行从第一列开始循环,直接最后一列
            if arr[x][y] > 1 and  arr[x][y]< 200 :   #如果当前位置是不健康的人(数值不是0或1的人,0代表空地,1代表健康的人,大于等于2的代表带病毒的人)

                #如果检测到病毒人员,每局病情自身加重1级
                if arr[x][y] < bingqingjibie:     #如果病人严重程度没有到99级,就对这个病人每局病情加重一级。如果已经到了99级,权当代表这个病人已经OVER了
                    arr[x][y] = arr[x][y] + 1     #每局,自身数字+1,代表每一局病情又严重了1级
                    print('  坐标为',x+1,',',y+1,'的病人病情加重1级,达到',arr[x][y],'级')
                else:
                    print('  坐标为',x+1,',',y+1,'的病人已达到最高',bingqingjibie,'级')

                #开始检测这个病毒人员上下左右是否有相邻的健康人员,有的话就传染给这个相邻的健康人员
                if x > 1:                 #先确定当前人员X坐标不是在第一行(因为第一行人员上面就不可能再有一行了)
                    if arr[x-1][y] == 1:  #检测上面相邻的人是否为1(1代表相邻有健康的人),如果是就传染他(把1变成2)
                        arr[x-1][y] = 2
                        print('        他传染了上面相邻的人,感染人数 +1')
                        renshu_2 = renshu_2 +1 #染病总人数+1

                if x < changdi_x-1:       #先确定当前人员X坐标不是在最后一行
                    if arr[x+1][y]==1:    #检测下面相邻的人是否为1,如果是就把1变成2并放大100倍.(放大100倍,是为了防止新病人再被重新计算一次)
                        arr[x+1][y] = 200
                        print('        他传染了下面相邻的人,感染人数 +1')
                        renshu_2 = renshu_2 +1 #染病总人数+1

                if y > 1 :                #先确定当前人员y坐标不是在最左边,即第一列
                    if arr[x][y-1] == 1:  #检测左面相邻的人是否为1,如果是就把1变成2
                        arr[x][y-1] = 2
                        print('        他传染了左面相邻的人,感染人数 +1')
                        renshu_2 = renshu_2 +1 #染病总人数+1

                if y < changdi_y-1 :      #先确定当前人员y坐标不是在最右边,即最后一列
                    if arr[x][y+1]==1:    #检测右面相邻的人是否为1,如果是就把1变成2并放大100倍(放大100倍,是为了防止新病人再被重新计算一次)
                        arr[x][y+1] = 200
                        print('        他传染了右面相邻的人,感染人数 +1')
                        renshu_2 = renshu_2 +1 #染病总人数+1

    #上面为了防止向右、向下被传染的人员,在同一局中再一次传染别人,所以在上面将数值放大了100倍。本局传染结束,通过下面再缩小100倍还原回原数值
    for x in range(0,changdi_x):        # changdi_x
        for y in range(0,changdi_y):    # changdi_y
            if arr[x][y] >=200 :        # 将上面为了防止重复移动而放大100倍的数值再缩小回来。
                arr[x][y] = arr[x][y] / 100
    print('当前传染结果为:')
    #print(arr)
    print_txt()

    if renshu_2 == renshu_1 : #染病人数等于总人数时,代表全部被感染
        print("\n当前是模拟进行的第", cishu, "天,\n在",changdi_x,"x",changdi_y,"的场地上,\n所有人员共计",renshu_1,"名全部被感染!!!")
        renshu_2 = renshu_2 + 1 # 病人数+1,防止本段代码重复执行
        temp = input("按任意建继续模拟,直到所有人员均达到最严重病情级别")

    #  ==============================
    #  所有人员开始移动位置,代表人员可以流动。 每人每局可移动一次,一次只能上下左右移动一格,并且移动到的位置要没有人才可。
    #  ==============================
    for x in range(0,changdi_x):        # changdi_x
        for y in range(0,changdi_y):    # changdi_y
            if arr[x][y] > 0 and arr[x][y] <bingqingjibie :   # 如果这个位置有人(0代表空地,1代表健康人,2及以上代表病人),则该人随机上下左右移动  #病情级别达到最高的就不移动了
                fangxiang = random.choice(['向上','向下','向左','向右']) #随机生成移动方向
                if fangxiang == '向上' and x > 0 :   #随机数字=1,代表准备向上移动。 如果要向上,必须保证当前人员不是在最顶上一行
                    if  arr[x-1][y] == 0 :      #并且上面位置没有人
                        arr[x-1][y] = arr[x][y] #上面的位置 变成 当时位置的数值
                        arr[x][y] = 0           #原先的位置空出来,变成0
                        print(x+1,',',y+1,'  向上移动了一步')

                if fangxiang == '向下' and x < changdi_x-1 :  #随机数字=2,代表准备向下移动。如果要向下,必须保证当前人员不是在最底下一行
                    if  arr[x+1][y] == 0 :               #并且下面位置没有人
                        arr[x+1][y] = arr[x][y]*100      #下面的位置变成 当时位置的数值*100。 乘以100,以为了防止在本局再移动一次!
                        arr[x][y] = 0                    #原先的位置空出来,变成0
                        print(x+1,',',y+1,'  向下移动了一步')

                if fangxiang == '向左' and y > 0 :     #随机数字=3,代表准备向左移动。如果要向左,必须保证当前人员不是在最左头
                    if  arr[x][y-1] == 0 :        #并且左面位置没有人
                        arr[x][y-1] =  arr[x][y]  #在面的位置 变成 当时位置的数值
                        arr[x][y] = 0             #原先的位置空出来,变成0
                        print(x+1,',',y+1,'  向左移动了一步')

                if fangxiang == '向右' and y < changdi_y-1 :     #随机数字=4,代表准备向右移动。 如果要向左,必须保证当前人员不是在最右边
                    if  arr[x][y+1] == 0 :                  #并且右面位置没有人
                        arr[x][y+1] = arr[x][y]*100         #右面的位置变成 当时位置的数值*100。 乘以100,以为了防止在本局再移动一次!
                        arr[x][y] = 0                       #原先的位置空出来,变成0
                        print(x+1,',',y+1,'  向右移动了一步')

    #上面为了防止向右、向下移动后的人员,在同一局中再一次被重复移动,所以在上面将数值放大了100倍。现在移动结束,通过下面再缩小100倍还原回原数值
    for x in range(0,changdi_x):        # changdi_x
        for y in range(0,changdi_y):    # changdi_y
            if arr[x][y] >=100 :        # 将上面为了防止重复移动而放大100倍的数值再缩小回来。
                arr[x][y] = arr[x][y] / 100
    print('当前移动结果为:')
    # print(arr)
    print_txt()
    cishu = cishu + 1

print("\n当前是模拟进行的第", cishu, "天,\n在", changdi_x, "x", changdi_y, "的场地上,\n所有人员共计", renshu_1, "名全部被传染,并且全部达到最严重级别!!!")

相关文章

  • Python笔记-模拟病毒传染(第二版:彩色字符方式)

    【功能】模拟病毒传染,用彩色字符的方式做个模拟(python 3.7版本下调试成功)【比第一版的改变】1、显示方式...

  • Python笔记-模拟病毒传染(第三版:Pygame图片方式)

    【功能】模拟病毒传染,用Pygame图片方式做个模拟(python 3.7版本下调试成功)【比第二版的改变】1、显...

  • Python笔记-模拟病毒传染(第一版:数字方式)

    【功能】模拟病毒传染,目前还不会用图形编程来表达,所以用文本的方式做个模拟(python 3.7版本下调试成功)【...

  • 【灭世猜想】02病毒说

    病毒就像一阵龙卷风,传染性病毒是十级超级龙卷风。 灭世猜想第二篇——病毒说。 突发的、未知的、具备快速传染性、死亡...

  • 病毒传染

    现在最严重的病毒就是流感。村上有的严重的都封路。奶奶的村也封路了,就是因为病毒太严重了,所以封路都不让见。...

  • 病毒传染

    肚子昨夜突然发烧,折腾半夜,下半夜睡的也不怎么好,早上天没亮又被老姐一电话给打醒。 早上状态不好,北风呼呼的吹...

  • 自动转发抽奖微博程序

    写了个自动转发抽奖微博的程序,实现了python版,我的母语java版写了大半,流程就是:模拟登录微博->模拟搜索...

  • scrapy笔记(3)-微博模拟登录及抓取微博内容

    参考阅读 基于python的新浪微博模拟登陆Python模拟登录新浪微薄(使用RSA加密方式和Cookies文件新...

  • 在html展示JSON

    方式一:以默认黑体显示Json字符串。 html部分: js部分: 方式二:以彩色显示Json字符串。 html部...

  • 字符串拼接

    update:2018-07-11 python3.6版本以后新出了一种字符串拼接方式 1. format 2. ...

网友评论

      本文标题:Python笔记-模拟病毒传染(第二版:彩色字符方式)

      本文链接:https://www.haomeiwen.com/subject/ebxpkhtx.html