Randomization in Memory Game

1

How can I work on this code below so that instead of numbers appearing on the buttons appear images?

package memory;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.border.TitledBorder;

public class Memory extends JFrame{


    int pontos = 100; 

    Random RandomNumber = new Random(); 
    int Aleatorio[] = new int [16];
    int Posicao_do_vetor_Aleatorio[] = new int [16];

    // Barra de Ferramenta
    private final JToolBar Barra_Ferramenta = new JToolBar();

    private final JButton Button_Novo_Jogo = new JButton("Novo Jogo");
    //private JButton Button_Estatisticas = new JButton("Estatísticas")
    private final JButton Escolha[] = new JButton[16];

    private final JPanel Panel = new JPanel();
    private final JPanel Barra_de_Status = new JPanel();

    private final GridLayout Layout_do_Jogo = new GridLayout(4,4); 
    private final Font Fonte = new Font("Lucida Console", Font.BOLD, 36);

    private final JLabel Pontuacao_do_Jogador = new JLabel("Pontos: 100");

    public Memory() {
        super("Jogo da Memória");

        Barra_Ferramenta.add(Button_Novo_Jogo);
        //Barra_Ferramenta.add(Button_Estatisticas);///////////JTOOLBAR/////////
        add(Barra_Ferramenta, BorderLayout.NORTH);

        for (int i=0; i<16; ++i){
            Escolha[i] = new JButton();
            Panel.add(Escolha[i]);
            Escolha[i].setFont(Fonte);
            Escolha[i].setVisible(true);
        }

        Panel.setLayout(Layout_do_Jogo);
        add(Panel, BorderLayout.CENTER);

        Barra_de_Status.add(Pontuacao_do_Jogador);
        add(Barra_de_Status, BorderLayout.SOUTH);


        Eventos_JogoDaMemoria Handler = new Eventos_JogoDaMemoria();
        for (int i=0; i<16; ++i){
            Escolha[i].addActionListener(Handler);
        }
        Button_Novo_Jogo.addActionListener(Handler);
        //Button_Estatisticas.addActionListener(Handler);///////////////////////



        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);     
        this.setSize(500,500);
        this.setVisible(true);
        this.setLocationRelativeTo(null);
    }

    private class Eventos_JogoDaMemoria implements ActionListener{

        int Cont_Acertos,Primeiro_Click,Segundo_Click;
        int Numero_Click, posi, cont, pontos_Anterior, Maior_Pontuacao_do_Jogador;
        int Partidas_jogadas = 0, Numero_de_Vitorias = 0;
        boolean Novo_Jogo = true;
        boolean Re_Iniciar = false;
        boolean Fim_de_Jogo = false;                       


        public void actionPerformed(ActionEvent event){                       



            if (event.getSource() == Button_Novo_Jogo){
                Novo_Jogo = true; ///
                Re_Iniciar = false;
            }

            //if (event.getSource() == Button_Estatisticas){
            // Fim_de_Jogo = true;
            //}

            if (Novo_Jogo == true){ 

                Cont_Acertos = 0;
                Partidas_jogadas++;
                pontos_Anterior = pontos;
                pontos = 100;
                Numero_Click = 0;
                posi = 0; cont = 16;
                Primeiro_Click = 0;
                Segundo_Click = 0;

                for (int i=0; i<16; ++i){

                    Escolha[i].setText("");
                    Escolha[i].setEnabled(true);
                }


                if (Re_Iniciar == false){

                    for (int i=0; i<16; ++i){
                        Posicao_do_vetor_Aleatorio[i] = i;
                    }

                    for (int i=0; i<8; ++i){

                        for (int j=0; j<2; ++j){
                            posi = RandomNumber.nextInt(cont);
                            Aleatorio[Posicao_do_vetor_Aleatorio[posi]] = i;

                            if (posi < cont){
                                for (int q=(posi+1); q<(cont); ++q){
                                    Posicao_do_vetor_Aleatorio[q-1] = Posicao_do_vetor_Aleatorio[q];
                                }
                            } cont--;
                        }
                    }
                }


                Novo_Jogo = false;
            }

            for (int i=0; i<16; ++i){

                if (event.getSource() == Escolha[i]){

                    Escolha[i].setText(String.valueOf(Aleatorio[i]));///////////
                    Escolha[i].setEnabled(false);
                    Escolha[i].setVisible(true);
                    Numero_Click++;

                    if (Numero_Click == 1) Primeiro_Click = i;
                    if (Numero_Click == 2){
                        Segundo_Click = i;

                        ///////////////Clicks_não_conseguidos///////////////
                        if (Aleatorio[Primeiro_Click] != Aleatorio[Segundo_Click]){                                                       
                            pontos-=2;
                            JOptionPane.showMessageDialog(Memory.this, "Errado");

                            Escolha[Primeiro_Click].setText("");
                            Escolha[Segundo_Click].setText("");
                            Escolha[Primeiro_Click].setEnabled(true);
                            Escolha[Segundo_Click].setEnabled(true);                             

                        }  else {
                            Cont_Acertos++;
                            pontos+=10;
                        }

                        Numero_Click = 0;
                    }
                }
            }


            if (Cont_Acertos == 8){
                Numero_de_Vitorias++;
                Cont_Acertos = 0;
                if (pontos > pontos_Anterior) Maior_Pontuacao_do_Jogador = pontos;
                Fim_de_Jogo = true;
            }


            if (pontos < 0) pontos = 0;
            Pontuacao_do_Jogador.setText("Pontos: " + pontos);


            //if (Fim_de_Jogo == true){
            //Estatisticas_Jogo(Partidas_jogadas, Numero_de_Vitorias, Maior_Pontuacao_do_Jogador);
            //Fim_de_Jogo = false;
            //}           
        }
    }

    //void Estatisticas_Jogo(int Partidas_jogadas, int Numero_de_Vitorias, int Maior_Pontuacao_do_Jogador){

    // JOptionPane.showMessageDialog(Memory.this, "Partidas jogadas: " + Partidas_jogadas +
    //"\nVitórias: " + Numero_de_Vitorias +
    //"\nMaior Pontuação do Jogador: " + Maior_Pontuacao_do_Jogador);
    //}

    public static void main(String [] args){

        new Memory();

    }   
}
    
asked by anonymous 26.05.2015 / 22:25

1 answer

4

Your code compiles and fills JButtons with random numbers, that means they have little to achieve your goal, basically what is missing is to put an image in place of a number.

One way to do this is to create an image vector and use the random number as its index.

For example, if you do:

para(i=0; i<4; i++)
    imprime(i)

You will print four integers, from 0 to 3.

Now, if you do:

var imagens = {"endereco\imagem
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;

public class Memory extends JFrame{

    private static final long serialVersionUID = 1L;

    int pontos = 100; 

    Random RandomNumber = new Random(); 
    int Aleatorio[] = new int [16];
    int Posicao_do_vetor_Aleatorio[] = new int [16];

    private final JToolBar Barra_Ferramenta = new JToolBar();

    private final JButton Button_Novo_Jogo = new JButton("Novo Jogo");
    private final JButton[] Escolha = new JButton[16];
    private final Icon[] imgs = new Icon[8]; //novo no seu código

    private final JPanel Panel = new JPanel();
    private final JPanel Barra_de_Status = new JPanel();

    private final GridLayout Layout_do_Jogo = new GridLayout(4,4); 
    private final Font Fonte = new Font("Lucida Console", Font.BOLD, 36);

    private final JLabel Pontuacao_do_Jogador = new JLabel("Pontos: 100");

    public Memory() {
        super("Jogo da Memória");
        Barra_Ferramenta.add(Button_Novo_Jogo);
        add(Barra_Ferramenta, BorderLayout.NORTH);
        for (int i=0; i<16; ++i){
            Escolha[i] = new JButton();
            Panel.add(Escolha[i]);
            Escolha[i].setFont(Fonte);
            Escolha[i].setVisible(true);
        }
        Panel.setLayout(Layout_do_Jogo);
        add(Panel, BorderLayout.CENTER);
        Barra_de_Status.add(Pontuacao_do_Jogador);
        add(Barra_de_Status, BorderLayout.SOUTH);

        Eventos_JogoDaMemoria Handler = new Eventos_JogoDaMemoria();
        for (int i=0; i<16; ++i){
            Escolha[i].addActionListener(Handler);
        }
        Button_Novo_Jogo.addActionListener(Handler);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);     
        this.setSize(500,500);
        this.setVisible(true);
        this.setLocationRelativeTo(null);
        //novo no seu código
        for(int i=0; i<imgs.length; i++) {
            imgs[i] = new ImageIcon("images/"+i+".jpg");
        }
    }

    private class Eventos_JogoDaMemoria implements ActionListener{
        int Cont_Acertos,Primeiro_Click,Segundo_Click;
        int Numero_Click, posi, cont, pontos_Anterior;
        boolean Novo_Jogo = true;
        boolean Re_Iniciar = false;
        public void actionPerformed(ActionEvent event){                       
            if (event.getSource() == Button_Novo_Jogo){
                Novo_Jogo = true;
                Re_Iniciar = false;
            }
            if (Novo_Jogo == true){ 
                Cont_Acertos = 0;
                pontos_Anterior = pontos;
                pontos = 100;
                Numero_Click = 0;
                posi = 0; cont = 16;
                Primeiro_Click = 0;
                Segundo_Click = 0;
                for (int i=0; i<16; ++i){
                    Escolha[i].setEnabled(true);
                }
                if (Re_Iniciar == false){

                    for (int i=0; i<16; ++i){
                        Posicao_do_vetor_Aleatorio[i] = i;
                    }
                    for (int i=0; i<8; ++i){

                        for (int j=0; j<2; ++j){
                            posi = RandomNumber.nextInt(cont);
                            Aleatorio[Posicao_do_vetor_Aleatorio[posi]] = i;

                            if (posi < cont){
                                for (int q=(posi+1); q<(cont); ++q){
                                    Posicao_do_vetor_Aleatorio[q-1] = Posicao_do_vetor_Aleatorio[q];
                                }
                            } cont--;
                        }
                    }
                }
                Novo_Jogo = false;
            }
            for (int i=0; i<16; ++i){
                if (event.getSource() == Escolha[i]){
                    Escolha[i].setIcon(imgs[Aleatorio[i]]);  //novo no seu código
                    Escolha[i].setEnabled(false);
                    Escolha[i].setVisible(true);
                    Numero_Click++;
                    if (Numero_Click == 1) Primeiro_Click = i;
                    if (Numero_Click == 2){
                        Segundo_Click = i;
                        ///////////////Clicks_não_conseguidos///////////////
                        if (Aleatorio[Primeiro_Click] != Aleatorio[Segundo_Click]){                                                       
                            pontos-=2;
                            JOptionPane.showMessageDialog(Memory.this, "Errado");
                            Escolha[Primeiro_Click].setIcon(null); //novo no seu código
                            Escolha[Segundo_Click].setIcon(null); //novo no seu código
                            Escolha[Primeiro_Click].setEnabled(true);
                            Escolha[Segundo_Click].setEnabled(true);                    
                        }  else {
                            Cont_Acertos++;
                            pontos+=10;
                        }
                        Numero_Click = 0;
                    }
                }
            }
            if (Cont_Acertos == 8){
                Cont_Acertos = 0;
                if (pontos > pontos_Anterior) {
                }
            }
            if (pontos < 0) pontos = 0;
            Pontuacao_do_Jogador.setText("Pontos: " + pontos);

        }
    }
    public static void main(String [] args){
        new Memory();
    }   
}
", "endereco\imagem", "endereco\imagem", "endereco\imagem"} para(i=0; i<4; i++) mostra(imagens[i])

You will be displaying an image in place of the number. This is what has to be done.

The above examples are in pseudocode to represent the main idea, your rephrase code to use images instead of numbers would be what is below. Everything I put back in your code I commented on the phrase //novo no seu código , in addition I removed everything that was with warning indicating that it was not being used, to be more compact.

Code:

para(i=0; i<4; i++)
    imprime(i)

PS: create a folder named images in the root of your project and put jpegs files with names ranging from 0.jpg to 7.jpg .

Also, I have to let you know that your code does not follow the conventions set by JavaBeans Standard which aims to standardize how to write code and facilitate communication between developers.

That says for example that:

  • Variables must be written in camelCase pattern (Ex: aleatorio , numeroClick , contAcertos ). So, you do not start variable names in upper case or use underline ( _ ).
  • Vectors should be declared in tipo[] nome form, while you declare for example int Aleatorio[] = new int [16]; and should be int[] aleatorio = new int[16]; .

These are just a few recommendations that will help you communicate with other developers. Of course not following them will not make your code break, but it also does not bring you any other great advantage.

I do not fix this in the code above because I believe the most important thing is to know this in your future code.

    
27.05.2015 / 16:14