Added support for freemoves and undo (game logic missing for latter).

This commit is contained in:
t-moe
2016-06-20 01:11:02 +02:00
parent 0a70f9610e
commit 13c391775f
3 changed files with 37 additions and 7 deletions

View File

@@ -16,6 +16,7 @@ public class FieldCanvas extends JPanel{
static final int borderTop = 5; static final int borderTop = 5;
static final int borderBottom = 5; static final int borderBottom = 5;
public static final Color[] colors = { public static final Color[] colors = {
new Color(0xD66436), new Color(0xD66436),
new Color(0x486F70), new Color(0x486F70),
@@ -29,6 +30,7 @@ public class FieldCanvas extends JPanel{
private Point src; private Point src;
private Point dst; private Point dst;
private List<Point> path; private List<Point> path;
private boolean freeMoveMode = false;
FieldCanvas(Game g){ FieldCanvas(Game g){
MouseAdapter ad = new MouseAdapter(){ MouseAdapter ad = new MouseAdapter(){
@@ -65,10 +67,15 @@ public class FieldCanvas extends JPanel{
super.mouseReleased(e); super.mouseReleased(e);
dst = FieldCanvas.this.getClickPoint(e.getPoint()); dst = FieldCanvas.this.getClickPoint(e.getPoint());
path = null; path = null;
if(dst != null && src!=null && !src.equals(dst)) { if(freeMoveMode && !game.canMove(src, dst)) {
System.out.println("Moving from "+src.toString()+ " to "+dst.toString()); game.doFreeMove(src, dst);
game.doMove(src, dst); } else {
if(dst != null && src!=null && !src.equals(dst)) {
System.out.println("Moving from "+src.toString()+ " to "+dst.toString());
game.doMove(src, dst);
}
} }
freeMoveMode = false;
src = null; src = null;
repaint(); repaint();
} }
@@ -80,6 +87,18 @@ public class FieldCanvas extends JPanel{
} }
public void doFreeMove() {
if(game.getAvailFreeMoves()>0) {
freeMoveMode = true;
}
}
public void doUndo() {
if(game.getAvailUndo()>0) {
game.doUndo();
}
}
private Point getClickPoint(Point globalPos) { private Point getClickPoint(Point globalPos) {
int total = Math.min(this.getHeight()-borderTop-borderBottom,FieldCanvas.this.getWidth()-borderLeft-borderRight); int total = Math.min(this.getHeight()-borderTop-borderBottom,FieldCanvas.this.getWidth()-borderLeft-borderRight);
int space = total/game.getSize(); int space = total/game.getSize();

View File

@@ -41,6 +41,7 @@ public class Game {
*/ */
public Game (int size) { public Game (int size) {
rand = new Random(); // Initialize random object rand = new Random(); // Initialize random object
this.updateListeners = new ArrayList<UpdateListener>();
this.reset(size); this.reset(size);
} }
@@ -225,7 +226,6 @@ public class Game {
public void reset(int size){ public void reset(int size){
this.size = size; this.size = size;
this.freeBlocks = size * size; this.freeBlocks = size * size;
this.updateListeners = new ArrayList<UpdateListener>();
// Initialize new blocks // Initialize new blocks
nextBlocks = new ArrayList<Integer>(); nextBlocks = new ArrayList<Integer>();

View File

@@ -63,8 +63,12 @@ public class Window extends JFrame implements ActionListener{
buttonFreeMove= new JButton("Free Move (0)"); buttonFreeMove= new JButton("Free Move (0)");
buttonFreeMove.setEnabled(false); buttonFreeMove.setEnabled(false);
buttonFreeMove.addActionListener(this);
buttonFreeMove.setActionCommand("freemove");
buttonUndo = new JButton("Undo (0)"); buttonUndo = new JButton("Undo (0)");
buttonUndo.setEnabled(false); buttonUndo.setEnabled(false);
buttonUndo.addActionListener(this);
buttonUndo.setActionCommand("undo");
labelScore= new JLabel("Score: 0"); labelScore= new JLabel("Score: 0");
labelLinesLeft = new JLabel("Lines Left: 40"); labelLinesLeft = new JLabel("Lines Left: 40");
labelLevel = new JLabel("Level: 1"); labelLevel = new JLabel("Level: 1");
@@ -125,9 +129,16 @@ public class Window extends JFrame implements ActionListener{
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
int size = Integer.parseInt(e.getActionCommand()); String command = e.getActionCommand();
cardLayout.last(mainPanel); if(command.equals("undo")) {
game.reset(size); field.doUndo();
} else if (command.equals("freemove")) {
field.doFreeMove();
} else {
int size = Integer.parseInt(command);
cardLayout.last(mainPanel);
game.reset(size);
}
} }