Slider Puzzle
<< Space Invader Game | FinalProjectsTrailIndex | Stone Game >>
GIF files Tile0.gif through Tile.15.gif for each Tile class
















Tile.java
import info.gridworld.actor.Actor;
public class Tile extends Actor {
public int getRow(){
return getLocation().getRow();
}
public int getCol(){
return getLocation().getCol();
}
public void act(){
//do nothing
}
}
Tile0.java
The classes Tile0 through Tile15 are pretty much the same, and only exist so that the correct gif file is drawn.
public class Tile0 extends Tile {
}
SliderPuzzle.java
import info.gridworld.actor.Actor;
import info.gridworld.actor.ActorWorld;
import info.gridworld.grid.BoundedGrid;
import info.gridworld.grid.Grid;
import info.gridworld.grid.Location;
public class SliderPuzzle extends ActorWorld {
private Grid gr;
private Tile0 t0=new Tile0();
private Tile1 t1=new Tile1();
private Tile2 t2=new Tile2();
private Tile3 t3=new Tile3();
private Tile4 t4=new Tile4();
private Tile5 t5=new Tile5();
private Tile6 t6=new Tile6();
private Tile7 t7=new Tile7();
private Tile8 t8=new Tile8();
private Tile9 t9=new Tile9();
private Tile10 t10=new Tile10();
private Tile11 t11=new Tile11();
private Tile12 t12=new Tile12();
private Tile13 t13=new Tile13();
private Tile14 t14=new Tile14();
private Tile15 t15=new Tile15();
public SliderPuzzle() {
gr=new BoundedGrid(4,4);
System.setProperty("info.gridworld.gui.selection", "hide");
System.setProperty("info.gridworld.gui.frametitle", "Slider Puzzle");
System.setProperty("info.gridworld.gui.tooltips", "hide");
setMessage("Click on a tile to move them in order. \nTry to do it in as few moves as necessary");
Tile[] tiles={t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15};
tiles=shuffle(tiles);
this.setGrid(gr);
for(int row=0; row<4;row++)
for (int col=0; col<4;col++)
add(new Location(row,col), tiles[4*row+col] );
}
public boolean locationClicked(Location loc){
if(isValidMove(loc)){
if (t0.getRow()==loc.getRow()){//slide horz
int offset=t0.getCol()-loc.getCol();
if(offset<0){//slide left
setMessage("sliding left "+offset);
slide(loc,offset,Location.EAST);
}else{
setMessage("sliding right "+offset);
slide(loc,offset,Location.WEST);
}
}else { // slide vert
int offset=t0.getRow()-loc.getRow();
if(offset<0){//slide up
setMessage("sliding up "+offset);
slide(loc,offset,Location.SOUTH);
}else{
setMessage("sliding down "+offset);
slide(loc,offset,Location.NORTH);
}
}
}
return true;
}
public void slide(Location lastLoc, int offset, int dir){
Location[] slots=new Location[1+Math.abs(offset)];
slots[0]=t0.getLocation();
for (int i=1; i<slots.length;i++){
slots[i]=slots[i-1].getAdjacentLocation(dir);
}
t0.removeSelfFromGrid();
for (int i=1; i<slots.length;i++){
Tile next=(Tile)gr.get(slots[i]);
next.moveTo(slots[i-1]);
}
t0.putSelfInGrid(gr, slots[slots.length-1]);
}
public boolean isValidMove(Location loc){
boolean result=false;
Location space = t0.getLocation();
if (space.getRow()==loc.getRow())
result=true;
if (space.getCol()==loc.getCol())
result=true;
if (loc.equals(space))
result=false;
setMessage("move is valid: "+result);
return result;
}
public Tile[] shuffle(Tile[] t){
for (int i=0; i<100; i++){
int x = 1+(int)(15.0*Math.random());
int y = 1+(int)(15.0*Math.random());
Tile buffer=t[x];
t[x]=t[y];
t[y]=buffer;
}
return t;
}
public static void main(String[] args)
{
SliderPuzzle game=new SliderPuzzle();
game.show();
}
}
