使用Java程序模拟实现新冠病毒传染效果
作者:鲁先生. 发布时间:2022-09-12 20:26:14
标签: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);
}
}
}
说明
本文只做学习参考,如有任何不准确的地方欢迎指正。
来源:https://blog.csdn.net/lulongji2035/article/details/107983637
0
投稿
猜你喜欢
- 本文介绍通过Java程序批量替换PDF中的指定文本内容。程序环境准备如下:程序使用环境如图,需要注意的是,本文使用了免费版的PDF jar工
- 在Java中,可以通过Runtime类或ProcessBuilder类来实现调用外部程序。Runtime类与ProcessBuilder类使
- 获取Spring中的bean有很多种方式,再次总结一下:第一种:在初始化时保存ApplicationContext对象Application
- 一、概述1、XMLReader为抽象类,其派生类有:XmlDictionaryReaderXmlNodeReaderXmlTextReade
- 声明:下面的实例全部在linux下尝试,window下未尝试。有兴趣者可以试一下。文章针c初学者。c语言的强符号和弱符号是c初学者经常容易犯
- SpringTask是Spring自带的功能。实现起来比较简单。使用SpringTask实现定时任务有两种方式:1.注解方式基于注解@Sch
- 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很
- 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实
- 注解的介绍@ControllerAdvice@ControllerAdvice注解是Spring3.2中新增的注解,学名是Controlle
- Java类加载器1、BootClassLoader: 用于加载Android Framework层class文件。2、PathClassLo
- 在C#中常用到的运算符有条件运算符,is运算符,as运算符,typeof 运算符等等,接下来在文章中将为大家具体介绍各个运算符的使用方法条件
- 本文实例为大家分享了Spring MVC接口防数据篡改和重复提交的具体代码,供大家参考,具体内容如下一、自定义一个注解,此注解可以使用在方法
- Scala小程序详解1. 交互式模式在命令行窗口中,输入Scala命令:xiaosi@Qunar:~$ scalaWelcome to S
- 一个线程的生命周期:新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态
- 一、前言让我们先理一下springfox与swagger的关系。swagger是一个流行的API开发框架,这个框架以“开放API声明”(Op
- 我就废话不多说了,大家还是直接看代码吧~public int read(byte[] b) throws IOException
- 1.二叉树的概念及结构 ①概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二
- 本文实例为大家分享了Android实现京东首页效果的具体代码,供大家参考,具体内容如下1.效果图:2.布局源码链接<?xml vers
- 每一个应用程序,其实都会有分享的需求,比如一键分享一篇文章或者一些活动到微博或者微信亦或者是twitter等社交平台,因为人类是社交动物,而
- WebServiceHelper代码:using Microsoft.CSharp;using System;using System.Co