问题描述
我打开了另一个窗口,其中另一个程序会在按下特定键时做出响应,我将称之为 program1。
我现在正在用消息末尾的程序对其进行测试,我将称之为 program2,program2 代码应该按下程序 1 响应的键以特定的线索。
它应该按 w,s,a
和 d 按随机顺序。它应该向上、向左、向下或向右按下,具体取决于具有 RGB 颜色 (255,106,100) 的对象位于 gx,gy
的哪一侧。
Program2 还流式传输我屏幕上的内容,因此它可以看到颜色。 (我知道有些变量没用。我只是懒得删除,如果我发现我没有使用它们,你只需要指出这是导致问题的原因)
代码:
int x=1;
int y=0;
int gxbeta=0;
int gybeta=0;
int gx;
int gy;
int targetx=0;
int targety=0;
int i;
int h;
int dice=0;
color z=color(76,140,90);
color team= color(255,100);
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
Robot robot;
void setup(){
size(1920,1080);
//Let's get a Robot...
try {
robot = new Robot();
} catch (AWTException e) {
e.printstacktrace();
println(e.getMessage());
exit();
}}
void draw(){
background(0);
Rectangle r = new Rectangle(0,width,height);
BufferedImage img1 = robot.createScreenCapture(r);
PImage img2 = new PImage(img1);
image(img2,0);
//Zoek de kleur met de nieuwe get
y++;
if(y==height){
y=0;
}
if(y==0){
x=x+1;
}
color colorFromget= get(gxbeta,gybeta);
color colorFromGet = get(x,y);
if(colorFromGet == team){targetx=x;
targety=y;}
if(z==colorFromget){gx=gxbeta; gy=gybeta;}
//Kijk of hij in range van een kant is en schiet
if ((targetx<gy)&&(targety < (gy + 38)) && (targetx > (gy - 38))){
robot.keyPress(KeyEvent.VK_LEFT);
delay(10000);
robot.keyrelease(KeyEvent.VK_LEFT);}
//Etc
ellipse(gx,gy,25,25);
//loop een random kant op en laat dan de key los
dice=random(0.3);
if(dice==0){robot.keyPress(KeyEvent.VK_W);
delay(10000);
robot.keyrelease(KeyEvent.VK_W);}
if(dice==0.1){robot.keyPress(KeyEvent.VK_A);
delay(10000);
robot.keyrelease(KeyEvent.VK_A);}
if(dice==0.2){robot.keyPress(KeyEvent.VK_S);
delay(10000);
robot.keyrelease(KeyEvent.VK_S);}
if(dice==0.3){robot.keyPress(KeyEvent.VK_D);
delay(10000);
robot.keyrelease(KeyEvent.VK_D);}
}
解决方法
你应该仔细检查你的条件。
以下是有关数字数据类型和精度的常见来源错误:dice=random(3);
dice
是 float
,但您使用的是整数比较(例如 if(dice==0)
等)
由于 random(3) 在大多数情况下将返回小数值,因此您的整数条件将无法满足。您可以使用舍入方法(例如 round(random(3))
/ ceil(random(3))
/ floor(random(3))
)以及整数转换((int)random(3)
),具体取决于对您的程序有意义的内容。记住地板或将 random(3) 转换为 int
的最大值为 2,因此将不满足此条件:if(dice==3)
。相应地调整您的范围。
例如
dice = round(random(3));
记住 delay()
是一个阻塞函数。希望这些调用是有意的并能解决您的问题,否则我建议您考虑 millis()
,因为它不会阻止其余代码。
保证这个条件有点棘手:
if ((targetx<gy)&&(targety < (gy + 38)) && (targetx > (gy - 38)))
最初 targetx
、targety
以及 gx
、gy
都是 0
,所以 targetx(0)
永远不会是 > gy-38(-38)
。其中一些值将被更新,但仍有出错的空间。
说到更新这些值,目前的假设是这些颜色将完美匹配(if (colorFromGet == red)
/ if (z==colorFromget)
)。如果您收到屏幕截图的反馈循环,则屏幕截图的每个反馈重复都有可能会稍微改变颜色(不同的饱和度、亮度等)。
避免反馈循环或使用每个颜色通道的一些阈值进行颜色比较可能是值得的。这是比较一个颜色通道的粗略插图:
if(abs(red(colorFromGet) - red(red)) < redThreshold))...
green()
/blue()
相同,每个都有一个阈值。
或者,您可以比较 hue()
/saturation()
/brightness()
。
回到家,我们有句俗语大致翻译为“懒惰的工作更努力”:)
总的来说,避免像这样命名变量:colorFromget
。
colorFromGet
好多了。也许您正在尝试使用两个非常相似的名称来节省时间/偷懒,但这很容易变成难以阅读、理解和调试的凌乱代码,这意味着从长远来看,您更有可能不小心遇到更多错误,因此花费甚至更多时间修复代码。它将为您节省大量时间和头疼的事,花费一些时间来正确命名变量并从一开始就组织代码并在此基础上进行维护。