Salve a tutti ho trovato sul web questo codice sorgente del memory e vorrey capirne meglio il funzionamento dato che sono una principiante del Java. Soprattutto vorrei capire il significato del codice dellella classe hiddenButtons. Ringrazio tutti per l'attenzione
codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GameGuess extends Frame implements ActionListener
{

///////////////////////////Variables Declaration/////////////////////////
/////////////////////////////////////////////////////////////////////////

	JButton[] button = new JButton[30];
	JButton[] hiddenButton = new JButton[30];

	MenuBar menuBar = new MenuBar();
	MenuItem newGame = new MenuItem("New Game");
	MenuItem exit = new MenuItem("Exit");
	MenuItem instructions = new MenuItem("Instructions...");
	MenuItem features = new MenuItem("Features...");
	MenuItem aboutUs = new MenuItem("About us...");
	int check = 0;
	String name[] = new String[30];
	JButton btn = new JButton();
	String str = "";
	int chance = 0;
	int correct = 0;


//////////////////////////////////Constructors///////////////////////////
/////////////////////////////////////////////////////////////////////////

	GameGuess()
	{
		super();
	}

	GameGuess(String title)
	{
		super(title);
		setLayout(null);
		setBounds(84,50,629,498);
		setBackground(new Color(64,0,128));
		addWindowListener(new Winhandler());
		setResizable(false);
		Image icon = Toolkit.getDefaultToolkit().getImage("icon.jpg");
		setIconImage(icon);
		theMenuBar();
		gameButtons();
		hiddenButtons();
		setVisible(true);
	}

///////////////////////////////MenuBar Method////////////////////////////
/////////////////////////////////////////////////////////////////////////

	public void theMenuBar()
	{
		setLayout(null);
		setMenuBar(menuBar);
		Menu file = new Menu("File");
		Menu options = new Menu("Options");
		Menu about = new Menu("About");
		file.add(newGame);
		file.addSeparator();
		file.add(exit);

		exit.addActionListener(this);
		newGame.addActionListener(this);

		options.add(instructions);
		options.addSeparator();
		options.add(features);

		instructions.addActionListener(this);
		features.addActionListener(this);

		about.add(aboutUs);

		aboutUs.addActionListener(this);

		menuBar.add(file);
		menuBar.add(options);
		menuBar.add(about);
	}

///////////////////////////////Button Method/////////////////////////////
/////////////////////////////////////////////////////////////////////////

	public void gameButtons()
	{
		setLayout(null);
		int temp2 = 7;
		int temp1 = 0;
		Icon ic;

		for(int i=0 ; i<button.length ; i++)
		{
			ic = new ImageIcon("scene.jpg");
			button[i] = new JButton(ic);
			if(i == 5 || i == 10 || i == 15 || i == 20 || i == 25)
			{
				temp1 = 0;
				button[i].setBounds(temp2+=103,54+temp1,100,85);
			}
			button[i].setBounds(temp2,54+temp1,100,85);
			add(button[i]);
			temp1+=88;
			button[i].addActionListener(this);
		}
	}

///////////////////////////////Hidden Buttons//////////////////////////////
///////////////////////////////////////////////////////////////////////////

	public void hiddenButtons()
	{
		setLayout(null);
		int temp2 = 7;
		int temp1 = 0;
		Icon ic;
		String picName="1.jpg";
		int pic[] = new int[30];
		int pi = 0;

		for(int r=0 ; r<2 ; r++)
		{
			int t[] = new int[150];
			int temp[] = new int[150];
			outer:
			for(int k=0 ; k<150 ; k++)
			{
				t[k] = (int)((Math.random()*15)+1);
				for(int m=0 ; m<k+1 ; m++)
				{
					if(t[k] == temp[m])
					{
						continue outer;
					}
				}
				temp[k] = t[k];
				pic[pi] = t[k];
				pi++;
			}
		}
		for(int i=0 ; i<hiddenButton.length ; i++)
		{
			picName = pic[i]+".jpg";
			ic = new ImageIcon(picName);
			name[i] = picName;
			hiddenButton[i] = new JButton(ic);
			if(i == 5 || i == 10 || i == 15 || i == 20 || i == 25)
			{
				temp1 = 0;
				hiddenButton[i].setBounds(temp2+=103,54+temp1,100,85);
			}
			hiddenButton[i].setBounds(temp2,54+temp1,100,85);
			add(hiddenButton[i]);
			temp1+=88;
		}
	}

/////////////////////////Implementation of ActionListener////////////////
/////////////////////////////////////////////////////////////////////////

	public void actionPerformed(ActionEvent ae)
	{
		actionOnMenuBar(ae);
		actionOnButtons(ae);
	}

/////////////////////////Action Performed on MenuBar////////////////////////
////////////////////////////////////////////////////////////////////////////

	public  void actionOnMenuBar(ActionEvent ae)
	{
		Object source = ae.getSource();

		if(source == exit)
		{
			System.exit(0);
		}

		else
		if(source == newGame)
		{
			//setVisible(false);
			//new GameGuess("Guess The Picture");
		}

		else
		if(source == instructions)
		{
			JOptionPane.showMessageDialog(this,
			"1- Ci sono 30 caselle sullo schermo\n\n2- alcune contengono delle immagini\n\n3- Devi selezionare 2 caselle con la stessa immagine \n\n4- Se hai selezionato uan casella \ncon un immagine diversa dalal prima \nsi perde una chance e si dovranno selezionare nuovamente 2 caselle\n perdendo una possibilità\n-5 Si hanno 10 possibilità."
			,"Instructions",JOptionPane.INFORMATION_MESSAGE);
		}

		else
		if(source == features)
		{
			JOptionPane.showMessageDialog(this,
			"1- Ci sono 30 caselle nello schermo \n\n2-Alcune caselle contengono delle immagini al loro interno. \n\n3- Di seguito sono fornite le istruzioni di gioco.\n\n4- Se si vuole riavviare il gioco durante \nla partita basta cliccare nel menu \ne selezionare l'opzione desiderata. \n\n5- Durante il gioco,hai solo 10 chance \n per completare il gioco prima dello scadere del tempo."
			,"Features",JOptionPane.INFORMATION_MESSAGE);
		}

		else
		if(source == aboutUs)
		{
			Icon myPicture = new ImageIcon("me.jpg");
			JOptionPane.showMessageDialog(this,
			"XX XX, esame infomatica lb"
			,"About Us",JOptionPane.INFORMATION_MESSAGE,myPicture);
		}
	}

/////////////////////////Action Performed on Buttons////////////////////////
////////////////////////////////////////////////////////////////////////////

	public void actionOnButtons(ActionEvent ae)
	{
		Object buttonSource = ae.getSource();

		for(int i=0 ; i<button.length ; i++)
		{
			if(buttonSource == button[i])
			{
				++check;
				button[i].setVisible(false);		
					
				if(check==2)
				{
					check=0;

					if(name[i].equals(str))
					{
						correct++;
						button[i].setVisible(false);
						btn.setVisible(false);

						if(correct == 15)
						{
							JOptionPane.showMessageDialog(this,
							"Congratulazioni, hai vinto."
							,"Congratulazioni!",JOptionPane.INFORMATION_MESSAGE);
						}
					}

					else
					{
						/*for(int n=0 ; n<3 ; n++)
						{
							button[i].setVisible(true);
							try
							{
								Thread.sleep(1);
							}
							catch(InterruptedException ie)
							{
								button[i].setVisible(true);
							}
						}
*/
						button[i].setVisible(true);
						btn.setVisible(true);
						chance++;
						if(chance == 30)
						{
							JOptionPane.showMessageDialog(this,
							"Spiacenti,hai perso. \nhai 30 chances."
							,"Hai perso !",JOptionPane.INFORMATION_MESSAGE);
							chance = 0;
							System.exit(0);
						}
					}
				}

				else
				{
					btn = button[i];
					str = name[i];
				}
			}
		}
	}
}