Salve a tutti!
Mi aiutate a capire cosa c'è che non va nel mio programma? In pratica il mio problema è che quando finisco una partita e voglio farne un'altra mi appare subito il JOptionPane con scritto che non ho colpito abbastanza bersagli.
codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.io.*;
import java.lang.*;
import java.util.*;
import java.util.Formatter;

class InfoFile{
	
	private Formatter output;
	private Giocatore Player;
	
	InfoFile(Giocatore newPlayer){
		Player = newPlayer;
	}
	
	public boolean ApriPerScrivere(){
		try{
			output = new Formatter(Player.getNome());
		}
		catch(SecurityException securityException)
		{
			System.err.println( "Nessun accesso alla scrittura di questo file.");
		}
		catch(FileNotFoundException filesNotFoundException)
		{
			System.err.println( "Errore durante la creazione del file." );
		}
		
		return (output != null);
	}
	
	public void ScriviSuFile(int k){
		try{
			
			ApriPerScrivere();
			String testo = "";
			Player.setPoints(Player.getPoints()+k);
			
			output.format("%d",Player.getPoints());
			ChiudiFileScritto();
		}
		catch(FormatterClosedException formatterClosedException){
			System.err.println( "Errore durante la scrittura del file." );
         	 	return;
         	}
        }
        
        public void ChiudiFileScritto(){
        	if (output != null)
        		output.close();
        }
        
        private Scanner input;
        
        public boolean ApriPerLeggere(){
        	try{
        		input = new Scanner(new File(Player.getNome()));
        	}
        	catch(FileNotFoundException exception){
        		System.err.println("Errore durante l'apertura del file.");
        	}
        	return(input != null);
        }
   	
   	public int Leggi(){
   		try{
   			ApriPerLeggere();
   			System.out.printf("%d", Player.getPoints());
   			ChiudiFileLetto();
   		}
   		catch(NoSuchElementException elementException){
   			System.err.println( "File con struttura errata." );
   			input.close();
   		}
   		catch(IllegalStateException stateException){
   			System.err.println( "Errore durante la lettura del file." );
   		}
   		return Player.getPoints();
   	}
   	
   	public void ChiudiFileLetto()
   	{
   		
   		if ( input != null )
   			input.close();
   	}
}
1° parte Prova10
codice:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.Timer;
import java.util.ArrayList;
import java.awt.Component;
import java.awt.Color;
import java.awt.Graphics2D;
import java.io.*;

public class Prova10 extends JPanel{
	
	public static void main(String [] args){
		
		JFrame finestra = new MyFrame();
		finestra.setVisible(true);
		finestra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

class MyFrame extends JFrame{
	final int X = 530;
	final int Y = 530;
	private int schermoW, schermoH;
	private int MaxBersagli = 10;
	private GiocoPanel myGioco;
	private DatiPanel myDati;
	private int Stage, Obiettivi, Punti, Points;
	private double G = 40, raggio;
	public int Colpiti = 0;
	private Giocatore Player = new Giocatore();
	private String NomeGiocatore;
	
	public Giocatore getGiocatore(){
		return Player;
	}
		
		public MyFrame(){
			Dimension schermo = Toolkit.getDefaultToolkit().getScreenSize();
			schermoH = schermo.height;
			schermoW = schermo.width;
			setTitle("Shoot At It");
			setResizable(false);
			setLocation( schermoW/2-250, schermoH/2-250);
			setSize(X,Y);
			
			JPanel mainPanel = new JPanel();
			mainPanel.setLayout(new BorderLayout());
			
			myGioco = new GiocoPanel();
			myDati = new DatiPanel(1,0,0);
			myDati.setStage(1);
			myDati.setObiettivi(0);
			myDati.setPunti(0);
			myDati.refreshDati();
			
			mainPanel.add(myGioco, BorderLayout.CENTER);
			mainPanel.add(myDati, BorderLayout.SOUTH);
			
			add(mainPanel);
		}
		
		class GiocoPanel extends JPanel implements MouseListener, MouseMotionListener{
			Dimension myGioco = new Dimension(0, 0);
			Color myColor = new Color(22, 43, 86);	 //COLORE PANNELLO MYGIOCO;
			private Timer t,t1;
			private int tempo1 = 3000;
			private ArrayList<Bersaglio> bersagli;
			private ArrayList<Bersaglio> ElementiDaRimuovere;
			double x,y;
			private int creati;			
			private double velocita = 2;
			InfoFile datiPlayer = new InfoFile(Player);
			File F = new File(Player.getNome());
			
			public GiocoPanel(){
				setPreferredSize(myGioco);
				setBackground(myColor);
				setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
				MaxBersagli = 10;
				creati = 0;
				String NomePlayer = JOptionPane.showInputDialog("Inserisci il tuo nome");
				Player.setNome(NomePlayer);
				
				if(F.exists()){
					int Puntivecchi = datiPlayer.Leggi();
					JOptionPane.showMessageDialog(null, "Vecchio Punteggio: "+Puntivecchi, "", JOptionPane.INFORMATION_MESSAGE);
				}
				else{
					JOptionPane.showMessageDialog(null, "Benvenuto in Shoot-At-It "+Player.getNome()+"!\nLo scopo del gioco e' colpire piu' bersagli possibili.\nPer superare uno stage devi colpirne almeno 6.\nBuona partita!", "Benvenuto", JOptionPane.INFORMATION_MESSAGE );
				}
					
				
				Genera();
				t = new Timer(20, new ActionListener(){
						public void actionPerformed(ActionEvent event){
							if(bersagli != null){
								for(int i=0; i<bersagli.size(); i++){
									((Bersaglio)(bersagli.get(i))).move();
										if(Bordi(i)){
										bersagli.remove(i);
										}
									repaint();
								}
							}
							if(bersagli.size() == 0 && creati == MaxBersagli){
							if(Colpiti < 6){
								t.stop();
								t1.stop();
								int text = 0;
								if(F.exists()){
									datiPlayer.ScriviSuFile(Player.getPoints());
									text = datiPlayer.Leggi();
								}
								else{
									datiPlayer.ScriviSuFile(0);
									text=datiPlayer.Leggi();
								}
								String controllo = ("Non hai colpito abbastanza bersagli!\nStage: "+Stage+
									"\nObiettivi: "+Obiettivi+"\nPunti: "+Punti+"\nVuoi rigiocare?");
								int risp = JOptionPane.showConfirmDialog(null, controllo, "Game Over", JOptionPane.YES_NO_OPTION );
									if(risp == JOptionPane.YES_OPTION){
										creati = 0;
										Stage = 1;
										Obiettivi = 0;
										Punti = 0;
										Points = 0;
										Colpiti = 0;
										velocita = 2;
										tempo1 = 3000;
										String NomePlayer1 = JOptionPane.showInputDialog("Inserisci il tuo nome");
										Player = new Giocatore();
										Player.setNome(NomePlayer1);										
										t.start();
										t1.start();
										Genera();
										myDati.refreshDati();
									}else{
										if(risp == JOptionPane.CLOSED_OPTION||risp == JOptionPane.NO_OPTION){
										JOptionPane.showMessageDialog(null,"GAME OVER");
										System.exit(0);
										}
									}
							}else{
								Stage += 1;
								creati = 0;
								tempo1 -= 20;
								G -= 2.5 ;
								Obiettivi = 0;
								Colpiti = 0;
								velocita += 0.3;
								myDati.refreshDati(); 
								Genera();
							}
						}
						repaint();
					}
				});
				t.start();
				t1.start();
				addMouseListener(this);
				addMouseMotionListener(this);
			}
			public void Genera(){
				bersagli = new ArrayList<Bersaglio>();
				t1 = new Timer(tempo1, new ActionListener(){ 
						public void actionPerformed(ActionEvent event){
							if(creati<MaxBersagli){
							bersagli.add(new Bersaglio(0,0));
							((Bersaglio)bersagli.get(bersagli.size()-1)).setSpeed(velocita);	// Velocità Bersagli
							((Bersaglio)(bersagli.get(bersagli.size()-1))).setCentro(CentroRandom());
							creati++;
							}
						}
				});
				t1.start();
			}
			
			public Point2D CentroRandom(){
			 	Point2D punto = new Point2D.Double(150,150);
				switch((int)Math.round(Math.random()*7+1)){
					
				case 1: punto = new Point2D.Double(-30,-30);
					((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(1,1);
					break;
				case 2: punto = new Point2D.Double(0,30+NRandom());
					((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(1,0);
					break;
				case 3: punto = new Point2D.Double(30+NRandom(),0);
					((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(0,1);
					break;
				case 4: punto = new Point2D.Double(530,530);
					((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(-1,-1);
					break;
				case 5: punto = new Point2D.Double(520,0);
					((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(-1,1);
					break;
				case 6: punto = new Point2D.Double(-15,520);
					((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(1,-1);
					break;
				case 7: punto = new Point2D.Double(30+NRandom(),485);
					((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(0,-1);
					break;
				case 8: punto = new Point2D.Double(530,30+NRandom());
					((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(-1,0);
					break;
				}
				return punto;				
			}
			public int NRandom(){
				int nrand = (int)(Math.round((Math.random())*300+1));
				return nrand;
			}
			
			public boolean Bordi(int i){
				boolean controllo = false;
				
				if(bersagli.get(i).getCentro().getX() > 530+45)
						controllo = true;					
				if(bersagli.get(i).getCentro().getX() < -45)
						controllo = true;
				if(bersagli.get(i).getCentro().getY() > 530+45)
						controllo = true;
				if(bersagli.get(i).getCentro().getY() < -45)
						controllo = true;	
				return controllo;
			}