Randomization in Memory Game

Asked

Viewed 808 times

1

How can I work on this code below so that instead of appearing numbers on 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();

    }   
}
  • 5

    Your doubt doesn’t have much to do with randomization, it’s not even?

  • I’m not being able to randomize images, only numbers.

  • So you can create a Map<Integer, String>, randomize the numbers, take the result and replace it with an image path.

  • Could you show this in code? Or edit my code?

  • Yes, I really wanted to do that, only last night I couldn’t, I’ll try to do it in the next few hours (in case someone doesn’t answer before)

  • Thanks! I’ll wait.

  • Your code compiled good, it makes things easier :)

Show 2 more comments

1 answer

4


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

A direct way to do this is to create an image array 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 whole numbers, from 0 to 3.

Now, if you do:

var imagens = {"endereco\imagem\0", 
               "endereco\imagem\1", 
               "endereco\imagem\2", 
               "endereco\imagem\3"} 
para(i=0; i<4; i++)
    mostra(imagens[i])

You will be displaying an image in place of the number. That’s what has to be done.

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

Code:

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();
    }   
}

PS: Create a folder named images at the root of your project and put jpegs files with names ranging from 0.jpg until 7.jpg.

Furthermore, I must inform you that your code does not follow the conventions defined by Javabeans Standard which aims to standardize the way of writing code and facilitate communication between developers.

That says for example that:

  • Variables must be written in the pattern camelCase (Ex: aleatorio, numeroClick, contAcertos). So, you don’t start variable names with uppercase or use underline (_).
  • Vectors must be declared in the form tipo[] nome, 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 didn’t fix this in the code above because I believe the most important thing is that you know this in your future code.

  • I couldn’t. I created the folder; I put the images, but it didn’t work. It seems that the folder I created is not found.

  • Could you show the exception that was launched? Also, make sure your folder name is the same as mine : images, and not of imagens.

  • No exception appears; compiles normal, but no images appear when clicking the buttons.

  • 1

    Math, now worked. I took this code: for(int i=0; i<imgs.length; i++) { imgs[i] = new Imageicon("images/"+i+". jpg"); }, because it was not accessing the "images" folder; and I did as you directed: var images = {"picture address 0", "image address 1", "image address 2", "image address 3"} to(i=0; i<4; i++) display(images[i]).

Browser other questions tagged

You are not signed in. Login or sign up in order to post.