如果问题不明确但我想不出另一种方式来表达它,我道歉.
这是我周末在BlueJ工作的课堂作业.我必须改变一个方法(弹跳)让用户选择应弹跳的球数.
其他要求是:球应该具有不同的尺寸,并且应该在它们弹跳之前沿着屏幕顶部连续显示.
为了做到这一点,我必须使用一个集合(ArrayList,HashMap,HashSet).到目前为止,我已经使用了HashMap,并且能够让用户选择一些随机大小的“球”,这些“球”将自己置于屏幕上半部分的随机位置.
当我试图让每个球从屏幕顶部的位置反弹,在右手边结束时,我就会卡住.我可以让代码绘制一个球,弹回它然后绘制另一个球,弹回它等,直到用户选择的球数循环.
还有另外两个类,一个用于绘制画布,另一个用于绘制球并移动它们.我不允许触摸这两个.
我正在做错的方式可能就在我面前,但我一直在盯着这段代码我想我会问.
我当前的代码版本如下所示:
import java.awt.Color; import java.util.HashMap; import java.util.Random; import java.util.Iterator; public class BallDemo { private Canvas myCanvas; private HashMap<Integer,BouncingBall> ballMap; private int n; private int j; private BouncingBall ball; /** * Create a BallDemo object. Creates a fresh canvas and makes it visible. */ public BallDemo() { myCanvas = new Canvas("Ball Demo",600,500); }
我必须编辑的方法来反弹球:
public void bounce(int numBalls) { ballMap = new HashMap<Integer,BouncingBall>(); int ground = 400; // position of the ground line Random randomD1 = new Random(); Random xpos = new Random(); myCanvas.setVisible(true); // draw the ground myCanvas.drawLine(50,ground,550,ground); // add balls to HashMap for(n = 0; n < numBalls; n++) { ballMap.put(numBalls,(ball = new BouncingBall(xpos.nextInt(300),50,randomD1.nextInt(200),Color.BLUE,myCanvas))); // for(j= 0; j < ballMap.size(); j++) { ball.draw(); boolean finished = false; while(!finished) { myCanvas.wait(50); // small delay ball.move(); // bounce the ball // stop once ball has travelled a certain distance on x axis if(ball.getXPosition() >= 550) { finished = true; } } } } } }
我是否使用HashMap在正确的界限上?键,值的组合似乎是最好的方法.我想我需要以某种方式迭代放置在集合中的项目,以使它们使用move()方法反弹.但首先,无论用户定义了多少,我都需要将球保持在屏幕顶部.
我是编程的新手,我只是难倒.
谢谢你的帮助!
解决方法
@16dots部分正确,除了ballMap.put(numBalls,ball);每次都会在哈希映射中重写相同的值,因为numBalls不会改变…
关键应该是唯一的.
它应该读……
for (int n; n < numBalls; n++) { BouncingBall ball = new BouncingBall(xpos.nextInt(300),randomD1. nextInt(200),myCanvas); ballMap.put(n,ball); } boolean finished = false; while (!finished) { finished = true; for (int j = 0; j < ballMap.size(); j++) { BouncingBall selectedBall = ballMap.get(j); selectedBall.draw(); // Only move the ball if it hasn't finished... if (selectedBall.getXPosition() < 550) { selectedBall.move(); // bounce the ball // stop once ball has travelled a certain distance on x axis if (selectedBall.getXPosition() < 550) { finished = false; } } } myCanvas.wait(50); // small delay }