Pisałem kiedyś proste warcaby, planszą była tablica rozmiaru 8x8 obiektów typu JButton. Każdy JButton miał podpiętego tego samego ActionListenera, jeśli na tym polu stał pion, to JButton miał ikonkę (były dwie ikonki, dla białych pionów i dla czarnych pionów). Wizualizacja ruchu, to wymazanie ikonki z buttona startowego i dodanie jej do buttona docelowego.
class Listener implements ActionListener
{
public void actionPerformed(ActionEvent ae)
{
JButton p = (JButton)(ae.getSource());
if(from == null)
{
if(moveCanStart(p)) //sprawdzenie czy na tym polu jest pion i może wykonać ruch
{
from = p;
}
return;
}
JButton toWhere = (JButton)(ae.getSource());
if(!moveCanEnd(p)) //sprawdzenie czy ruch może się na tym polu zakończyć
{
return;
}
toWhere.setIcon(from.getIcon());
from.setIcon(null);
from = null;
}
}
Naprawdę, pola na planszy były typu Field dziedziczącej po JButton
class Field extends JButton
{
int row;
int col;
public Field(int row, int col)
{
this.row = row;
this.col = col;
setPreferredSize(new Dimension(50,50));
}
}
Pola row
i col
określają pozycję na planszy (0-7), bardzo ułatwiają analizę dopuszczalnych ruchów.