未完成 待完善 public class MagicCube { /** * 六个面的下标值 * □5 * □□□□ 1234 这四个连体正方形向后顺时针包围 形成筒状 然后 把5和6扣上 就形成正方体 * □6 * @throws Exception */ public static void main(String[] args) throws Exception { MagicCube mb = new MagicCube(); int i = 0; for (Face f : mb.faces) { int index = 0; System.out.printf("这是第%d个面:/n",++i); System.out.printf("%d_%d_%d/n",f.value[index++],f.value[index++],f.value[index++]); System.out.printf("%d_%d_%d/n",f.value[index++],f.value[index++],f.value[index++]); System.out.printf("%d_%d_%d/n",f.value[index++],f.value[index++],f.value[index++]); /*int[] tmp = f.getColumn(2); System.out.printf("临时%d_%d_%d/n",tmp[0],tmp[1],tmp[2]); f.setColumn(2,new int[]{1,2,3}); tmp = f.getColumn(2); System.out.printf("设置第二列为123:%d_%d_%d/n",tmp[0],tmp[1],tmp[2]); index = 0; System.out.printf("修改后%d_%d_%d/n",f.value[index++],f.value[index++],f.value[index++]); System.out.printf("修改后%d_%d_%d/n",f.value[index++],f.value[index++],f.value[index++]); System.out.printf("修改后%d_%d_%d/n",f.value[index++],f.value[index++],f.value[index++]); */} mb.cubeTurn(1); System.out.println(mb); /* Face tmp1 = (Face) mb.faces.get(0); Face tmp2 = tmp1; System.out.println(tmp1 == tmp2); Face tmp = mb.faces.get(0).clone(); System.out.println(tmp1 == tmp); System.out.println(tmp); tmp.getRow(1); tmp.getRow(2); tmp.getRow(3); System.out.println(tmp.turnClockwise()); System.out.println(tmp.turnCounterclockwise()); System.out.println(tmp.turnCounterclockwise());*/ } @Override public String toString() { StringBuffer str = new StringBuffer(); int i = 0; for (Face f : this.faces) { str.append("这是第" + ++i + "个面:/n"); str.append(f); } return str.toString(); } public List<Face> faces = new ArrayList<Face>(6); MagicCube(){ initData(); } public static final int CURRENT = 1; public static final int LEFT = 4; public static final int RIGHT = 2; public static final int TOP = 5; public static final int BOTTOM = 6; public static final int BACK = 3; class Face implements Cloneable { @Override protected Face clone() throws CloneNotSupportedException { Face result = (Face) super.clone(); result.value = this.value.clone(); return result; } @Override public String toString() { StringBuffer str = new StringBuffer(); for (int i = 0; i < value.length; i++) { str.append(value[i]); if((i+1)%3 == 0){ str.append("/n"); }else{ str.append("_"); } } return str.toString(); } public int[] value = new int[9]; Face(){} Face(int[] value){ if(this.value.length == value.length) this.value = value; } int getBackIndex(int side){ switch(side){ case(1): return 3; case(3): return 1; case(2): return 4; case(4): return 2; case(5): return 6; case(6): return 5; default: return -1; } } /** * 获取当前面的第N行 * @param index * @return */ public int[] getRow(int index){ int[] result = new int[3]; int start = (index-1)*3; int end = start+3; int tmpIndex = 0; for (int i = start; i < end; i++) { result[tmpIndex++] = value[i]; } System.out.println(this); System.out.println("getRow:"+index+""+Arrays.toString(result)); return result; } /** *133 *132 *514 * * * */ //123 //456 //789 //1 123 2 456 0 3 6 9 12 // 1 2 3 4 5 //1 0 3 6 //2 1 4 7 //3 2 5 8 //i-1*3 // /** * 获取当前面的第N列 * @param index * @return */ public int[] getColumn(int index){ int[] result = new int[3]; int start = index-1; for (int i = 0; i < 3; i++) { result[i] = value[start]; start+=3; } System.out.println("getColumn:"+index+""+Arrays.toString(result)); return result; } /** * 设置第N行的数据 * @param index * @return */ public void setRow(int index, int[] value){ int start = (index-1)*3; for (int i = 0; i <= 2; i++) { this.value[start++] = value[i]; } } /** * 设置第N列的数据 * @param index * @return */ public void setColumn(int index, int[] value){ int start = index-1; for (int i = 0; i <= 2; i++) { this.value[start] = value[i]; start+=3; } } //原 逆 顺 //123 369 741 //456 -> 258 852 //789 147 963 /** * 顺时针旋转当前FACE */ public Face turnClockwise (){ try { Face tmp = this.clone(); //int[] tmp = new int[value.length]; //System.arraycopy(value, 0, tmp, 0, value.length); for (int i = 1; i < 4; i++) { //System.out.printf("第%d次/ntmp:%s/nths:%s/n",i,tmp,this); this.setRow(i, reverseIntArray(tmp.getColumn(i))); //System.out.println(Arrays.toString(tmp.getColumn(i))); } } catch (CloneNotSupportedException e) { e.printStackTrace(); } return this; } /** * 逆时针旋转当前FACE */ public Face turnCounterclockwise (){ try { Face tmp = this.clone(); for (int i = 1; i < 4; i++) { this.setRow(i, (tmp.getColumn(i))); } } catch (CloneNotSupportedException e) { e.printStackTrace(); } return this; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + getOuterType().hashCode(); result = prime * result + Arrays.hashCode(value); return result; } private int[] reverseIntArray(int[] v){ int[] result = new int[v.length]; for (int i = 0; i < v.length; i++) { result[i] = v[v.length-1-i]; } return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Face other = (Face) obj; if (!getOuterType().equals(other.getOuterType())) return false; if (!Arrays.equals(value, other.value)) return false; return true; } private MagicCube getOuterType() { return MagicCube.this; } } /** * 纵向转动某行/列 * @param face * @param turnType 转动方向 * turn:向上转 * false:向下转 * @param column 转动第几列 */ void verticalTurn(Face face,boolean turnType,int column){ int faceIndex = -1; for (int i = 0; i < faces.size(); i++) { if(faces.get(i).equals(face)){ faceIndex = i; break; } } if(faceIndex == -1){ throw new MagicCubeFaceNotFoundException(); }else{ verticalTurn(faceIndex, turnType, column); } } /** * 转动方向 * 1: x-z 左 * 2: x-z 右 * 3: x-y 从上向下 * 4: x-y 从下向上 * ##无效5: Clockwise 顺时针 * ##无效6: Counterclockwise 逆时针 * @param directionOfRotation * @throws Exception */ void cubeTurn(int directionOfRotation) throws Exception{ List<Face> newFaces = new ArrayList<Face>(6); switch(directionOfRotation){ case 1 : { newFaces.add(faces.get(1)); newFaces.add(faces.get(2)); newFaces.add(faces.get(3)); newFaces.add(faces.get(0)); newFaces.add(faces.get(4).turnClockwise()); newFaces.add(faces.get(5).turnClockwise()); faces = newFaces; break; } case 2 : { newFaces.add(faces.get(3)); newFaces.add(faces.get(0)); newFaces.add(faces.get(1)); newFaces.add(faces.get(2)); newFaces.add(faces.get(4).turnCounterclockwise()); newFaces.add(faces.get(5).turnCounterclockwise()); faces = newFaces; break; } case 3 : { newFaces.add(faces.get(4)); newFaces.add(faces.get(1).turnCounterclockwise()); newFaces.add(faces.get(5)); newFaces.add(faces.get(3).turnCounterclockwise()); newFaces.add(faces.get(2)); newFaces.add(faces.get(0)); faces = newFaces; break; } case 4 : { newFaces.add(faces.get(5)); newFaces.add(faces.get(1).turnClockwise()); newFaces.add(faces.get(4)); newFaces.add(faces.get(3).turnClockwise()); newFaces.add(faces.get(0)); newFaces.add(faces.get(2)); faces = newFaces; break; } } } /** * □5 * □□□□ 1234 * □6 */ void verticalTurn(int faceIndex,boolean isClockwise,int column){ int[] tmp = faces.get(faceIndex).getColumn(column); //第一页 //6->1 1->5 5->3 3->6 //3 逆时针转 //第二面: //6->2 2->5 5->4 4->6 //1逆时针转 if(isClockwise){//顺时针 faces.get(faceIndex).setColumn(column, faces.get(BOTTOM).getColumn(column)); faces.get(BACK).setColumn(column, faces.get(BOTTOM).getColumn(column)); faces.get(TOP).setColumn(column, faces.get(BACK).getColumn(column)); faces.get(BACK).setColumn(column, tmp); }else{ } } public void initData(){ List<Integer> allColor = new ArrayList<Integer>(54); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 6; j++) { allColor.add(j); } } Random random = new Random(); for (int i = 1; i <=6; i++) { int[] faceData = new int[9]; for (int j = 0; j < 9; j++) { int randomValue = random.nextInt(allColor.size()); faceData[j] = allColor.get(randomValue); allColor.remove(randomValue); } faces.add(new Face(faceData)); } } class MagicCubeFaceNotFoundException extends RuntimeException{ private static final long serialVersionUID = 865329763968080658L; } }