Probleem met Java game

Status
Niet open voor verdere reacties.

maarten54321

Gebruiker
Lid geworden
7 nov 2010
Berichten
121
Hallo iedereen,

Ik heb een tijdje terug het boek "Java voor studenten" gekocht om Java te leren.
Ik ben al heel wat gevorderd in het programmeren van Java, dus dacht ik om aan iets groters te beginnen...
Tot nu toe ben ik echt al veel verder geraakt dan ik dacht te komen! :D
Maar ik zit vast...

Een korte uitleg van mijn spel...


Mijn spel heet PaintShot. De bedoeling is dat de speler op een random geplaatst bolletje klikt. Binnenkort verschijnt het bolletje ook op een random tijdstip en moet je binnen een alsmaar kortere tijd op het bolletje klikken. In mijn V1 ben ik al zover geraakt dat hij een random bolletje laat zien op mijn panel en als je er met de muis op klikt, ben je gewonnen. Je hebt maar drie pogingen...

Zover ben ik dus, maar mijn compiler "netbeans" geeft een error als ik de onderstaande code probeer te compileren:

Exception in thread main

Kunnen jullie mij helpen of zeggen wat ik moet doen om dit op te lossen?

Dit is mijn code:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class Paint extends JFrame
    implements MouseListener {
        
    private JPanel panel;
    private Bomb bomb;
    private Game game;
    private int trys;

    public static void main(String[] args) {
        Paint frame = new Paint();
        frame.setSize(440, 440);
        frame.createGUI();
        frame.show();
    }

    private void createGUI() {
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container window = getContentPane();
        window.setLayout(new FlowLayout() );
    
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(400, 400));
        panel.setBackground(Color.white);
        window.add(panel);
        panel.addMouseListener(this); 
        
        Graphics paper = panel.getGraphics();
        
        game = new Game(paper);
        game.newGame();
        
    }
    public void mouseClicked(MouseEvent e) {
        if (e.getX() == bomb.getX() && e.getY() == bomb.getY()) {
            game.winGame();
            trys++;
        }
        if (e.getX() != bomb.getX() && e.getY() != bomb.getY() && trys ==5) {
            game.endGame();
        }
    }
    public void mouseEntered(MouseEvent e) {
    }
    public void mouseExited(MouseEvent e) {
    }
    public void mousePressed(MouseEvent e) {
    }
    public void mouseReleased(MouseEvent e) {
    }   
}

class Game {
    private Bomb bomb;
    private Graphics graphics;
    public Game(Graphics g) {
        graphics = g;
    }
    public void newGame() {
        bomb = new Bomb();
        bomb.create(graphics);
    }
    public void endGame() {
        bomb = null;
        JOptionPane.showMessageDialog(null,"Je hebt verloren.");
    }
    public void winGame() {
        JOptionPane.showMessageDialog(null,"Je hebt gewonnen.");
    }
}

class Bomb {
    
    private Random random1 = new Random();
    private Random random2 = new Random();
    private int xPos;
    private int yPos;
    
    public void create(Graphics area) {
        
        xPos = random1.nextInt() * 400;
        yPos = random2.nextInt() * 400;
        
        area.drawRect(xPos,yPos,10,10);
        
    }
    
    public int getX() {
        
        return xPos;
        
    }
    
    public int getY() {
        
        return yPos;
        
    }
    
}

Ik ben nog redelijk jong en op het vlak van Java nog een beginneling.

Alvast bedankt! :D
 
Hoi,

De reden dat hij dit aangeeft is omdat de main-methode puur bedoeld is om één ding aan te maken (zo heb ik het geleerd).
Je kunt volgens mij wel een Paint-klasse 'frame' aanmaken.
Maak dan specifiek nog de constructor van deze klasse:

Code:
//nieuwe main methode
public static void main(String[] args) 
{
    Paint frame = new Paint();
}

//constructor van Paint
public Paint()
{
    this.setSize(440, 440);
    this.createGUI();
    this.show();
}

N.b. - this hoeft er niet voorgezet te worden. De compiler herkent de methodes al van de extend.

Succes,

d0mzy
 
Laatst bewerkt:
Bedankt voor je hulp! :)
Maar het werkt nog altijd niet...
Hij geeft nog steeds dezelfde melding:

Exception in thread main

Ik heb mijn code bewerkt en uitgevoerd:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class Paint extends JFrame
    implements MouseListener {
        
    private JPanel panel;
    private Bomb bomb;
    private Game game;
    private int trys;

    public static void main(String[] args) {
        Paint frame = new Paint();
    }
    public Paint() {
    this.setSize(440, 440);
    this.createGUI();
    this.show();
    }

    private void createGUI() {
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container window = getContentPane();
        window.setLayout(new FlowLayout() );
    
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(400, 400));
        panel.setBackground(Color.white);
        window.add(panel);
        panel.addMouseListener(this); 
        
        Graphics paper = panel.getGraphics();
        
        game = new Game(paper);
        game.newGame();
        
    }
    public void mouseClicked(MouseEvent e) {
        if (e.getX() == bomb.getX() && e.getY() == bomb.getY()) {
            game.winGame();
            trys++;
        }
        if (e.getX() != bomb.getX() && e.getY() != bomb.getY() && trys ==5) {
            game.endGame();
        }
    }
    public void mouseEntered(MouseEvent e) {
    }
    public void mouseExited(MouseEvent e) {
    }
    public void mousePressed(MouseEvent e) {
    }
    public void mouseReleased(MouseEvent e) {
    }   
}

class Game {
    private Bomb bomb;
    private Graphics graphics;
    public Game(Graphics g) {
        graphics = g;
    }
    public void newGame() {
        bomb = new Bomb();
        bomb.create(graphics);
    }
    public void endGame() {
        bomb = null;
        JOptionPane.showMessageDialog(null,"Je hebt verloren.");
    }
    public void winGame() {
        JOptionPane.showMessageDialog(null,"Je hebt gewonnen.");
    }
}

class Bomb {
    
    private Random random1 = new Random();
    private Random random2 = new Random();
    private int xPos;
    private int yPos;
    
    public void create(Graphics area) {
        
        xPos = random1.nextInt() * 400;
        yPos = random2.nextInt() * 400;
        
        area.drawRect(xPos,yPos,10,10);
        
    }
    
    public int getX() {
        
        return xPos;
        
    }
    
    public int getY() {
        
        return yPos;
        
    }
    
}

Alvast bedankt voor je hulp! :D
 
Laatst bewerkt:
Hoi,

Probeer eens de volgende twee dingen:

Code:
//i.p.v. opslaan in lokale variabele nu puur aanmaken
new Paint();

Mocht dit niet werken, zul je een aparte klasse moeten aanmaken die Paint heet.
Mogelijk vind de Netbeans Compiler het niet geweldig dat er meerdere klassen naast de main method staan.

Dan krijg je dus twee bestandjes java-code.
Noot: Zorg dat ze in dezelfde package zitten.

Code:
public Main()
{
    public static void main(String[] args) 
    {
        new Paint();
    }
}
//eind main klasse

//nieuw java-bestand
public Paint()
{
    //variabelen

    public Paint(){}
    //enz..
}
Mogelijk krijg je Netbeans nogmaals op je dak. Dan zal ie zeggen dat ie de main-methode niet meer kan vinden.
Dat klopt: Je hadvoorheen de main-methode nu in de klasse Paint staan, je wil nu juist van deze klasse gebruik van maken.
Als je 'm nu in een nieuwe Main klasse zet, moet je ook aangeven dat je de Main.java wil opstarten, daar zit ook de main-methode in.
Dit kan als volgt:

Rechtsklik je project
Klik op properties
Ga naar Run aan de linkerkant van het scherm
Kies daar de nieuwe startup (main) --> Dat is nu Main.java.

Kortom: Probeer eerst de lokale variabele weg te halen. Werkt dit niet, ga dan met verschillende documenten (java klassen) werken.


Veel succes,

d0mzy
 
Hoi,

Probeer eens de volgende twee dingen:

Code:
//i.p.v. opslaan in lokale variabele nu puur aanmaken
new Paint();

Mocht dit niet werken, zul je een aparte klasse moeten aanmaken die Paint heet.
Mogelijk vind de Netbeans Compiler het niet geweldig dat er meerdere klassen naast de main method staan.

Dan krijg je dus twee bestandjes java-code.
Noot: Zorg dat ze in dezelfde package zitten.

Code:
public Main()
{
    public static void main(String[] args) 
    {
        new Paint();
    }
}
//eind main klasse

//nieuw java-bestand
public Paint()
{
    //variabelen

    public Paint(){}
    //enz..
}
Mogelijk krijg je Netbeans nogmaals op je dak. Dan zal ie zeggen dat ie de main-methode niet meer kan vinden.
Dat klopt: Je hadvoorheen de main-methode nu in de klasse Paint staan, je wil nu juist van deze klasse gebruik van maken.
Als je 'm nu in een nieuwe Main klasse zet, moet je ook aangeven dat je de Main.java wil opstarten, daar zit ook de main-methode in.
Dit kan als volgt:

Rechtsklik je project
Klik op properties
Ga naar Run aan de linkerkant van het scherm
Kies daar de nieuwe startup (main) --> Dat is nu Main.java.

Kortom: Probeer eerst de lokale variabele weg te halen. Werkt dit niet, ga dan met verschillende documenten (java klassen) werken.


Veel succes,

d0mzy


Klinkt moeilijk? :/
Zo te zin zou het beter zijn om gewoon met eclipse te werken?

Alvast bedankt! :D
 
Hoi,

Je hoeft echt niet Eclipse te gebruiken om dit probleem op te lossen.
Ik heb het even nagekeken voor je, en bij al mijn Java-projecten heb ik een apart bestand Main.java waarin ik een andere klasse aanroep.
In dit geval zou dit bij jou, wat ik al aangeef bij punt 2 van mijn vorige reactie, een Main-klasse zijn die jouw Paint-klasse gaat aanroepen.

Dus, deze:
Mocht dit niet werken, zul je een aparte klasse (bestand) moeten aanmaken die Paint heet.

Dan krijg je dus twee bestandjes java-code.
Noot: Zorg dat ze in dezelfde package zitten.

Code:
//main.java (bestand 1)
public Main()
{
    public static void main(String[] args) 
    {
        new Paint();
    }
}
//eind main klasse

//paint.java (bestand 2)
public Paint()
{
    private JPanel panel;
    private Bomb bomb;
    private Game game;
    private int trys;

    public Paint()
    {
        this.setSize(440, 440);
        this.createGUI();
        this.show();
    }

private void createGUI() {
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container window = getContentPane();
        window.setLayout(new FlowLayout() );
    
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(400, 400));
        panel.setBackground(Color.white);
        window.add(panel);
        panel.addMouseListener(this); 
        
        Graphics paper = panel.getGraphics();
        
        game = new Game(paper);
        game.newGame();
        
    }
    public void mouseClicked(MouseEvent e) {
        if (e.getX() == bomb.getX() && e.getY() == bomb.getY()) {
            game.winGame();
            trys++;
        }
        if (e.getX() != bomb.getX() && e.getY() != bomb.getY() && trys ==5) {
            game.endGame();
        }
    }
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}   
}

}
Mogelijk krijg je Netbeans nogmaals op je dak. Dan zal ie zeggen dat ie de main-methode niet meer kan vinden.
Dat klopt: Je hadvoorheen de main-methode nu in de klasse Paint staan, je wil nu juist van deze klasse gebruik van maken.
Als je 'm nu in een nieuwe Main klasse zet, moet je ook aangeven dat je de Main.java wil opstarten, daar zit ook de main-methode in.
Dit kan als volgt:

Rechtsklik je project
Klik op properties
Ga naar Run aan de linkerkant van het scherm
Kies daar de nieuwe startup (main) --> Dat is nu Main.java.

Dit is helaas de enige oplossing. Maar tien keer zo snel als je ineens met Eclipse wil gaan werken.
Maak alsjeblieft ook een apart bestandje Game.java en bestandje Bomb.java.
Dit, omdat je dan ook veel makkelijker de code uit elkaar kunt houden. (Verschillende klassen in verschillende documenten, haal ze niet door elkaar!)
Als je er echt niet uitkomt, laat het dan weten.

Succes!

d0mzy
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan