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

增加了一些参数和功能 #53

Open
wants to merge 1 commit 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
24 changes: 17 additions & 7 deletions src/Constants.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

/**
* @ClassName: Constants
* @Description: TODO
Expand All @@ -6,12 +7,21 @@
*/
public class Constants {

public static int ORIGINAL_COUNT = 50;//初始感染数量
public static float BROAD_RATE = 0.8f;//传播率
public static float SHADOW_TIME = 140;//潜伏时间
public static int HOSPITAL_RECEIVE_TIME = 10;//医院收治响应时间
public static int BED_COUNT = 1000;//医院床位
public static float u = -0.99f;//流动意向平均值
public static int CITY_PERSON_SIZE = 5000;//城市总人口数量
public static int ORIGINAL_COUNT = 3;//初始感染数量
public static float BROAD_RATE = 0.7f;//传播率
public static float SHADOW_TIME = 80;//平均潜伏时间
public static int HOSPITAL_RECEIVE_TIME = 15;//医院收治响应时间
public static int BED_COUNT = 8;//初始医院床位
public static double uStart = 0.99;//流动意向初始值

public static double uA = 0.1;//流动意向递减加速度
public static int PERSON_NUM = 5000;//人口总数
public static int CURE_TIME = 120;//平均治愈时间
public static int BED_A = 2;//医院床位加速度
public static double MORTALITY= 0.03;//有床位死亡率
public static double MORTALITYNoBed= 0.3;//无床位死亡率
public static int GOVREACTION = 10;//政府反应时间

public static int deadNum = 0; //死亡数
public static int cureNum = 0;
}
84 changes: 63 additions & 21 deletions src/Hospital.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

import java.util.ArrayList;
import java.util.List;

Expand All @@ -10,11 +11,12 @@
public class Hospital {


private int x = 800;
private int y = 110;
private int x=800;
private int y=110;

private int width;
private int height = 606;
private int height=66;
//private int height=506;

public int getWidth() {
return width;
Expand All @@ -34,39 +36,79 @@ public int getY() {
}

private static Hospital hospital = new Hospital();

public static Hospital getInstance() {
public static Hospital getInstance(){
return hospital;
}

private Point point = new Point(800, 100);
private Point point = new Point(800,100);
private List<Bed> beds = new ArrayList<>();

private Hospital() {
if (Constants.BED_COUNT == 0) {
width = 0;
height = 0;
if(Constants.BED_COUNT==0){
width=0;
height=0;
}
int column = Constants.BED_COUNT / 100;
width = column * 6;

for (int i = 0; i < column; i++) {

for (int j = 10; j <= 610; j += 6) {
Bed bed = new Bed(point.getX() + i * 6, point.getY() + j);
int column = (int)(Math.ceil(Constants.BED_COUNT/10.0));
width = column*6;

int bedNum = Constants.BED_COUNT;
for(int i=0;i<column;i++){
for(int j=10;j<=66;j+=6){
if(bedNum<=0) break;
Bed bed = new Bed(point.getX()+i*6,point.getY()+j);
beds.add(bed);

bedNum--;
}
}
}


public Bed pickBed(){
for(Bed bed:beds){
if(bed.isEmpty()){
bed.setEmpty(false);
return bed;
}
}
return null;
}

public Bed pickBed() {
for (Bed bed : beds) {
if (bed.isEmpty()) {
public Bed getUsedBed(){
for(Bed bed:beds){
if(!bed.isEmpty()){
bed.setEmpty(true);
return bed;
}
}
return null;
}

public Bed getLastBed(){
return beds.get(beds.size()-1);
}

public List<Bed> getBeds(){
return beds;
}

public void refreshBeds() {
Bed lastBed = getLastBed();
int column = (int)(Math.ceil(Constants.BED_COUNT/10.0));
width = column*6;
//床位增长时
if(beds.size()<Constants.BED_COUNT){
//上一个床位如果在最后一行,就换行,否则只增加Y坐标
if(lastBed.getY()>=(point.getY()+66)){
Bed bed = new Bed(lastBed.getX()+6,point.getY()+10);
beds.add(bed);
}else{
Bed bed = new Bed(lastBed.getX(),lastBed.getY()+6);
beds.add(bed);
}

}
}

public Long getEmptyBedsNum() {
return beds.stream().filter(a->a.isEmpty()).count();
}
}
144 changes: 96 additions & 48 deletions src/MyPanel.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@

import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

/**
* @ClassName: MyPanel
Expand All @@ -12,86 +11,135 @@
*/
public class MyPanel extends JPanel implements Runnable {


private int pIndex = 0;

public MyPanel() {
super();
this.setBackground(new Color(0x444444));
}

@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(new Color(0x00ff00));//设置医院边界颜色
//绘制医院边界
g.drawRect(Hospital.getInstance().getX(), Hospital.getInstance().getY(),
public void paint(Graphics arg0) {
super.paint(arg0);
//draw border
//如果大于政府响应时间1.增加床位 2.减少人群活动
List<Person> people = PersonPool.getInstance().getPersonList();
Long confNum = people.stream().filter(a -> a.getState() == Person.State.CONFIRMED || a.getState() == Person.State.FREEZE).count();
if (worldTime / 10 >= Constants.GOVREACTION) {
if (worldTime % 10 == 0 && confNum > 30) {
Constants.BED_COUNT = Constants.BED_COUNT + Constants.BED_A;
if (Constants.BED_COUNT > 500) {
Constants.BED_COUNT = 500;
}
}
Hospital.getInstance().refreshBeds();
Constants.uStart = Constants.uStart - Constants.uA * 0.1;
if (Constants.uStart < -0.99) {
Constants.uStart = -0.99;
}
}
arg0.setColor(new Color(0x00ff00));
arg0.drawRect(Hospital.getInstance().getX(), Hospital.getInstance().getY(),
Hospital.getInstance().getWidth(), Hospital.getInstance().getHeight());
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<Person> people = PersonPool.getInstance().getPersonList();
//文字描绘:
arg0.setFont(new Font("宋体", Font.PLAIN, 20));
int intY = 20;
int intX = 10;
//arg0.drawString("worldTime: " + worldTime, intX + 10, intY + 80);
arg0.drawString("总人口: " + 5000, intX + 10, intY + 10);
Long susNum = people.stream().filter(a -> a.getState() == Person.State.SHADOW || a.getState() == Person.State.SUSPECTED).count();
arg0.drawString("疑似患者: " + susNum, intX + 180, intY + 10);
arg0.drawString("确诊患者: " + confNum, intX + 360, intY + 10);
arg0.setFont(new Font("宋体", Font.PLAIN, 24));
arg0.drawString("第 天", intX + 540, intY + 10);
arg0.setColor(Color.RED);
arg0.setFont(new Font("宋体", Font.PLAIN, 26));
arg0.drawString(worldTime / 10 + 1 + "", intX + 570, intY + 10);
arg0.setColor(new Color(0x00ff00));
arg0.setFont(new Font("宋体", Font.PLAIN, 20));
arg0.drawString("死亡人数: " + Constants.deadNum, intX + 10, intY + 40);
arg0.drawString("康复人数: " + Constants.cureNum, intX + 180, intY + 40);
if (worldTime / 10 >= Constants.GOVREACTION) {
arg0.drawString("医院总床位: " + Constants.BED_COUNT, intX + 730, intY + 40);
Long emptyBeds = Hospital.getInstance().getEmptyBedsNum();
arg0.drawString("空闲床位: " + emptyBeds, intX + 730, intY + 80);
arg0.drawString("人员流动意向值: " + Constants.uStart, intX + 730, intY + 10);
}
if (worldTime / 10 >= Constants.GOVREACTION && worldTime / 10 <= (Constants.GOVREACTION + 3)) {
arg0.setFont(new Font("宋体", Font.BOLD, 28));
arg0.setColor(Color.RED);
arg0.drawString("政府开始反应 ", intX + 350, intY + 80);
}
arg0.setFont(new Font("宋体", Font.PLAIN, 24));
arg0.setColor(new Color(0xdddddd));
arg0.drawString("未感染人员 " , intX + 800, intY + 290);
arg0.setColor(new Color(0xffee00));
arg0.drawString("疑似病例 " , intX + 800, intY + 320);
arg0.setColor(new Color(0xff0000));
arg0.drawString("确诊病例", intX + 800, intY + 350);
arg0.setColor(new Color(0xddddd));
arg0.drawString("康复病例" , intX + 800, intY + 380);


if (people == null) {
return;
}
people.get(pIndex).update();
for (Person person : people) {

switch (person.getState()) {
case Person.State.NORMAL: {
g.setColor(new Color(0xdddddd));
break;
case Person.State.NORMAL: { //正常
arg0.setColor(new Color(0xdddddd));

}
case Person.State.SHADOW: {
g.setColor(new Color(0xffee00));
break;
break;
case Person.State.SHADOW: { //疑似
arg0.setColor(new Color(0xffee00));

}
break;
case Person.State.CONFIRMED:
g.setColor(new Color(0xff0000));
break;
case Person.State.FREEZE: {
g.setColor(new Color(0x48FFFC));
break;
case Person.State.FREEZE: { //确诊
arg0.setColor(new Color(0xff0000));

}
break;
case Person.State.CURED: { //康复
arg0.setColor(new Color(0xddddd));
}
break;
case Person.State.DEAD: { //死亡
arg0.setColor(new Color(0x444444));
}
break;

}
person.update();
g.fillOval(person.getX(), person.getY(), 3, 3);
arg0.fillOval(person.getX(), person.getY(), 3, 3);

}
pIndex++;
if (pIndex >= people.size()) {
pIndex = 0;
}

//显示数据信息
g.setColor(Color.WHITE);
g.drawString("城市总人数:" + Constants.CITY_PERSON_SIZE, 16, 40);
g.setColor(new Color(0xdddddd));
g.drawString("健康者人数:" + PersonPool.getInstance().getPeopleSize(Person.State.NORMAL), 16, 64);
g.setColor(new Color(0xffee00));
g.drawString("潜伏者人数:" + PersonPool.getInstance().getPeopleSize(Person.State.SHADOW), 16, 88);
g.setColor(new Color(0xff0000));
g.drawString("感染者人数:" + PersonPool.getInstance().getPeopleSize(Person.State.CONFIRMED), 16, 112);
g.setColor(new Color(0x48FFFC));
g.drawString("已隔离人数:" + PersonPool.getInstance().getPeopleSize(Person.State.FREEZE), 16, 136);
g.setColor(new Color(0x00ff00));
g.drawString("空余病床:" + (Constants.BED_COUNT - PersonPool.getInstance().getPeopleSize(Person.State.FREEZE)), 16, 160);
}

public static int worldTime = 0;

public Timer timer = new Timer();

class MyTimerTask extends TimerTask {
@Override
public void run() {
MyPanel.this.repaint();
worldTime++;
}
}

@Override
public void run() {
timer.schedule(new MyTimerTask(), 0, 100);
while (true) {
this.repaint();
try {
Thread.sleep(200);
worldTime++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}


Expand Down
Loading