SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

ウイルスシミュレータ

ナチュラルスタイル(IchigoJamの製造・販売元)の松田さんが作ったシミュレーションプログラム
https://yrm006.github.io/sars2.html
がとても興味深かったので、私もIchigoJamで作ってみました。
IchigoJamボードやweb版ではかなり遅いので、アプリ版やRaspberry Pi版で動かすことをお勧めします。

動かし方

  • 最初に、人間の人数、初期感染者数、感染確率、移動確率を入力します。

f:id:shiro0922:20200327150350p:plain

  • スペースキーを押すと、シミュレーションを開始します。スペースキーを押すごとに1日ずつ進みます。

f:id:shiro0922:20200327150456p:plain

f:id:shiro0922:20200327150519p:plain

  • 人=未感染者
  • ネコ=感染者(発症していない)
  • 宝箱=発症して入院中
  • イチゴ=快復して免疫を獲得した人
  • 十字架=死亡者

未感染者は設定した確率で移動し、感染者に出会うと設定した確率で感染します。
入院中の人は移動せず、感染も広げません。(院内感染は考えない)
快復時期になると、一定の確率(デフォルトは80%、1行目の変数F)で免疫を獲得して退院し、以降は感染しません。また、一定の確率(デフォルトは3%、1行目の変数G)で死亡者が出ます。
なお、感染してから発症するまでは14日、入院期間は10日で固定です。

設定パラメータをいろいろ変えて試してみると興味深いです。だいたい50日くらいで免疫獲得者ばかりになって収束しますが、それまでの感染者・入院者の数がだいぶ変わります。
テレビなどで「感染者○人」という数字だけ見ているとよくわからないのですが、こうしたシミュレータを動かしてみると、子ども達でもイメージがつかみやすいかもしれません。

プログラム

日本語版

1 CLV:CLS:F=80:G=3
2 INPUT "ニンズウ(1-100)   N=",N
3 INPUT "カンセンシャスウ(1-N)  E=",E
4 INPUT "カンセンカクリツ(0-100)A=",A
5 INPUT "イドウカクリツ(0-100)M=",M
6 ?:?"PUSH SPACE"
7 IF !BTN(32) CONT
8 WAIT 30
9 CLS
10 LC 10,23:?"N=";N;" E=";E;" A=";A;" M=";M;
11 FOR I=1 TO N
12 X=RND(31):Y=RND(23)
13 Z=0:IF I<=E Z=1
14 GSB 43
15 [I]=X+Y*32+Z*1024
16 NEXT
17 CLK:D=D+1:LC 0,23:?"DAY=";D;
18 FOR I=1 TO N
19 X=[I]&31:Y=[I]/32&31:Z=[I]/1024
20 IF Z>0 && Z<25 GSB 26
21 IF RND(100)<=M GSB 30
22 [I]=X+Y*32+Z*1024
23 NEXT
24 IF INKEY()!=32 CONT
25 GOTO 17
26 Z=Z+1:IF Z<25 RTN
27 R=RND(100):IF R>F Z=0
28 IF R>99-G Z=26
29 RTN
30 IF Z>=15 && Z<=24 || Z=26 GSB 43:RTN
31 U=X+RND(3)-1
32 V=Y+RND(3)-1
33 IF U<0 U=30
34 IF U>30 U=0
35 IF V<0 V=22
36 IF V>22 V=0
37 H=SCR(U,V)
38 IF H=236 && Z=0 && RND(100)<A Z=1
39 LC X,Y:?CHR$(0)
40 X=U:Y=V
41 GSB 43
42 RTN
43 LC X,Y
44 IF Z=0 C=249
45 IF Z>=1 && Z<=14 C=236
46 IF Z>=15 && Z<=24 C=246
47 IF Z=25 C=255
48 IF Z=26 C=43
49 ?CHR$(C)
50 RTN

英語版

パラメータ入力時のメッセージを変えただけで、その他は同じです。

1 CLV:CLS:F=80:G=3
2 INPUT "People(1-100)     N=",N
3 INPUT "Carrior(1-N)      E=",E
4 INPUT "Infect rate(0-100)A=",A
5 INPUT "Move rate(0-100)  M=",M
6 ?:?"PUSH SPACE"
7 IF !BTN(32) CONT
8 WAIT 30
9 CLS
10 LC 10,23:?"N=";N;" E=";E;" A=";A;" M=";M;
11 FOR I=1 TO N
12 X=RND(31):Y=RND(23)
13 Z=0:IF I<=E Z=1
14 GSB 43
15 [I]=X+Y*32+Z*1024
16 NEXT
17 CLK:D=D+1:LC 0,23:?"DAY=";D;
18 FOR I=1 TO N
19 X=[I]&31:Y=[I]/32&31:Z=[I]/1024
20 IF Z>0 && Z<25 GSB 26
21 IF RND(100)<=M GSB 30
22 [I]=X+Y*32+Z*1024
23 NEXT
24 IF INKEY()!=32 CONT
25 GOTO 17
26 Z=Z+1:IF Z<25 RTN
27 R=RND(100):IF R>F Z=0
28 IF R>99-G Z=26
29 RTN
30 IF Z>=15 && Z<=24 || Z=26 GSB 43:RTN
31 U=X+RND(3)-1
32 V=Y+RND(3)-1
33 IF U<0 U=30
34 IF U>30 U=0
35 IF V<0 V=22
36 IF V>22 V=0
37 H=SCR(U,V)
38 IF H=236 && Z=0 && RND(100)<A Z=1
39 LC X,Y:?CHR$(0)
40 X=U:Y=V
41 GSB 43
42 RTN
43 LC X,Y
44 IF Z=0 C=249
45 IF Z>=1 && Z<=14 C=236
46 IF Z>=15 && Z<=24 C=246
47 IF Z=25 C=255
48 IF Z=26 C=43
49 ?CHR$(C)
50 RTN