package ioexample;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MemoryGameImpl implements IGame, ActionListener {
//=========================================================================
//members
/** A tabla merete. */
private int gameSize = 2;
/** A felhasznalhato szinek. */
private String[] items =
{ "Cat", "Dog", "Bug", "Shark", "Bear", "Wolf",
"Chicken", "Cow" };
/** A kitalalando elemek sorfolytonos abrazolasban */
private int[] itemsOfTheTable = null;
/** A "kartyak". */
private JButton[] cards;
/** A megengedett jatekmeretek. */
private String[] sizes = { "2x2", "4x4" };
/** Az utoljara felforditott ket elem. */
private int[] lastPair = new int[]{ -1, -1 };
//=========================================================================
//constructors
//=========================================================================
//inner classes
public class AskSizeDialog extends JDialog implements ActionListener {
//=====================================================================
//members
/** A dialogusablak szovegcimkeje. */
private final JLabel sizeLabel = new JLabel( "Board size: " );
/** Biztonsagos adatbevitelt segito valasztodoboz. */
private final JComboBox sizeBox = new JComboBox( sizes );
/** A jatekter meretet beallito gomb. */
private final JButton okButton = new JButton( "OK" );
//=====================================================================
//contructors
public AskSizeDialog( int size){
super();
initComponents();
setTitle( "Adjust game board size" );
//allitsuk az aktualis tablameretre a combo boxot
if( size == 4 ) sizeBox.setSelectedIndex( 1 );
}
//=====================================================================
//implemented interfaces
public void actionPerformed( ActionEvent e ) {
if( e.getActionCommand().equals( "ok" ) ){
int gameSize = sizeBox.getSelectedIndex() == 0 ? 2 : 4;
setGameSize( gameSize );
this.dispose(); //bezarja a dialogust
}
}
//=====================================================================
//protected & private functions
protected void initComponents(){
JPanel settingsPanel = new JPanel();
settingsPanel.setLayout( new FlowLayout() );
okButton.setActionCommand( "ok" );
okButton.addActionListener( this );
settingsPanel.add( sizeLabel );
settingsPanel.add( sizeBox );
settingsPanel.add( okButton );
getContentPane().add( settingsPanel );
setPreferredSize( new Dimension( 200, 80 ) );
setResizable( false );
pack();
}
}
//=========================================================================
//public functions
public int getGameSize(){
return gameSize;
}
public void setGameSize( int size ){
gameSize = size;
}
//=========================================================================
//private & protected functions
/**
* Ellatja a gomb lenyomasaval kapcsolatos teendoket.
*
* @param buttonIdx a megnyomott gomb indexe
*/
protected void buttonClicked( int buttonIdx ){
if( buttonIdx < 0 || cards.length <= buttonIdx ) return;
//mutassuk meg a kartyat
cards[buttonIdx].setText( items[itemsOfTheTable[buttonIdx]] );
if( lastPair[0] == -1 ){
lastPair[0] = buttonIdx;
}else if( lastPair[0] > -1 && lastPair[0] != buttonIdx ){
if( lastPair[1] == -1 ){
lastPair[1] = buttonIdx;
}else{
if( itemsOfTheTable[lastPair[0]] !=
itemsOfTheTable[lastPair[1]] ){
cards[lastPair[0]].setText( "" );
cards[lastPair[1]].setText( "" );
}else{
cards[lastPair[0]].setEnabled( false );
cards[lastPair[1]].setEnabled( false );
}
lastPair[0] = buttonIdx;
lastPair[1] = -1;
}
}
}
/**
* Ez a fuggveny keverne meg az elemeket.
*
* @return
*/
private int[] getShuffledItems(){
if( gameSize == 2 ) return new int[]{ 0, 1, 1, 0 };
if( gameSize == 4 )
return new int[]{ 6, 2, 7, 5, 4, 1, 3, 0, 4, 0, 2, 3, 7, 1, 5, 6 };
return null;
}
//=========================================================================
//implemented interfaces
public JPanel getGamePanel() {
lastPair = new int[]{ -1, -1 };
//gombok peldanyositasa
cards = new JButton[gameSize*gameSize];
for( int i = 0; i < cards.length; ++i ){
cards[i] = new JButton();
cards[i].setSize( new Dimension( 16, 16 ) );
cards[i].setActionCommand( String.valueOf( i ) );
cards[i].addActionListener( this );
}
JPanel gamePanel = new JPanel();
//parameterek gridlayout horizontalis merete, vertikalis merete, es a
//komponensek kozti vertikalis es horizontalis resek
GridLayout gameLayout = new GridLayout( gameSize, gameSize, 5, 5 );
gamePanel.setLayout( gameLayout );
//gamePanel.setPreferredSize( frame.getPreferredSize() );
for( int i = 0; i < cards.length; ++i ){
gamePanel.add( cards[i] );
}
itemsOfTheTable = getShuffledItems();
return gamePanel;
}
public JDialog getSettingsDialog() {
AskSizeDialog dialog = new AskSizeDialog( gameSize );
return dialog;
}
public String getGameName(){
return "Memory game";
}
public void actionPerformed( ActionEvent e ) {
try{
Integer buttonIdx = Integer.valueOf( e.getActionCommand() );
buttonClicked( buttonIdx );
}catch( NumberFormatException ex ){
//unexpected action command, do nothing
}
}
}