Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions src/main/java/hse/java/practice/task1/Edge.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,36 @@ public void setParts(CubeColor[][] parts) {
public String toString() {
return Arrays.deepToString(parts);
}

public void rotateClockwise() {
CubeColor[][] result_parts = new CubeColor[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
result_parts[j][2-i] = parts[i][j];
}
}
parts = result_parts;
}

public void setRow(int num, CubeColor[] row) {
parts[num] = row.clone();
}

public void setCol(int num, CubeColor[] col) {
for (int i = 0; i < 3; i++) {
parts[i][num] = col[i];
}
}

public CubeColor[] getRow(int num) {
return parts[num].clone();
}

public CubeColor[] getCol(int num) {
CubeColor[] col = new CubeColor[3];
for (int i = 0; i < 3; i++) {
col[i] = parts[i][num];
}
return col;
}
}
158 changes: 157 additions & 1 deletion src/main/java/hse/java/practice/task1/RubiksCube.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
* Необходимо реализовать интерфейс Cube
* При повороте передней грани, меняются верх низ право и лево
*/
public class RubiksCube {
public class RubiksCube implements Cube {

private static final int EDGES_COUNT = 6;

Expand All @@ -19,15 +19,161 @@ public class RubiksCube {
* грань 1 -> цвет 1
* ...
*/

private CubeColor[] rev(CubeColor[] s) {
var sc = s.clone();
var tmp = sc[0];
sc[0] = sc[2];
sc[2] = tmp;
return sc;
}

public RubiksCube() {
CubeColor[] colors = CubeColor.values();
for (int i = 0; i < 6; i++) {
edges[i] = new Edge(colors[i]);
}
}

@Override
public void front(RotateDirection direction) {
var e0 = edges[0].getRow(2);
var e1 = edges[1].getRow(0);
var e2 = edges[2].getCol(2);
var e3 = edges[3].getCol(0);
if (direction == RotateDirection.CLOCKWISE) {
edges[4].rotateClockwise();
edges[0].setRow(2 , rev(e2));
edges[1].setRow(0 , rev(e3));
edges[2].setCol(2 , e1);
edges[3].setCol(0 , e0);
} else {
edges[4].rotateClockwise();
edges[4].rotateClockwise();
edges[4].rotateClockwise();
edges[0].setRow(2 , e3);
edges[1].setRow(0 , e2);
edges[2].setCol(2 , rev(e0));
edges[3].setCol(0 , rev(e1));
}
}

@Override
public void right(RotateDirection direction) {
var e4 = edges[4].getCol(2);
var e0 = edges[0].getCol(2);
var e5 = edges[5].getCol(0);
var e1 = edges[1].getCol(2);
if (direction == RotateDirection.CLOCKWISE) {
edges[3].rotateClockwise();
edges[1].setCol(2 , rev(e5));
edges[4].setCol(2 , e1);
edges[0].setCol(2 , e4);
edges[5].setCol(0 , rev(e0));
} else {
edges[3].rotateClockwise();
edges[3].rotateClockwise();
edges[3].rotateClockwise();
edges[1].setCol(2 , e4);
edges[4].setCol(2 , e0);
edges[0].setCol(2 , rev(e5));
edges[5].setCol(0 , rev(e1));
}
}

@Override
public void left(RotateDirection direction) {
var e4 = edges[4].getCol(0);
var e0 = edges[0].getCol(0);
var e5 = edges[5].getCol(2);
var e1 = edges[1].getCol(0);
if (direction == RotateDirection.CLOCKWISE) {
edges[2].rotateClockwise();
edges[1].setCol(0 , e4);
edges[4].setCol(0 , e0);
edges[0].setCol(0 , rev(e5));
edges[5].setCol(2 , rev(e1));
} else {
edges[2].rotateClockwise();
edges[2].rotateClockwise();
edges[2].rotateClockwise();

edges[1].setCol(0 , rev(e5));
edges[4].setCol(0 , e1);
edges[0].setCol(0 , e4);
edges[5].setCol(2 , rev(e0));
}
}

@Override
public void up(RotateDirection direction) {
var e2 = edges[2].getRow(0);
var e4 = edges[4].getRow(0);
var e3 = edges[3].getRow(0);
var e5 = edges[5].getRow(0);
if (direction == RotateDirection.CLOCKWISE) {
edges[0].rotateClockwise();
edges[3].setRow(0 , rev(e5));
edges[4].setRow(0 , e3);
edges[2].setRow(0 , e4);
edges[5].setRow(0 , rev(e2));
} else {
edges[0].rotateClockwise();
edges[0].rotateClockwise();
edges[0].rotateClockwise();

edges[3].setRow(0 , e4);
edges[4].setRow(0 , e2);
edges[2].setRow(0 , rev(e5));
edges[5].setRow(0 , rev(e3));
}
}

@Override
public void down(RotateDirection direction) {
var e2 = edges[2].getRow(2);
var e4 = edges[4].getRow(2);
var e3 = edges[3].getRow(2);
var e5 = edges[5].getRow(2);
if (direction == RotateDirection.CLOCKWISE) {
edges[1].rotateClockwise();
edges[4].setRow(2 , e2);
edges[3].setRow(2 , e4);
edges[5].setRow(2 , rev(e3));
edges[2].setRow(2 , rev(e5));
} else {
edges[1].rotateClockwise();
edges[1].rotateClockwise();
edges[1].rotateClockwise();

edges[4].setRow(2 , e3);
edges[3].setRow(2 , rev(e5));
edges[5].setRow(2 , rev(e2));
edges[2].setRow(2 , e4);
}
}

@Override
public void back(RotateDirection direction) {
var e0 = edges[0].getRow(0);
var e1 = edges[1].getRow(2);
var e2 = edges[2].getCol(0);
var e3 = edges[3].getCol(2);
if (direction == RotateDirection.CLOCKWISE) {
edges[5].rotateClockwise();
edges[0].setRow(0 , e3);
edges[1].setRow(2 , e2);
edges[2].setCol(0 ,rev(e0));
edges[3].setCol(2 ,rev(e1));
} else {
edges[5].rotateClockwise();
edges[5].rotateClockwise();
edges[5].rotateClockwise();
edges[0].setRow(0 , rev(e2));
edges[1].setRow(2 , rev(e3));
edges[2].setCol(0 , e1);
edges[3].setCol(2 , e0);
}
}

public Edge[] getEdges() {
Expand All @@ -38,4 +184,14 @@ public Edge[] getEdges() {
public String toString() {
return Arrays.toString(edges);
}


public void debug() {
for (int i = 0; i < edges.length; i++) {
System.out.println(i);
for (int j = 0; j < edges[i].getParts().length; j++) {
System.out.println(Arrays.toString(edges[i].getParts()[j]));
}
}
}
}