使用Java程序模拟实现新冠病毒传染效果

简单介绍

2020年注定是不平凡的一年,新冠肺炎肆虐全球,传染性特别强,目前全球感人人数还在逐渐攀升,作为中华儿女特别感谢政府作出的努力,非常感谢并致敬医护人员,是他们的努力为我们创造安全的环境,向你们致敬!

模拟方案

以下是程序粗略的模拟病毒传染过程,具体方案如下:

首先需要构造一个200 * 200的格子界面有四种不同的颜色状态标记着程序执行的过程程序执行10次,初始化格子也就是0的时候,需要在整个格子最中心的100个格子标记为红色,剩余数据随机抽取四千(且不能重复)标记为黑色,其余没有标记的为白色。之后第2次到第10次的所有数据随机转化为不同颜色

#说明

红色代表已确诊黑色代表已死亡白色代表隔离期绿色代表未感染

模拟结果

执行源码

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

import javax.swing.JFrame;

public class DrawSee extends JFrame {

	private static final long serialVersionUID = -3469074514775590338L;
	private static final int sx = 20;// 游戏区域200*200方块的起始横坐标
	private static final int sy = 40;// 游戏区域200*200方块的起始纵坐标
	private static final int w = 3;// 每个小方格的边长
	private static final int rw = 600;// 游戏区域200*200方块的边长

	private Graphics jg;
	private Color rectColor = new Color(0xf5f5f5);
	/**
	* DrawSee构造方法
	*/
	public DrawSee() {
		Container p = getContentPane();
		setBounds(100, 100, 650, 650);
		setVisible(true);
		p.setBackground(rectColor);
		setLayout(null);
		setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		try {
			Thread.sleep(500);
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 获取专门用于在窗口界面上绘图的对象
		jg = this.getGraphics();
		// 绘制游戏区域
		paintComponents(jg);
	}

	/**
	* 开始
	*/
	public void paintComponents(Graphics g) {
		try {
			// 设置线条颜色为红色
			g.setColor(Color.WHITE);

			// 绘制外层矩形框
			g.drawRect(sx, sy, rw, rw);

			int N = 200;
			/*
			* 绘制水平200个,垂直200个方格。 即水平方向199条线,垂直方向199条线, 外围四周4条线已经画过了,不需要再画。
			*/
			for (int i = 1; i < N; i++) {
				// 绘制第i条竖直线
				g.drawLine(sx + (i * w), sy, sx + (i * w), sy + rw);
				// 绘制第i条水平线
				g.drawLine(sx, sy + (i * w), sx + rw, sy + (i * w));
			}
			// 填写第i行从第1个方格到第N个方格里面的背景颜色(方格序号从0开始)
			int[][] s = new int[N][N];
			int sl = s.length;
			List<Object> list1 = new ArrayList<Object>();
			HashMap<String, String> map = new HashMap<String, String>();
			for (int t = 0; t < 70; t++) {
				if (t == 0) {
					t0(N, sl, s);
				} else {
					if (t < 60) {
						tn(N, sl, s, map, list1, t);
					}
					dataChange(list1, s, t);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	* 数据是保留10个步长之后并根据round 向其他状态转变
	*
	* @param list
	* @param s
	* @param t
	*/
	private void dataChange(List<Object> list, int[][] s, int t) {
		int a1 = 0, a2 = 0, a3 = 0, a4 = 0;
		for (int x = list.size() - 1; x >= 0; x--) {
			a3 = Integer.parseInt(list.get(x).toString().split("a")[2].toString());
			if (a3 - t > 1) {
				a1 = Integer.parseInt(list.get(x).toString().split("a")[0].toString());
				a2 = Integer.parseInt(list.get(x).toString().split("a")[1].toString());
				a4 = Integer.parseInt(list.get(x).toString().split("a")[3].toString());

				// 修改概率
				if (a4 > 0 && a4 <= 3000) {
					s[a1][a2] = -1;
				} else if (a4 > 3000 && a4 <= 9000) {
					s[a1][a2] = 2;
				} else {
					s[a1][a2] = 1;
				}
				list.remove(x);
			}
		}

	}

	/**
	* tn时刻数据
	*
	* @param N
	* @param slt
	* @param sl
	* @param s
	* @param map
	* @param map1
	* @param list1
	* @param t
	*/
	private void tn(int N, int sl, int[][] s, HashMap<String, String> map, List<Object> list1, int t) {
		int slt = 0;
		int round = 0;
		HashMap<String, String> map1 = new HashMap<String, String>();
		for (int k = 0; k < s.length; k++) {
			slt = s[k].length;
			for (int k2 = 0; k2 < slt; k2++) {
				// 状态为1记录并且去除步长在10以内的重复数据 放到list1中
				if (s[k][k2] == 1) {
					round = new Random().nextInt(10000);
					if (map.containsKey(k + "a" + k2 + "a")) {
						if (t - Integer.parseInt(map.get(k + "a" + k2 + "a").split("a")[2].toString()) > 10) {
							map.put(k + "a" + k2 + "a", k + "a" + k2 + "a" + t + "a" + round + "a");
							map1.put(k + "a" + k2 + "a", k + "a" + k2 + "a" + t + "a" + round + "a");
							list1.add(map1.get(k + "a" + k2 + "a"));
						}
					} else {
						map.put(k + "a" + k2 + "a", k + "a" + k2 + "a" + t + "a" + round + "a");
						map1.put(k + "a" + k2 + "a", k + "a" + k2 + "a" + t + "a" + round + "a");
						list1.add(map1.get(k + "a" + k2 + "a"));
					}

				}

				// 状态为0向其他状态改变
				if (s[k][k2] == 0) {
					round = new Random().nextInt(10000);
					// 修改概率
					if (round > 0 && round <= 1000) {
						s[k][k2] = -1;
					} else if (round > 9000 && round <= getrNum(10000, 0)) {
						System.out.println("round:" + round);
						s[k][k2] = 1;
					} else if (round > 1000 && round <= 9000) {
						s[k][k2] = 2;
					} else {
						s[k][k2] = 0;
					}
				}

				// 状态为-1向其他状态改变
				if (s[k][k2] == -1) {
					round = new Random().nextInt(10000);
					// 修改概率
					if (round > 0 && round <= 4000) {
						s[k][k2] = 0;
					} else {
						s[k][k2] = -1;
					}
				}

				// 状态为2向其他状态改变
				if (s[k][k2] == 2) {
					round = new Random().nextInt(10000);
					// 修改概率
					if (round > 0 && round <= 1000) {
						s[k][k2] = 0;
					} else {
						s[k][k2] = 2;
					}
				}

			}
		}
		// 上色
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				color(i, j, s);
			}
		}
		map1 = null;
	}

	/**
	* t0时刻
	*
	* @param N
	* @param slt
	* @param sl
	* @param s
	*/
	private void t0(int N, int sl, int[][] s) {
		int slt = 0, a1 = 0, a2 = 0;
		List<Object> list = new ArrayList<Object>();
		// 初始化1的值
		for (int k = 0; k < sl; k++) {
			slt = s[k].length;
			for (int k2 = 0; k2 < slt; k2++) {
				if (k >= 80 && k < 100 && k2 >= 80 && k2 < 100) {
					s[k][k2] = 1;
				} else {
					// 剩余数据
					list.add(k + "a" + k2 + "a");
				}
			}
		}
		// 剩余数据全部转换为0
		for (int x = 0; x < list.size(); x++) {
			a1 = Integer.parseInt(list.get(x).toString().split("a")[0].toString());
			a2 = Integer.parseInt(list.get(x).toString().split("a")[1].toString());
			s[a1][a2] = 0;
		}

		// 在为0 的基础上抽取4000 数据赋值为-1
		Set<Integer> sets = getRandom(4000, list.size());
		for (Integer itg : sets) {
			a1 = Integer.parseInt(list.get(itg).toString().split("a")[0].toString());
			a2 = Integer.parseInt(list.get(itg).toString().split("a")[1].toString());
			s[a1][a2] = -1;
		}

		// 上色
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				color(i, j, s);
			}
		}
	}

	/**
	* 讲制定小方格设置为指定背景颜色
	*
	* @param cx
	*      方格的水平方向序号
	* @param cy
	*      方格的垂直方向序号
	* @param color
	*/
	private void setGrid(int cx, int cy, Color color) {
		// 将绘图对象设置为灰色,后面会将方格背景设置为此颜色
		jg.setColor(color);
		/**
		* 方格上绘制一个小一点的矩形,矩形背景颜色为color,
		*/
		jg.fillRect(sx + (cx * w), sy + (cy * w), w - 1, w - 1);

	}

	/**
	* 根据nlength 长度 产生 num 随机数(并且不重复)
	*
	* @param num
	* @param nlength
	* @return
	*/
	public Set<Integer> getRandom(int num, int nlength) {
		if (nlength < num) {
			return null;
		}
		int index = 0;
		Set<Integer> set = new HashSet<Integer>();
		for (int i = 0; i < nlength; i++) {
			index = (int) (Math.random() * nlength);
			if (set.size() >= 4000) {
				break;
			} else {
				set.add(index);
			}

		}
		return set;
	}

	/**
	* main
	*
	* @param args
	*/
	public static void main(String[] args) {
		new DrawSee();
	}

	/**
	* 随机生成最小到最大的数据
	*
	* @param max
	* @param min
	* @return
	*/
	private int getrNum(int max, int min) {
		Random random = new Random();
		return random.nextInt(max) % (max - min + 1) + min;

	}

	/**
	* 设置每种状态的背景颜色
	*
	* @param i
	* @param j
	* @param s
	*/
	private void color(int i, int j, int[][] s) {
		if (s[i][j] == -1) {
			// 状态为空
			setGrid(i, j, Color.BLACK);
		} else if (s[i][j] == 0) {
			// 易感冒
			setGrid(i, j, Color.WHITE);
		} else if (s[i][j] == 1) {
			// 感染者
			setGrid(i, j, Color.RED);
		} else if (s[i][j] == 2) {
			// 恢复者
			setGrid(i, j, Color.GREEN);
		}
	}

}

说明

本文只做学习参考,如有任何不准确的地方欢迎指正。

到此这篇关于使用Java程序模拟实现新冠病毒传染效果的文章就介绍到这了,更多相关Java实现新冠病毒传染内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Java程序模拟实现新冠病毒传染效果

    简单介绍 2020年注定是不平凡的一年,新冠肺炎肆虐全球,传染性特别强,目前全球感人人数还在逐渐攀升,作为中华儿女特别感谢政府作出的努力,非常感谢并致敬医护人员,是他们的努力为我们创造安全的环境,向你们致敬! 模拟方案 以下是程序粗略的模拟病毒传染过程,具体方案如下: 首先需要构造一个200 * 200的格子界面有四种不同的颜色状态标记着程序执行的过程程序执行10次,初始化格子也就是0的时候,需要在整个格子最中心的100个格子标记为红色,剩余数据随机抽取四千(且不能重复)标记为黑色,其余没有标记

  • Matlab实现新冠病毒传播模拟效果

    目录 1 各种疫苗梳理 1.1 灭活疫苗 1.2 吸入式新冠疫苗 1.3 植物蛋白技术疫苗 1.4 AI技术开发长效新冠疫苗 1.5 法国Valneva新冠疫苗 2 matlab代码 1 各种疫苗梳理 截至2022年3月,中国已经向120多个国家和国际组织提供了超过21亿剂疫苗,占中国以外全球疫苗使用总量的1/3. 1.1 灭活疫苗 2020年12月31日,国务院联防联控机制发布,国药集团中国生物新冠灭活疫苗已获得国家药监局批准附条件上市. 1.2 吸入式新冠疫苗 2021年11月12日—14日

  • 在Java程序中使用数据库的新方法

    Java 8终于到来了! 经过几年的等待, java程序员终于能在java中得到函数式编程的支持了. 函数式编程的支持能流程化现有的代码并且为java提供强大的能力.在这些新特性中最瞩目的是java程序员对数据库的操作方式.函数式编程带来了令人激动的简便高效的数据库API. Java 8 将会支持可与像C#的LINQ等语言竞争的新的数据库访问方式. 处理数据的函数式方式 Java 8 不仅仅添加了函数式支持,它也通过新的函数式处理数据的方式扩展了集合(Collection)类. 而通常情况下ja

  • Java 程序员容易犯的10个SQL错误

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用"模式-模式",举个例子,模式可以应用到任何地方,而且都可以归为某一类模式) 心境(首先,要写个好的面向对象程序是比命令式程序难的多,你得花费一些功夫) 但当Java程序员写SQL语句时,一切都不一样了.SQL是说明性语言而非面向对象或是命令式编程语言.在SQL中要写个查询语句是很简单的.但在Java里类似的语句却不容易

  • 10个Java程序员熟悉的面向对象设计原则

    面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注意力放在学习面向对象的分析和设计上面.学习面向对象编程像"抽象"."封装"."多态"."继承" 等基础知识是重要的,但同时为了创建简洁.模块化的设计,了解这些设计原则也同等重要.我经常看到不同经验水平的java程序员,他们有的不知

  • Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程

    目录 前言 环境部署 插件推荐 爬虫目标 项目创建 webdriver部署 项目代码 Item定义 中间件定义 定义爬虫 pipeline输出结果文本 配置文件改动 验证结果 总结 前言 闲来无聊,写了一个爬虫程序获取百度疫情数据.申明一下,研究而已.而且页面应该会进程做反爬处理,可能需要调整对应xpath. Github仓库地址:代码仓库 本文主要使用的是scrapy框架. 环境部署 主要简单推荐一下 插件推荐 这里先推荐一个Google Chrome的扩展插件xpath helper,可以验

  • Java实现模拟机器人对话的示例代码

    目录 前言 一.Java多线程的介绍 二.创建线程并运行 三.多线程间的交互 前言 今天带大家来体验一下Java多线程,首先我们要明白什么是线程?什么是多线程? 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程可以运行多个线程.比如java.exe进程可以运行很多线程.线程总是输入某个进程,进程中的多个线程共享进程的内存. 多线程指的是这个程序(一个

  • 最有价值的50道java面试题 适用于准入职Java程序员

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最新版本,去掉了EJB 2.x等无用内容,补充了数据结构和算法相关的题目.经典面试编程题.大型网站技术架构.操作系统.数据库.软件测试.设计模式.UML等内容,同时还对很多知识点进行了深入的剖析,例如hashCode方法的设计.垃圾收集的堆和代.Java新的并发编程.NIO.2等,相信对准备入职的Ja

  • 让Java程序自动重启的实现方法(推荐)

    要让一个java程序自动重启还真不容易的,重启分两步,首先是结束程序,这个简单,只要运行System.exit()就可以了.然后是启动,这个就难了,这个时候程序都已经结束了,就像一个人死了就不可能再自己站起来,怎么办呢?让别人帮他扶起来,幸运的是,我也有这样的条件,我要重启的那个程序并不孤独,还有另一个java程序和它一起在运行,我只要让运行着的那个程序来启动它就可以了. 但运行着的那个程序它怎么知道要关闭的那个程序在什么时候关闭呢,如果不知道就不能贸然启动.只有让要关闭的那个程序在自杀前先通知

  • Java程序员常犯的五个错误

    下面针对每一个错误用文字说明结合代码详解的方式展示给大家,具体内容如下: 1. Null 的过度使用 避免过度使用 null 值是一个最佳实践.例如,更好的做法是让方法返回空的 array 或者 collection 而不是 null 值,因为这样可以防止程序抛出 NullPointerException.下面代码片段会从另一个方法获得一个集合: List<String> accountIds = person.getAccountIds(); for (String accountId :

随机推荐