遍历 Java 集合以使这些球反弹,有啥提示吗?

Posted

技术标签:

【中文标题】遍历 Java 集合以使这些球反弹,有啥提示吗?【英文标题】:Iterating through a Java collection to make these balls bounce, any hints?遍历 Java 集合以使这些球反弹,有什么提示吗? 【发布时间】:2012-10-19 03:14:44 【问题描述】:

如果问题不清楚,我深表歉意,但我想不出另一种表达方式。

这是一个课堂作业,我整个周末都在 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, ground, 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() 方法反弹。但首先我需要球保持在屏幕顶部的一排,无论用户定义了多少。

我是编程新手,刚上路就一头雾水。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

@16dots 部分正确,除了ballMap.put(numBalls, ball); 每次都会在哈希映射中覆盖相同的值,因为numBalls 不会改变...

密钥应该是唯一的。

应该是……

for (int n; n < numBalls; n++) 
    BouncingBall ball = new BouncingBall(xpos.nextInt(300), 50,
            randomD1.
            nextInt(200), Color.BLUE, ground, 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

【讨论】:

我实际上在对他的问题所做的已删除评论中更改了它,但不知何故,当我回答它时,它滑过了,很好。 感谢您的回复!您的回复帮助我清理了循环,谢谢!然而,代码仍然像以前一样一次绘制和反弹一个球。我对我应该做的事情的理解是绘制用户定义数量的球,将它们连续显示,然后让它们一个接一个地弹跳,直到最后一个达到.getXposition finished = true。这是我正在努力解决的问题,如果不清楚或者我错过了什么,对不起! @16dots,如果你发布了一个新的更正答案,我很乐意投票,因为这是我偷的你的想法 @daveboy 我不熟悉 Bluj,但 while (!finished) 循环令人担忧。有 6 个月大的孩子要照看,我有时间会回帖 @daveyboy 我已经更新了示例,我认为它应该可以工作:P

以上是关于遍历 Java 集合以使这些球反弹,有啥提示吗?的主要内容,如果未能解决你的问题,请参考以下文章

篮球物理碰撞检测和反弹物理

java 里的 Collection接口有啥作用

如果脉冲太小,SKPhysicsBody 球不会反弹

从圆形边界反弹球

有时在乒乓球比赛中球不会从球拍上反弹

python简单游戏-反弹球