Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修改被隔离者状态转换逻辑,添加简要显示健康者数量随时间推移变化图 #56

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 36 additions & 2 deletions src/MyPanel.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
* 主面板。
Expand All @@ -21,6 +21,14 @@ public MyPanel() {
this.setBackground(new Color(0x444444));
}

List <Integer> list_normal = new ArrayList();
List <Integer> list_worldtime = new ArrayList();

int[] xPoints = {};
int[] yPoints = {};



@Override
public void paint(Graphics g) {
super.paint(g);
Expand All @@ -31,7 +39,28 @@ public void paint(Graphics g) {
g.setFont(new Font("微软雅黑", Font.BOLD, 16));
g.setColor(new Color(0x00ff00));
g.drawString("医院", Hospital.getInstance().getX() + Hospital.getInstance().getWidth() / 4, Hospital.getInstance().getY() - 16);
//绘制代表人类的圆点


list_normal.add((5000-PersonPool.getInstance().getPeopleSize(Person.State.NORMAL))/7); //[1344, 83]
list_worldtime.add((int) (worldTime ));

// System.out.println(list_normal.get(list_normal.size()-1));
xPoints = list_worldtime.stream().mapToInt(Integer::valueOf).toArray();
yPoints = list_normal.stream().mapToInt(Integer::valueOf).toArray();
// System.out.println(xPoints.length-1);

Graphics2D g2d = (Graphics2D) g.create();
// 抗锯齿
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 设置画笔颜色
g2d.setColor(Color.RED);
g2d.drawPolyline(xPoints, yPoints, xPoints.length);
// 自己创建的副本用完要销毁掉
g2d.dispose();



//绘制代表人类的圆点
List<Person> people = PersonPool.getInstance().getPersonList();
if (people == null) {
return;
Expand Down Expand Up @@ -112,9 +141,14 @@ class MyTimerTask extends TimerTask {
public void run() {
MyPanel.this.repaint();
worldTime++;

}
}





@Override
public void run() {
timer.schedule(new MyTimerTask(), 0, 100);//启动世界计时器,时间开始流动(突然脑补DIO台词:時は停た)
Expand Down
20 changes: 10 additions & 10 deletions src/Person.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ public class Person extends Point {
* 市民状态应该需要细分,虽然有的状态暂未纳入模拟,但是细分状态应该保留
*/
public interface State {
int NORMAL = 0;//正常人,未感染的健康人
int SUSPECTED = NORMAL + 1;//有暴露感染风险
int SHADOW = SUSPECTED + 1;//潜伏期
int CONFIRMED = SHADOW + 1;//发病且已确诊为感染病人
int FREEZE = CONFIRMED + 1;//隔离治疗,禁止位移
int NORMAL = 0;//正常人,未感染的健康人 0
int SUSPECTED = NORMAL + 1;//有暴露感染风险 1
int SHADOW = SUSPECTED + 1;//潜伏期 2
int CONFIRMED = SHADOW + 1;//发病且已确诊为感染病人 3
int FREEZE = CONFIRMED + 1;//隔离治疗,禁止位移 4

//已治愈出院的人转为NORMAL即可,否则会与作者通过数值大小判断状态的代码冲突
int DEATH = FREEZE + 1;//病死者
int DEATH = FREEZE + 1;//病死者 5
//int CURED = DEATH + 1;//治愈数量用于计算治愈出院后归还床位数量,该状态是否存续待定
}

Expand Down Expand Up @@ -195,13 +195,12 @@ private void action() {
public void update() {
//@TODO找时间改为状态机

if (state == State.FREEZE || state == State.DEATH) {
return;//如果已经隔离或者死亡了,就不需要处理了
if (state == State.DEATH) {
return;//如果死亡了,就不需要处理了
}

//处理已经确诊的感染者(即患者)
if (state == State.CONFIRMED && dieMoment == 0) {

if ((state == State.CONFIRMED ||state == State.FREEZE) && dieMoment == 0) {
int destiny = new Random().nextInt(10000) + 1;//幸运数字,[1,10000]随机数
if (1 <= destiny && destiny <= (int) (Constants.FATALITY_RATE * 10000)) {

Expand Down Expand Up @@ -267,3 +266,4 @@ public void update() {
}
}
}