gpt4 book ai didi

java - 写入 "println"修复了我的代码,怎么样?

转载 作者:行者123 更新时间:2023-11-30 03:32:58 25 4
gpt4 key购买 nike

我在计算机科学讲座中尝试了一些东西,然后突然遇到了一个有趣的问题。

这是我的主要代码,

public void run(){
setSize(800, 600);

for(int i=0; i<= 30; i++){
elips el = new elips();
el.setFilled(true);
el.setColor(Color.RED);
elipsler.add(el);
add(el);
}

while(!stopthat){
for(int i=0; i< elipsler.size() -1; i++){
elipsler.get(i).cdRemove();

println("asd");

if(elipsler.get(i).canRemove == true){
remove(elipsler.get(i));
elipsler.remove(i);
elips el = new elips();
el.setFilled(true);

add(el);
elipsler.add(el);
}
}
}
}

这就是我的椭圆类。

public class elips extends GOval{
static int x, y, w, h;
int cd;
public boolean canRemove = false;
Random rand = new Random();

public elips(){
super(x, y, w, h);
canRemove = false;
cd = rand.nextInt(100);
x = rand.nextInt(780) + 20;
y = rand.nextInt(580) + 20;
w = rand.nextInt(80) + 20;
h = rand.nextInt(80) + 20;
}

public void cdRemove(){
if(this.cd <= 0){
this.canRemove = true;
}else{
this.cd--;
}
}
}

如您所见,我正在创建椭圆并给它们“删除冷却时间”,冷却结束后椭圆会销毁。问题是如果我删除 println("asd") 行,代码将无法正常工作。也就是说,如果我删除该行,省略号会同时出现和消失(冷却不起作用)。

所以我想知道“println”行如何解决这个问题?

最佳答案

从 100 倒数到 0 几乎是在零时间内完成的,这实际上就是您在删除椭圆之前所做的事情。添加 println 时看到椭圆的原因是因为它需要一些少量的时间来打印。一百次,你就得到了几毫秒的椭圆。

您想要做的是将原始倒计时替换为某种实际的计时器。 <罢工> Stopwatch会做的工作。 (显然,我之前建议的 DateTime 在低至几毫秒时并不那么准确) 我一直在用 C# 思考。在java中,使用System.currentTimeMillis()是正确的方法。

ninja:如果您需要,我将在今天晚些时候提供代码

编辑:现在,您实际上正在执行以下操作:

add ellipse
for(int i = 0; i < 100; i++)
{
// nothing happening in here, this entire loop takes zero time
}
remove ellipse

并使用println:

add ellipse
for(int i = 0; i < 100; i++)
{
println("asd");
// something happening in here, this entire loop takes a little bit of time
}
remove ellipse

这种冷却系统会在多个方面成为一个问题:

  • 每个刻度所需的时间会有所不同(有时很大),具体取决于运行它的计算机
  • 您基本上锁定了整个应用程序。如果你想做与此并行的事情,你将必须创建一个单独的线程,或者你所做的任何事情都会影响每个刻度之间的时间,从而改变冷却时间,同时也会受到与所有椭圆相同的冷却时间的影响合并起来。
  • 您实际上并没有测量时间。

所以,这是一个测量时间的选项:

public class elips extends GOval{
static int x, y, w, h;
int cd;
public boolean canRemove = false;
Random rand = new Random();

long timeStart;

public elips(){
super(x, y, w, h);
canRemove = false;
cd = rand.nextInt(100);
x = rand.nextInt(780) + 20;
y = rand.nextInt(580) + 20;
w = rand.nextInt(80) + 20;
h = rand.nextInt(80) + 20;

timeStart = System.currentTimeMillis();
}

public void cdRemove(){
if(System.currentTimeMillis() > timeStart + cd)
this.canRemove = true;
}
}

并且:

public void run(){
setSize(800, 600);

for(int i=0; i<= 30; i++){
elips el = new elips();
el.setFilled(true);
el.setColor(Color.RED);
elipsler.add(el);
add(el);
}

while(!stopthat){
// now you can do stuff here that will not be delayed by the ellipse cooldowns
// neither will it become part of the ellipse cooldowns
for(int i=0; i< elipsler.size() -1; i++){
elipsler.get(i).cdRemove();


if(elipsler.get(i).canRemove == true){
remove(elipsler.get(i));
elipsler.remove(i);
elips el = new elips();
el.setFilled(true);

add(el);
elipsler.add(el);
}
}
}
}

这可能会发生一些变化,我的校对速度很快。

编辑 2:我在 C# 中思考秒表和所有内容,现在解决了这个问题。

关于java - 写入 "println"修复了我的代码,怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28584249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com