【问题标题】:Getting started with Java acmJava acm 入门
【发布时间】:2017-10-05 07:23:01
【问题描述】:

从这里开始。我以前上过编程课,但对 Java 很陌生,没有丰富的经验。该程序来自 Mehran Sahami 在 Youtube 上发布的斯坦福讲座。 https://www.youtube.com/watch?v=YpZCKVG4s5k&t=1996s 代码从大约 32 分钟开始可见。这是一个显示弹跳球的简单图形程序。一个让我开始尝试设置的好地方,用另一个对象替换一个对象,并且通常习惯于语法与屏幕上显示的内容之间的关系。但是,我什至无法到达隐喻的起跑门!我尝试剪切并粘贴到 Sololearn 模拟器中,但得到了同样的错误。我认为它必须与 acm 库有关,但是 . . .什么?

代码在下面,错误消息在下面。

import acm.program.*;
import acm.graphics.*;


public class BouncingBall extends GraphicsProgram {
private static final int DIAM_BALL = 30;
private static final double GRAVITY = 3;
private static final int DELAY = 50;
private static final double X_START = DIAM_BALL / 2;
private static final double Y_START = 100;

//x velocity
private static final double X_VEL = 5;
//Y velocity determined by gravity and bounce
private static final double BOUNCE_REDUCE = 0.9;
//Starting coords
private double xVel = X_VEL;
private double yVel = 0.0;
//private instance variable
private GOval ball;
}
public void run(){
    setup(){
       while (ball.getX() < getWidth()) {
            moveBall();
            checkForCollision();
            pause(DELAY);
        }
        }
        //create and place ball
    private void setup(){
        ball=new GOval(X_START,Y_START,DIAM_BALL,DIAM_BALL);
        ball.setFilled(true);
        add(ball);
    }
    //update and move ball
private void moveBall(){
        yVel+=GRAVITY;
        ball.move(xVel,yVel);
}
//Collision detection
private void checkForCollision(){
    if(ball.getY()>getHeight()-DIAM_BALL){
        yVel=-yVel*BOUNCE_REDUCE;
        double diff=ball.getY()-(getHeight()-DIAM_BALL);
        ball.move(0,-2*diff);
    }
}
}
}

“错误:Java:需要类、接口或枚举” 其中大约有十几个,指定 (22,12), (26,17), (27,17), (28,13), (33,13), (34,13) 。 . .

我有一种感觉,当我了解其中一些问题的原因时,我将能够解决所有问题。

提前致谢!

【问题讨论】:

  • Java ACM package的可能重复
  • 我从上面的链接中得到了 acm。我尝试将 acm.jar 移动到目录中的各个位置,但似乎没有任何效果。无论我把它放在哪里,都会出现同样的错误。另外,文件的类型为“executable Jar File”,这与一些评论者的描述不同。
  • 运行中的行是否应该有 setup(){ ?或设置();
  • 我不这么认为。我传输了此处显示的代码。 setup() 位于下一行代码并嵌套在 run 函数的括号内。

标签: java acm-java-libraries


【解决方案1】:

我删除了文件末尾的 setup(){ 和一个 },我相信这是问题的原因。

import acm.program.*;
import acm.graphics.*;


public class BouncingBall extends GraphicsProgram {
private static final int DIAM_BALL = 30;
private static final double GRAVITY = 3;
private static final int DELAY = 50;
private static final double X_START = DIAM_BALL / 2;
private static final double Y_START = 100;

//x velocity
private static final double X_VEL = 5;
//Y velocity determined by gravity and bounce
private static final double BOUNCE_REDUCE = 0.9;
//Starting coords
private double xVel = X_VEL;
private double yVel = 0.0;
//private instance variable
private GOval ball;


public void run(){
    setup();
    while (ball.getX() < getWidth()) {
            moveBall();
            checkForCollision();
            pause(DELAY);
    }
 }
 //create and place ball
private void setup(){
        ball=new GOval(X_START,Y_START,DIAM_BALL,DIAM_BALL);
        ball.setFilled(true);
        add(ball);
    }
    //update and move ball
private void moveBall(){
        yVel+=GRAVITY;
        ball.move(xVel,yVel);
}
//Collision detection
private void checkForCollision(){
    if(ball.getY()>getHeight()-DIAM_BALL){
        yVel=-yVel*BOUNCE_REDUCE;
        double diff=ball.getY()-(getHeight()-DIAM_BALL);
        ball.move(0,-2*diff);
    }
}
}

查看 35:03 的视频,它准确地显示了上面的内容。

【讨论】:

  • 嗯,没有编译,只有一个错误。 . .地狱般的进步。让我们看看我是否可以解决剩下的问题。谢谢!
  • 好吧,废话。 “错误:(5,8) java:BouncingBall 类是公共的,应在名为 BouncingBall.java 的文件中声明。”这段代码不是从引用的行开始的 BouncingBall 类的定义吗?我错过了什么吗?
  • 好的,现在看来,为每个类设置单独的文件是相当标准的。我还没有遇到过,也没有在我接触过的课程/视频中看到它。您是否定义了一个与上面发布的代码块不同的 BouncingBall 类文件?
【解决方案2】:

@Saint Razz:首先,您使用非公共库“acm.jar”和sololearn 模拟器
不知道这个库。
其次,尽量避免使用“静态”。除非您编写一个类,并且它具有可能只存在一次的方法、变量、常量。
例如

class Student() { 
     private String mName;
     private String mCollege;
     public Student(String name) { 
         mName = name;
         college = "ITS";
     }
}


在这种情况下,对字符串学院的内存问题使用静态是有意义的。

接下来有一个错误,Berkley Lamb 也纠正了。在方法中声明方法是没有意义的。我的意思是 run() 方法中的 setup() 方法。
仔细看看你的大括号。如果你试图在java中调用一个类之外的方法,编译器总是会抛出一个错误。 (请参阅私人 GOval 球后的大括号 - 声明。

最后一件事,我建议您在调用 run 方法之前使用一个常量作为窗口宽度和高度,或者在公共 void init() {} 方法中初始化窗口,只要您使用acm.jar。否则,您可能会调用 getWidth() 并获得值 0。这有时会导致一些不需要的错误。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2011-04-17
    • 2018-03-04
    • 2015-07-29
    • 1970-01-01
    • 2010-11-19
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多