Créer une fenêtre pour afficher les meilleurs scores

Fermé
BKCelia - Modifié le 11 mai 2020 à 17:32
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 15 mai 2020 à 09:10
Bonsoir, je suis en terminale et j'ai comme devoir de créer un jeu avec un camarade. Nous avons décidé de partir sur un style Space Invaders, et nous cherchons désormais à créer un bouton SCORE, qui afficherais les 10 meilleurs scores. Pour cela, nous avons déjà créer un tableau utilisant un fichier :

package Systeme;

import java.awt.Graphics;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import acm.program.ConsoleProgram;
import acm.program.*;

public class ScoreComet extends ConsoleProgram {
    public int k;
    public static String[][] Scoretrie = new String[10][2];

    public String[][] getScoretrie() {
        return Scoretrie;
    }

    public void setScoretrie(String[][] scoretrie) {
        Scoretrie = scoretrie;
    }

    public void run() {
        int NombreScore = 0;
        int NombreJoueur = 0;
        int Compteur = 1;
        int iishimumeme = 0;
        String[][] Score = new String[10][2];
        File fichier = new File("Score.txt");
        try {
            Scanner AEntree = new Scanner(fichier);
            while (AEntree.hasNextLine()) {
                int reste = Compteur % 2;
                if (reste != 0) {
                    Score[NombreScore][0] = AEntree.nextLine();
                    NombreScore = NombreScore + 1;
                    Compteur = Compteur + 1;
                } else {
                    Score[NombreJoueur][1] = AEntree.nextLine();
                    NombreJoueur = NombreJoueur + 1;
                    Compteur = Compteur + 1;
                }
            }
            AEntree.close();
        } catch (IOException e) {
            println("Erreur Traitement fichier:" + e);
        }
        int alpha = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > alpha) {
                alpha = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[0][0] = Integer.toString(alpha);
        Scoretrie[0][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
        iishimumeme = 0;
        int beta = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > beta) {
                beta = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[1][0] = Integer.toString(beta);
        Scoretrie[1][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
        iishimumeme = 0;
        int gamma = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > gamma) {
                gamma = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[2][0] = Integer.toString(gamma);
        Scoretrie[2][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
        iishimumeme = 0;
        int delta = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > delta) {
                delta = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[3][0] = Integer.toString(delta);
        Scoretrie[3][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
        iishimumeme = 0;
        int epsilon = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > epsilon) {
                epsilon = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[4][0] = Integer.toString(epsilon);
        Scoretrie[4][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
        iishimumeme = 0;
        int zeta = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > zeta) {
                zeta = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[5][0] = Integer.toString(zeta);
        Scoretrie[5][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
        iishimumeme = 0;
        int eta = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > eta) {
                eta = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[6][0] = Integer.toString(eta);
        Scoretrie[6][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
        iishimumeme = 0;
        int theta = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > theta) {
                theta = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[7][0] = Integer.toString(theta);
        Scoretrie[7][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
        iishimumeme = 0;
        int lota = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > lota) {
                lota = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[8][0] = Integer.toString(lota);
        Scoretrie[8][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
        iishimumeme = 0;
        int kappa = Integer.valueOf(Score[0][0]);
        for (k = 0; k < 10; k++) {
            if (Integer.valueOf(Score[k][0]) > kappa) {
                kappa = Integer.valueOf(Score[k][0]);
                iishimumeme = k;
            }
        }
        Scoretrie[9][0] = Integer.toString(kappa);
        Scoretrie[9][1] = Score[iishimumeme][1];
        Score[iishimumeme][0] = "0";
        Score[iishimumeme][1] = "0";
    }
}

et nous avons également un bouton, utilisant une classe "Souris" :
package Systeme;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import Jeu.Chrono;
import Jeu.Main;

public class Souris implements MouseListener {
    private double mouseX;
    private double mouseY;
    public static int pressedPlay = 0;
    public static int pressedScore = 0;

    public int getPressed() {
        return pressedPlay;
    }

    public void setPressed(int pressedPlay) {
        this.pressedPlay = pressedPlay;
    }

    public static int getPressedScore() {
        return pressedScore;
    }

    public static void setPressedScore(int pressedScore) {
        Souris.pressedScore = pressedScore;
    }

    public void mouseClicked(MouseEvent e) {
        mouseX = e.getX();
        mouseY = e.getY();
        if (e.getX() > 200 && e.getX() < 400 && e.getY() > 650 && e.getY() < 730) { // partie consacrée au bouton "PLAY"
            Main.scene.setDy(10);
            Thread chronoEcran = new Thread(new Chrono());
            chronoEcran.start();
            pressedPlay = 1;
        }
        if (e.getX() > 800 && e.getX() < 1000 && e.getY() > 650 && e.getY() < 730) { // partie est consacrée au bouton "SCORE"
            pressedScore = 1;
        }
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
        pressedPlay = 0;
    }
}

et nous avons tenté de créer une nouvelle fenêtre, dans notre "scene", et ça donnais ça :
if (Souris.pressedScore == 1) {
    g2.drawImage(this.imgScorePressed, 800, this.yScore, null);
    JFrame fenetre2 = new JFrame("Meilleures Scores");
    fenetre2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    fenetre2.setSize(500, 600);
    fenetre2.setLocation(100, 100);
    fenetre2.setResizable(false);
    fenetre2.setAlwaysOnTop(true);
}

Jusque là aucun message d'erreur, mais pas de nouvelle fenêtre en vue :/
Merci d'avoir lu jusqu'ici, en espérant avoir mis toutes les informations nécessaire à la résolution de mon problème ^^
A voir également:

4 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 mai 2020 à 17:44
Bonjour,

Il manque au minimum
fenetre2.setVisible(true);
pour que la fenêtre s'affiche.

Quant à pressedPlay et pressedScore, à mon avis, il faudra les supprimer, car elles ne permettent pas de gérer les événements comme il faut (et en tout cas il faudra supprimer leur propriété static, c'est faux).
Normalement, on devrait plutôt avoir l'affichage directement au sein du Listener sans gérer de variables d'états.

    public void mouseClicked(MouseEvent e) {
        mouseX = e.getX();
        mouseY = e.getY();
        // ...
        if (e.getX() > 800 && e.getX() < 1000 && e.getY() > 650 && e.getY() < 730) { // partie est consacrée au bouton "SCORE"
            fenetre2.setVisible(true);
        }
    }
0
Bonsoir, j'ai suivi vos conseils, et ça marche désormais, le problème maintenant c'est que je ne sais pas comment afficher le fichier dans cette nouvelle fenêtre
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
13 mai 2020 à 09:15
Si c'est juste du texte que tu veux afficher, un TextArea devrait suffire.
https://docs.oracle.com/javase/tutorial/uiswing/components/textarea.html

Quant à la lecture du fichier tu peux faire :
String text = Files.lines(Paths.get("E:/text.txt"), Charset.defaultCharset())
                   .collect(Collectors.joining("\n"));
0
Pour ajouter du texte j'ai utilisé :

private Font afficheScore = new Font("Arial", Font.PLAIN, 30);

et

public void paintComponent(Graphics g) {

super.paintComponent(g);
Graphics g2 = (Graphics2D)g;
g2.drawImage(this.imgFondScore, 0, 0, null);
g.setFont(afficheScore);
g.drawString("Test " + score, 50, 50);


et ça marche (j'ai essayé plusieurs fois avec un TextArea, en vain), mais comment est ce que j'affiche mon tableau maintenant que j'ai récupérer le fichier grâce à votre méthode ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
14 mai 2020 à 08:00
Tu ne t'en sortiras pas à tout vouloir faire via la méthode paintComponent. Je n'ai rien dit pour tes autres discussions parce que pour un jeu vidéo ça pouvait se justifier (même si l'utilisation de bouton auraient été plus simple) mais ici il va falloir que tu rajoutes un composant comme JTextArea.

Quel est le contenu de ton fichier ? Et comment veux tu l'afficher ?
0
Ah, oui en effet, mais nous souhaitions faire des boutons avec un certain style, pour une question d'esthétique, c'est pour cela qu'on avais utilisé paintComponent, je vais donc essayer de réecrire avec du JTextArea.

Quant au fichier, il contient le nom des joueurs, et le score qu'ils ont obtenu

package Systeme;



import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.Normalizer;
import java.util.Scanner;
import acm.program.ConsoleProgram;
import acm.program.*;

public class ScoreComet extends ConsoleProgram{
 public void run(){
  int NombreScore=0;
  int NombreJoueur=0;
  int Compteur = 1;
  int k;
  int iishimumeme = 0;
  int NouveauScore;
  String NouveauJoueur;
  
  
  String [][] Score = new String [10] [2];
  String [][] Scoretrie = new String [10] [2];
  
   File fichier = new File("Score.txt");
   try{
    Scanner AEntree =  new Scanner(fichier);
    while(AEntree.hasNextLine()){
     int reste = Compteur % 2;
     if(reste != 0){
      Score [NombreScore] [0] = AEntree.nextLine();
      NombreScore = NombreScore + 1;
      Compteur = Compteur +1;
     }
     else {
      Score [NombreJoueur] [1] = AEntree.nextLine();
      NombreJoueur = NombreJoueur + 1;
      Compteur = Compteur +1;
     }
     
    }
    AEntree.close();
   }
   catch (IOException e){
   println("Erreur Traitement fichier:"+ e );
  }
  int alpha = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>alpha) {
    alpha = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [0][0] = Integer.toString(alpha);
  Scoretrie [0][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  iishimumeme = 0;
  int beta = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>beta) {
    beta = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [1][0] = Integer.toString(beta);
  Scoretrie [1][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  iishimumeme = 0;
  int gamma = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>gamma) {
    gamma = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [2][0] = Integer.toString(gamma);
  Scoretrie [2][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  iishimumeme = 0;
  int delta = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>delta) {
    delta = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [3][0] = Integer.toString(delta);
  Scoretrie [3][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  iishimumeme = 0;
  int epsilon = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>epsilon) {
    epsilon = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [4][0] = Integer.toString(epsilon);
  Scoretrie [4][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  iishimumeme = 0;
  int zeta = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>zeta) {
    zeta = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [5][0] = Integer.toString(zeta);
  Scoretrie [5][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  iishimumeme = 0;
  int eta = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>eta) {
    eta = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [6][0] = Integer.toString(eta);
  Scoretrie [6][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  iishimumeme = 0;
  int theta = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>theta) {
    theta = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [7][0] = Integer.toString(theta);
  Scoretrie [7][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  iishimumeme = 0;
  int lota = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>lota) {
    lota = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [8][0] = Integer.toString(lota);
  Scoretrie [8][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  iishimumeme = 0;
  int kappa = Integer.valueOf(Score[0][0]);
  for(k = 0; k<10; k++) {
   if(Integer.valueOf(Score[k][0])>kappa) {
    kappa = Integer.valueOf(Score[k][0]);
    iishimumeme = k;
   }
    
  }
  Scoretrie [9][0] = Integer.toString(kappa);
  Scoretrie [9][1] = Score[iishimumeme][1];
  Score[iishimumeme][0] =  "0";
  Score[iishimumeme][1] =  "0";
  
  for(k = 0; k<10; k++) {
   println(Scoretrie[k][1] +"    "+Scoretrie[k][0]);
  }
  
  int NJ = 0;
  int NS = 0;
  Compteur = 1;
  NouveauScore = readInt("Veuiller saisir le nouveau score :");
  NouveauJoueur = readLine("Veuiller saisir votre nom :");
  
  if(NouveauScore >Integer.valueOf(Scoretrie [9][0])) {
   Scoretrie [9][0] = Integer.toString(NouveauScore);
   Scoretrie [9][1] = NouveauJoueur;
   try{
    PrintWriter ASortie = new PrintWriter("Score.txt");
    for(k = 0; k<20; k++) {
     int reste = Compteur % 2;
     if(reste != 0){
      ASortie.println(Scoretrie [NS][0]);
      NS = NS + 1;
      Compteur = Compteur + 1;
     }
     else {
      ASortie.println(Scoretrie [NJ][1]);
      NJ = NJ + 1;
      Compteur = Compteur + 1;
     }
    }
    ASortie.close();
   }
   catch (IOException e){
    println("Erreur Traitement fichier:"+ e );
   }
  }
  else {
   try{
    PrintWriter BSortie = new PrintWriter("Score.txt");
    for(k = 0; k<20; k++) {
     int reste = Compteur % 2;
     if(reste != 0){
      BSortie.println(Scoretrie [NS][0]);
      NS = NS + 1;
      Compteur = Compteur + 1;
     }
     else {
      BSortie.println(Scoretrie [NJ][1]);
      NJ = NJ + 1;
      Compteur = Compteur + 1;
     }
    }
    BSortie.close();
   }
   catch (IOException e){
    println("Erreur Traitement fichier:"+ e );
   }
  }
 } 
}

nous souhaitons l'afficher en plusieurs lignes, comme dans les vieux jeux d'arcade, avec le nom et le score à côté du premier sur la première ligne, le nom et le score du deuxième sur la deuxième ligne etc.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
15 mai 2020 à 09:10
Voici un exemple rapide pour expliquer comment tu peux mettre du HTML dans les composants Swing.
// import javax.swing.JOptionPane;

public static void main(String[] args) {
    String[] joueurs = { "ABCDE", "FGHIJ", "KLMNO" };
    int[] scores = { 123, 456, 789 };
    String[] colors = { "red", "rgb(0,255,0)", "#0000ff" };

    StringBuilder sb = new StringBuilder("<html>");
    for (int i = 0, n = Math.min(joueurs.length, scores.length); i < n; i++) {
        sb.append("<font size=20 color=").append(colors[i]).append("><center>")
          .append(joueurs[i]).append(" ").append(scores[i])
          .append("</center></font><br>");
    }
    String content = sb.append("</html>").toString();
    JOptionPane.showMessageDialog(null, content, "Scores", JOptionPane.PLAIN_MESSAGE);
}    

Ce qui donne une pop-up qui s'affiche comme ceci (c'est perfectible).
0