Reputation: 990
I am working on a small game. I've almost finished it, but the remaining problems I face could be divided into three:
ScorePanel
.Here are the three main classes of my code:
public class Fenetre extends JFrame {
private JMenuBar menu = new JMenuBar();
private JMenu file = new JMenu("Fichier");
private JMenuItem neew = new JMenuItem("Nouveau");
private JMenuItem score = new JMenuItem("Score");
private JMenuItem quit = new JMenuItem("Quitter");
private JMenu about = new JMenu("About");
private JMenuItem how = new JMenuItem("Règles");
private JMenuItem who = new JMenuItem("Credit");
private int i=1;
private ScorePanel scorepan = new ScorePanel(900,650);
private ReglesJeuPanel rgpan = new ReglesJeuPanel(900,650);
private GamePanel gamepan = new GamePanel();
private JPanel pan = new JPanel();
private JPanel container = new JPanel();
private JLabel label = new JLabel("------------------------SAMAIKOM------------------------");
private JTextArea texte = new JTextArea( "Vous avez sept coups pour trouver le mot caché. Si vous réussissez, on recommence !\n" +
"Plus vous trouvez de mots, plus votre score augmente. Alors, à vous de jouer !\n" +
"Proverbe :\t« Pas vu, pas pris !\n" +
"\tPris ! PENDU ! »");
public Fenetre(){
this.setTitle("Le Pendu ...");
this.setSize(900, 650);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
initMenu();
initAcceuilPan();
initListeners();
this.setContentPane(container);
}
private void initMenu(){
file.add(neew);
file.add(score);
file.addSeparator();
file.add(quit);
file.setMnemonic('F');
neew.setMnemonic('N');
neew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,KeyEvent.CTRL_DOWN_MASK));
score.setMnemonic('S');
score.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,KeyEvent.CTRL_DOWN_MASK));
quit.setMnemonic('Q');
quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,KeyEvent.CTRL_DOWN_MASK));
about.add(how);
about.addSeparator();
about.add(who);
about.setMnemonic('A');
how.setMnemonic('R');
how.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,KeyEvent.CTRL_DOWN_MASK));
who.setMnemonic('C');
who.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,KeyEvent.CTRL_DOWN_MASK));
menu.add(file);
menu.add(about);
this.setJMenuBar(menu);
}
private void initListeners(){
score.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
container.removeAll();
container.add(scorepan);
}
});
quit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
how.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
container.removeAll();
container.add(rgpan);
}
});
neew.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
gamepan.setNewWord();
gamepan.resetButtons();
container.removeAll();
container.add(gamepan);
}
});
gamepan.addCustomListener(new CustomListener(){
public void wordFound() {
neew.doClick();
}
public void wordNotFound() {
if(!ScorePanel.isScoreSuffisant())
{
container.removeAll();
initAcceuilPan();
}
if(ScorePanel.isScoreSuffisant()){
scorepan.initLeftPan();
container.removeAll();
container.add(scorepan);
}
}
});
}
private void initAcceuilPan(){
pan.removeAll(); // si on ne met pas cette methode, apres la réinisialisation du container si le mot n'a pas été trouvé on trouve 2 images!
pan.setBackground(Color.white);
pan.add(new JLabel(new ImageIcon("131868.jpg")));
texte.setEditable(false);
Font F1 = new Font("arial",Font.BOLD,20);
Font F2 = new Font("arial",Font.BOLD,15);
label.setFont(F1);
texte.setFont(F2);
container.setBackground(Color.white);
container.add(label);
container.add(pan);
container.add(texte);
//container.add(gamepan);
}
}
public class GamePanel extends JPanel{
private JPanel leftPan = new JPanel();
private JPanel rightPan = new JPanel();
private String[] letters = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",};
private JButton Button[] = new JButton[26];
private JLabel label1;
private JLabel label2;
private JLabel label3;
private String mistakeslabel; // pour savoir si un traitement a été fais ou non sur le tWord ( pour les mistakes )
private ActionListener buttonListener;
private JOptionPane jop = new JOptionPane();
private Word randWord = new Word(); // mot aléatoire
private TreatedWord tWord = new TreatedWord(randWord.getRandWord());// mot aléatoire traité ( etoiles et tout ça )
private char clickedButton;// lettre tappée
private int mistakes = 0;
private int coups = 0;
private final List<CustomListener> customListener = new LinkedList<>(); //On crée une liste de CustomListener pour en ajouter autant qu'on veut(Via addCustomListener)
public GamePanel(){
this.setBackground(Color.white);
initGamePan();
initListeners();
this.setLayout(new BorderLayout());
this.add(leftPan,BorderLayout.WEST);
this.add(rightPan,BorderLayout.EAST);
}
public void initGamePan(){
label1 = new JLabel("Nombre de mots trouvés : 0");
label1.setHorizontalAlignment(JLabel.CENTER);
label1.setFont(new Font("arial",Font.BOLD,20));
label1.setPreferredSize(new Dimension(300,50));
label2 = new JLabel("Score Actuel : 0 point");
label2.setHorizontalAlignment(JLabel.CENTER);
label2.setFont(new Font("arial",Font.BOLD,20));
label2.setPreferredSize(new Dimension(300,50));
label3 = new JLabel(tWord.getStars());
label3.setHorizontalAlignment(JLabel.CENTER);
label3.setFont(new Font("arial",Font.BOLD,30));
label3.setForeground(Color.blue);
label3.setPreferredSize(new Dimension(450,50));
mistakeslabel=label3.getText();
leftPan.add(label1);
leftPan.add(label2);
leftPan.add(label3);
for(int i=0;i<letters.length;i++){
Button[i]= new JButton(letters[i]);
leftPan.add(Button[i]);
}
leftPan.setPreferredSize(new Dimension(460,650));
leftPan.setBackground(Color.WHITE);
rightPan.setPreferredSize(new Dimension(420,650));
rightPan.setBackground(Color.WHITE);
}
public void initListeners(){
buttonListener= new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
clickedButton = ((JButton)(arg0.getSource())).getText().charAt(0); // on prend le bouton cliqué, on le convertis en string puis en char
label3.setText(tWord.treatedWord(clickedButton));// on donne a la methode tretedWord de l'objet tWord le char clickedbutton pour faire le traitement sur le mot mystère
((JButton)(arg0.getSource())).setEnabled(false);
if(mistakeslabel==label3.getText()){
mistakes++;
rightPan.removeAll();
switch(mistakes){
case 1 : rightPan.add(new JLabel(new ImageIcon("131870.jpg")));
break;
case 2 : rightPan.add(new JLabel(new ImageIcon("131871.jpg")));
break;
case 3 : rightPan.add(new JLabel(new ImageIcon("131872.jpg")));
break;
case 4 : rightPan.add(new JLabel(new ImageIcon("131873.jpg")));
break;
case 5 : rightPan.add(new JLabel(new ImageIcon("131874.jpg")));
break;
case 6 : rightPan.add(new JLabel(new ImageIcon("131875.jpg")));
break;
case 7 : rightPan.add(new JLabel(new ImageIcon("131876.jpg")));
break;
}
}
mistakeslabel=label3.getText();
coups++;
System.out.println(randWord.getRandWord());
if(tWord.isFound()){
String S;
S=ScorePanel.updateScore(coups,mistakes);
jop.showMessageDialog(null, "Bravo t'a trouvé le mot "+randWord.getRandWord()+" !\n en "+coups+" coups et "+mistakes+" erreur"+(mistakes>1 ? "s" : "")+S, "U don't Say B|", JOptionPane.INFORMATION_MESSAGE);
GamePanel.this.notifyWordFound(); // explications à la fin
}
if(mistakes==7){
if(!ScorePanel.isScoreSuffisant())
{
jop.showMessageDialog(null, "Score Insuffisant pour l'enregistrer ...", "hahahah wa l3iaaaan !", JOptionPane.INFORMATION_MESSAGE);
}
if(ScorePanel.isScoreSuffisant())
{
String Sc;
Sc=jop.showInputDialog(null,"Entrez un pseudo","Mabikch",JOptionPane.INFORMATION_MESSAGE);
ScorePanel.updateScoreLeftPan(Sc);
}
GamePanel.this.notifyWordNotFound();
mistakes=0;
}
}
};
for(int i=0;i<letters.length;i++){
Button[i].addActionListener(buttonListener);
}
}
public void setNewWord(){
this.randWord = new Word();
this.tWord = new TreatedWord(randWord.getRandWord());
this.label3.setText(tWord.getStars());
this.mistakeslabel=label3.getText();
this.mistakes=0;
this.rightPan.add(new JLabel(new ImageIcon("131869.jpg")));
}
public void resetButtons(){
for(JButton B : this.Button){
B.setEnabled(true);
}
}
public void addCustomListener(final CustomListener listener) {
this.customListener.add(listener);
}
private void notifyWordFound(/* any data you could use */) {
for(final CustomListener listener : this.customListener) {
listener.wordFound(/* any data you could use */);
}
}
private void notifyWordNotFound(/* any data you could use */) {
for(final CustomListener listener : this.customListener) {
listener.wordNotFound(/* any data you could use */);
}
}
}
public class ScorePanel extends JPanel{
private JPanel rightpan = new JPanel();
private JPanel leftpan = new JPanel();
private static int[] scores = {200,100,100,100,50,50,50,25,15,15};
private static String players[] = {"Haytam lwa3er","Player1","Player2","Player3","Player4","Player5","Player6","Player7","Player8","Player9"};
private int[] policeSize = {30, 28, 27, 26, 25, 24, 23, 22, 21, 20};
private JLabel label;
private static int score=0;
private static int scoreTotal=0;
public ScorePanel(int w,int h){
this.setPreferredSize(new Dimension(w,h));
this.setBackground(Color.white);
this.setLayout(new BorderLayout());
initLeftPan();
rightpan.setPreferredSize(new Dimension(430,650));
rightpan.setBackground(Color.white);
rightpan.add(new JLabel(new ImageIcon("131876.jpg")));
this.add(leftpan,BorderLayout.CENTER);
this.add(rightpan,BorderLayout.EAST);
}
public void initLeftPan(){
leftpan.removeAll();
leftpan.setPreferredSize(new Dimension(470,500));
leftpan.setBackground(Color.white);
for(int i=0;i<players.length;i++){
label= new JLabel(" "+players[i]+" : "+scores[i]+" pts "+"(1mot)"+" ");
Font F1= new Font("Comics Sans MS", Font.BOLD, policeSize[i]);
label.setFont(F1);
leftpan.add(label);
}
}
public static String updateScore(int coups,int mistakes){
switch(mistakes){
case 0 : score = 100;
break;
case 1 : score = 50;
break;
case 2 : score = 35;
break;
case 3 : score = 25;
break;
case 4 : score = 15;
break;
case 5 : score = 10;
break;
case 6 : score = 5;
break;
}
scoreTotal=scoreTotal+score;
return "\n Vous parquez "+score+" Points\nScore Total : "+scoreTotal;
}
public static boolean isScoreSuffisant(){
if(scoreTotal>=scores[9])return true;
else return false;
}
public static void updateScoreLeftPan(String pseudo){
for(int i=0;i<scores.length;i++){
if(scoreTotal>=scores[i]){
for(int j=scores.length-1;j>i-1;j--){
if(scoreTotal>=scores[j] && j!=0){
scores[j]=scores[j-1];
players[j]= players[j-1];
}
if(j==i){scores[j]=scoreTotal; players[j]=pseudo;}
}
break;
}
}
}
}
Upvotes: 1
Views: 132
Reputation: 347184
The first one is, when I execute my game, nothings shows up on the window just a gray background, when I reduce it and clic on it again, I find what normally I should see; and this problem with all the panels, for exemple to move from the game panel to the score panel I should reduce it again ...
This is typically a symptom of calling setVisible(true)
BEFORE you've actually added anything to the window...
The third problem is that I cannot execute my generated JAR file, I sought a sollution for a while but in vain
This probably because you've failed to supply the Main-Class
entry to the mainfest file. Take a look at Setting an Application's Entry Point
==
is not how String
comparison is done within Java, instead you want to use String#equals
, for example...
if (mistakeslabel == label3.getText()) {...
Should be
if (mistakeslabel.equals(label3.getText())) {...
The second problem is that it is slow ! especially if it needs to calculate score when I lose and seeds to display my updated scorepanel ...
This is unclear, but I suspect, that if you called revalidate
and repaint
after chaning the panels OR used a CardLayout
, you might find this works better
Upvotes: 2
Reputation: 45
I am not sure about the first problem. But for second and third problem, I can definitely help.
You have not used Multithreading in your game. Please remember that no game in Java is possible without using it.
Use an IDE like Eclipse or NetBeans for easily creating JAR files.
All the best !!
Upvotes: 0