【问题标题】:code is not pressing buttons when they have to代码在必须时没有按下按钮
【发布时间】:2021-06-27 11:17:34
【问题描述】:

我打开了另一个窗口,其中另一个程序会在按下特定键时做出响应,我将调用它program1

我现在正在使用消息末尾的程序对其进行测试,我将调用它 program2program2 代码应该按下程序 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,106,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, 0, width, height);
  BufferedImage img1 = robot.createScreenCapture(r);
  PImage img2 = new PImage(img1);
  image(img2, 0, 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);}

}

【问题讨论】:

    标签: java processing


    【解决方案1】:

    你应该仔细检查你的条件。

    以下是有关数值数据类型和精度的常见来源错误:dice=random(3);

    dicefloat,但是您使用的是整数比较(例如 if(dice==0) 等)

    由于 random(3) 将在大多数情况下返回小数值,因此您的整数条件将不被满足。您可以使用舍入方法(例如round(random(3))/ceil(random(3))/floor(random(3)))以及整数转换((int)random(3)),具体取决于对您的程序有意义的方式。请记住将地板或随机(3)投射到int 的最大值为2,因此将不满足此条件:if(dice==3)。相应地调整您的范围。

    例如

    dice = round(random(3));
    

    记住delay() 是一个阻塞函数。希望这些调用是故意的,可以解决您的问题,否则我建议考虑 millis(),因为它不会阻塞其余代码。

    保证这个条件有点小技巧:

    if ((targetx<gy)&&(targety < (gy + 38)) && (targetx > (gy - 38)))
    

    最初targetxtargety 以及gxgy0,所以targetx(0) 永远不会是&gt; gy-38(-38)。其中一些值将被更新,但仍有出错的余地。

    说到更新这些值,目前的假设是这些颜色将完美匹配(if (colorFromGet == red) / if (z==colorFromget))。如果您获得屏幕截图的反馈循环,则屏幕截图的每个反馈重复都有可能稍微改变颜色(不同的饱和度、亮度等)。 避免反馈循环或使用每个颜色通道的一些阈值进行颜色比较可能是值得的。这是一个比较一个颜色通道的粗略说明:

    if(abs(red(colorFromGet) - red(red)) < redThreshold))...
    

    green()/blue() 相同,每个都有一个阈值。 或者你可以比较hue()/saturation()/brightness()

    在国内,我们有一句话大致可以翻译为“懒惰的人更努力”:)

    总的来说,避免像这样命名变量:colorFromgetcolorFromGet 好多了。也许您正在尝试使用两个非常相似的名称来节省时间/变得懒惰,但这很容易变成难以阅读、理解和调试的混乱代码,这意味着从长远来看,您很可能会意外遇到更多错误,因此花费更多更多时间修复代码。这将为您节省大量时间和麻烦,您可以投入一些时间来正确命名变量并从一开始就组织代码并进行维护。

    【讨论】:

    • 如果我没记错,color colorFromGet = get(x,y); if(colorFromGet == red){targetx=x; targety=y;} 应该指定 targetx,targety 是发现颜色的位置
    • 我真的不明白if(abs(red(colorFromGet) - red(red)) &lt; redThreshold))... 应该做什么。我对编程很陌生,不知道这意味着什么(当然,我自己设定的价值观除外)
    • 是的,正如我上面提到的, targetx 和 y 应该 被设置,但前提是该条件通过。你需要彻底测试一下。我无法重新创建您的环境。 color 将 alpha、红色、绿色、蓝色数据保存在一个整数中。 red(colorFromGet) 将检索该颜色中红色的数量。对所有者的颜色也进行相同的比较,您可以比较到达颜色中的红色量。 abs() 返回绝对差值。因为红色之间的差异可以是正面的也可以是负面的,而我们只是职业生涯总体上有多大不同。 Abs 只是使负数变为正数
    • 我已将红色更改为团队并将随机的最大值变为 0.3,但仍然无法正常工作
    • 您可能仅在您的机器上进行了这些更改:目前我没有在您发布的问题中看到您在上面提到的更改。 (您可以发布一个并提及它是更新版本)。关于max(),我从没提过。例如 min()/max() 仍然返回一个浮点数。我已经提到了将浮点数作为参数并返回整数的函数。尝试我上面提到的替代方案(地板/圆形/天花板或(int)random(3):我已经测试过并且在我的机器上按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多