如何在其他课程中获得分数? JAVA

时间:2014-03-07 20:50:33

标签: java class

我正在制作一个有多颗小行星的游戏。目标是尽可能多地躲避尽可能多的小行星。我做到这一点,一旦小行星到达屏幕的底部,它就会重新发送,现在我想要计算每次它到达底部并将其添加到分数中。 我的问题是所有的小行星都是同一类,所以如果我使用:

if(y>700){ y=-50; // x= (int) (Math.random()*670); // To send the asteroid back up setLocation(x,y); // score++; // To add up the score System.out.println(score); // To print the score

每个小行星都会增加自己已达到底部的次数,但我想知道有多少小行星已达到底部。所以我想我必须从小行星类中得到分数并将其添加到其他类中,但我不知道如何。

这是小行星类的代码:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Astroid extends JPanel implements ActionListener
{
 public int yVelocity = 1;
 public int x = (int) (Math.random()*650), y = (int) (Math.random()*-1000);
 public Timer timer;
 private int score;

 public Astroid(int x,int y)
 {
    this.setLocation(x, y);
    this.setSize(25, 25);
    this.setBackground(Color.WHITE);
    this.setVisible(true);
 }
 {
    this.timer = null;
    this.timer = new Timer(10,new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent arg0)
        {
            setLocation(x,(y+=yVelocity));
            timer.setDelay(10);
            repaint();

            if(y>700){
                y=-50;
                x= (int) (Math.random()*670);
                setLocation(x,y);

                score++;
                System.out.println(score);
            }
        }
    });
    timer.start();
 }
}

这是创建小行星的类的代码:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class SterTest extends JFrame implements ActionListener
{

public int a;

public SterTest() 
{
    this.setSize(700, 700);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);

    final JPanel p = new JPanel();
    p.setBackground(Color.BLACK);
    p.setLayout(null);

    for(a=0;a<3;a++) {
        Astroid astroid = new Astroid(1,1);
        p.add(astroid);
    } //Creates 3 asteroids to start with

    Timer timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            Astroid astroid2 = new Astroid(1,1);
            p.add(astroid2);    
            a++;
            System.out.println("Het aantal asteroids in game is:"+a);
        }               
    }, 5000, 5000); // creates a new asteroid every 5 seconds or so

    this.add(p);

    this.setVisible(true);
}

5 个答案:

答案 0 :(得分:1)

跟踪分数可能不是Asteroid类的工作,因此变量最好保存在更集中的类中。然后,您可以向每个小行星添加中心类的实例,并调用方法来增加分数。像这样:

public class ScoreKeeper {
    private AtomicInteger score;
    public void incrementScore (int points) {
        score.getAndAdd (points);
    }
    public int getScore () {
        return score.get ();
    }
}

在您的课程SterTest中,您将创建一个ScoreKeeper的实例,并将其传递给您创建的每个新Astroid实例。

public class Astroid {
    private ScoreKeeper scoreKeeper;
    public Astroid(int x,int y, ScoreKeeper scoreKeeper) {
        //... existing code ...
        this.scoreKeeper = scoreKeeper;
    }
    // ... when you want to increment the score, do this:
    scoreKeeper.incrementScore (1);
}

答案 1 :(得分:0)

注意:有更好的和更多的OO方法。这个答案是从当前解决方案到工作代码的最快路径。

将分数声明为静态。

private static int score

这将为您提供该变量的单个副本。

<强>然而

我看到你有一些线索。在这种情况下,您需要一点同步才能保持分数一致。

我建议添加

private static final Object scoreLock

到你的领域。并将score++替换为

synchronized(scoreLock)
{
    Asteroid.score++;
}

答案 2 :(得分:0)

如果你对保持个体小行星的得分不感兴趣,那么没有理由在该类中添加score变量。分数应保持在较高级别,可能在您的SterTest()类中。当您检测到小行星已经到达底部时,只需增加该分数即可。我不想告诉你如何设计你的程序,但最明显的方法是让actionPerformed返回分数。

答案 3 :(得分:0)

创建AsteroidListener界面。也许是这样的:

public interface AsteroidListener {
   public void impact(Asteroid asteroid);
}

让您的SterTest类实现此接口。为您的Asteroid构造函数添加一个新参数,用于侦听器。

public Asteroid(int x, int y, AsteroidListener listener) { }

当您需要调用侦听器以通知它存在影响时:

listener.impact(this);

在SterTest课程中取得分数。

答案 4 :(得分:0)

使用Java Observer / Observable模式:

public class Score extends Observable {
    private AtomicInteger counter = new AtomicInteger();
    public void increment() {
        setChanged();
        notifyObservers(Integer.valueOf(counter.incrementAndGet()));
    }
}

此课程已添加到Astroid

public Astroid(Score score, int x,int y) {
    // ...
    @Override
    public void actionPerformed(ActionEvent event) {
        // ...
        score.increment();
    }
}

StarTest实现了Observer接口:

public class StarTest implements Observer {
    // ...
    @Override
    public void update(Observable o, Object arg) {
        Integer count = (Inter)arg;
        // do something with the score
    }
}

您按以下方式连接ObserverObservable

StarTest starTest = new StarTest();

Score score = new Score();
score.addObserver(starTest);

Astroid astroid = new Astroid(score, x, y);