2 posibles soluciones del juego 8 puzzle

Tengo una duda con el código (es una matriz de 3x3), tengo que hacer que puedas ganar de de 2 formas (en forma horizontal o en forma circular)

1 | 2 | 3
4 | 5 | 6
7 | 8 | 0

ó

1 | 2 | 3
8 | 0 | 4
7 | 6 | 5

Por lo pronto estoy comentando uno ( y solo puedo ganar de una forma a la vez), mi duda es: que puedo implementar para poder ganar de las 2 maneras descritas??
De antemano, muchas gracias.

public class Juego implements ActionListener{
private String game="game";
private int fila = 3;
private int columna = 3;
//posicion ganador del juego
//Posicion ganadora "game1"
private int[] win = {1,2,3,4,5,6,7,8,-1}; // -1 = casilla vacia <--------------------------------- ESTE ES UNO
//Posicion ganadora "game2"
//private int[] win = {1,2,3,4,-1,6,7,8,9} ; // -1 = casilla vacia <-------------------------------ESTE ES EL OTRO
//array para controlar el desarrollo del juego

private int[] pos_juego = new int[win.length];

private iconopieza matriz[] = new iconopieza[ fila * columna ];

public Juego()
{
System.out.println("Equipo:");
}

//carga imagenes de nuevo juego
public void NewGame(iconopieza m[])
{
this.matriz = m;
llenar_tablero(win, true);
}

//Inicia el juego
public void Comenzar()
{
//habilita controles
for ( int i=0; i < win.length; i++ )
matriz[i].setEnabled(true);
//desordena puzzle
int[] tmp = win;
int count = 0;
int numRandom;
for ( int i=0; i < pos_juego.length ; i++ )
pos_juego[i]=0;
do{
//obtiene numero aleatorio
numRandom = (int)( Math.random() * win.length );
//Si elemento en la posicion de numRandom es diferente de 0
if( pos_juego[numRandom]== 0)
{
pos_juego[numRandom] = tmp[count];
count++;
}
}while( count < pos_juego.length);

llenar_tablero(pos_juego,false);
}

//Finaliza el juego :)
public void Terminar()
{
for ( int i=0; i < win.length; i++ )
{
matriz[i].setDisabledIcon( new ImageIcon(getClass().getResource("/Piezas/Ext/logo.jpg")) );
matriz[i].setEnabled(false);
}
}

//Llena la matriz de controles con imagenes dado un array numerico con las posiciones de las mismas ¿se entendio?
private void llenar_tablero(int[] m , boolean band)
{
for ( int i=0; i < win.length; i++ )
{
if( m[i] > -1 )
{
matriz[i].setIcon( new ImageIcon(getClass().getResource("/puzzle/"+ game +"/" + m[i] + ".jpg")) );
matriz[i].setDisabledIcon( new ImageIcon(getClass().getResource("/puzzle/"+ game +"/" + m[i] + ".jpg")) );
}
else if (band)
{
matriz[i].setIcon( new ImageIcon(getClass().getResource("/puzzle/"+ game +"/" + (i+1) + ".jpg")) );
matriz[i].setDisabledIcon( new ImageIcon(getClass().getResource("/puzzle/"+ game +"/" + (i+1) + ".jpg")) );
}
else
{
matriz[i].setIcon( new ImageIcon(getClass().getResource("/Piezas/Ext/vacio.jpg")) );
matriz[i].setDisabledIcon( new ImageIcon(getClass().getResource("/Piezas/Ext/vacio.jpg")) );
}
}
}

public int getFila(){ return this.fila;}
public int getColumna() { return this.columna;}

//Atento a las acciones del usuario
public void actionPerformed(ActionEvent ev) {
//Captura en String el comando accionado por el usuario
String comando = ev.getActionCommand();

//Calcula posiciones de casillas vecinas y realiza movimiento

int[] pos = new int[8];
if( Integer.valueOf(comando)== columna-1 )//esquina superior derecha
{
pos[0] = -1;
pos[1] = -1;
pos[2] = -1;
pos[3] = Integer.valueOf(comando) - 1 ;
pos[4] = -1;
pos[5] = -1;
pos[6] = Integer.valueOf(comando) + columna;
pos[7] = -1;
}
else if(Integer.valueOf(comando) == (fila * columna - columna))//esquina inferior izquierda
{
pos[0] = -1;
pos[1] = Integer.valueOf(comando) - columna;
pos[2] = -1;
pos[3] = -1;
pos[4] = Integer.valueOf(comando) + 1;
pos[5] = -1;
pos[6] = -1;
pos[7] = -1;
}
else if(Integer.valueOf(comando) == (fila * columna - 1) )//esquina inferior derecha
{
pos[0] = -1;
pos[1] = Integer.valueOf(comando) - columna;
pos[2] = -1;
pos[3] = Integer.valueOf(comando) - 1 ;
pos[4] = -1;
pos[5] = -1;
pos[6] = -1;
pos[7] = -1;
}
else if(Integer.valueOf(comando)%columna == 0 )//primera columna
{
pos[0] = -1;
pos[1] = Integer.valueOf(comando) - columna;
pos[2] = -1;
pos[3] = -1;
pos[4] = Integer.valueOf(comando) + 1;
pos[5] = -1;
pos[6] = Integer.valueOf(comando) + columna;
pos[7] = -1;
}
else if( (Integer.valueOf(comando)+1)%columna == 0 )//ultima columna
{
pos[0] = -1;
pos[1] = Integer.valueOf(comando) - columna;
pos[2] = -1;
pos[3] = Integer.valueOf(comando) - 1 ;
pos[4] = -1;
pos[5] = -1;
pos[6] = Integer.valueOf(comando) + columna;
pos[7] = -1;
}
else //cualquier otra casilla
{
pos[0] = -1;
pos[1] = Integer.valueOf(comando) - columna;
pos[2] = -1;
pos[3] = Integer.valueOf(comando) - 1 ;
pos[4] = Integer.valueOf(comando) + 1;
pos[5] = -1;
pos[6] = Integer.valueOf(comando) + columna;
pos[7] = -1;
}
//realiza el movimiento
for ( int i=0; i < pos.length ; i++ )
if( mover( pos[i] , Integer.valueOf(comando) ) )
break;
//vuelve a pintar las imagenes
llenar_tablero(pos_juego,false);
//Movimientos de las casillas en el juego
//for ( int i=0; i < game.length ; i++ )
// System.out.print( game[i] + "," );
//System.out.println( );
//despues de cada movida reviza si las casillas estan ordenadas
if( gano() )
{
llenar_tablero(win,true);
JOptionPane.showMessageDialog(null, "Has Ganado!");
Terminar();
}
}

private boolean mover(int value, int index)
{
int tmp;
//si posicion existe dentro del array
if( value >=0 && value < fila*columna )
{
//si casilla esta vacia -> realiza el cambio
if( pos_juego[value] == -1 )
{
tmp = pos_juego[value];
pos_juego[value]=pos_juego[index];
pos_juego[index]=tmp;
return true;
}
}
return false;
}
//funcion que recorre el array de juego y de movidas para determinar si son iguales
private boolean gano()
{
for ( int i=0; i < win.length ; i++ )
{
if( win[i]!=pos_juego[i])
return false;
}
return true;
}
}