From db0ed5093cc1c3ad1b17e8ebdbd7610e646efde3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D1=88=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Sat, 31 Jan 2026 22:24:39 +0300 Subject: [PATCH 1/8] first-commit : testing code --- .../hse/java/practice/task1/CubeColor.java | 6 +- .../java/hse/java/practice/task1/Edge.java | 38 ++- .../hse/java/practice/task1/EdgePosition.java | 25 +- .../hse/java/practice/task1/RubiksCube.java | 285 +++++++++++++++++- 4 files changed, 340 insertions(+), 14 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/CubeColor.java b/src/main/java/hse/java/practice/task1/CubeColor.java index 694eda76..c414190e 100644 --- a/src/main/java/hse/java/practice/task1/CubeColor.java +++ b/src/main/java/hse/java/practice/task1/CubeColor.java @@ -1,10 +1,10 @@ package hse.java.practice.task1; public enum CubeColor { - GREEN, - RED, - BLUE, WHITE, YELLOW, + GREEN, + BLUE, + RED, ORANGE } diff --git a/src/main/java/hse/java/practice/task1/Edge.java b/src/main/java/hse/java/practice/task1/Edge.java index d95ba56b..bffa97da 100644 --- a/src/main/java/hse/java/practice/task1/Edge.java +++ b/src/main/java/hse/java/practice/task1/Edge.java @@ -8,10 +8,10 @@ public class Edge { public Edge(CubeColor[][] parts) { this.parts = parts; - } + } // конструктор для создания сразу готового кубика рубика public Edge(CubeColor color) { - this.parts = new CubeColor[3][3]; + this.parts = new CubeColor[3][3]; // создаем новую грань с цветом 3x3 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { parts[i][j] = color; @@ -19,6 +19,10 @@ public Edge(CubeColor color) { } } + static public CubeColor getEdgeColor(Edge edge ) { + return edge.parts[0][0]; + } + public Edge() { parts = new CubeColor[3][3]; } @@ -27,10 +31,40 @@ public CubeColor[][] getParts() { return parts; } + public CubeColor[] getPartsLine(int i ) { + return parts[i]; + } + public CubeColor[] getPartsRow(int i) { + return new CubeColor[] { + parts[0][i] , parts[1][i] , parts[2][i] , + }; + } + + + public void setParts(CubeColor[][] parts) { this.parts = parts; } + public CubeColor[] setPartsLine1(CubeColor[] partsLine) { + CubeColor[] returnedCubeColor = this.parts[0]; + this.parts[0] = partsLine; + return returnedCubeColor; + } + + public void setPartsLine(CubeColor[] partsLine, int line) { + this.parts[line] = partsLine; + } + public void setPartsRow(CubeColor[] partsRow , int row) { + this.parts[0][row] = partsRow[0]; + this.parts[1][row] = partsRow[1]; + this.parts[2][row] = partsRow[2]; + } + + + + + @Override public String toString() { return Arrays.deepToString(parts); diff --git a/src/main/java/hse/java/practice/task1/EdgePosition.java b/src/main/java/hse/java/practice/task1/EdgePosition.java index f96cdf3c..3536f1b3 100644 --- a/src/main/java/hse/java/practice/task1/EdgePosition.java +++ b/src/main/java/hse/java/practice/task1/EdgePosition.java @@ -8,11 +8,24 @@ * edges[2] -> LEFT * ... */ + +// то есть имеется ввиду , что какие-то элементы храняться сверху / сбоку и тд public enum EdgePosition { - UP, - DOWN, - LEFT, - RIGHT, - FRONT, - BACK + UP(0), + DOWN(1), + LEFT(2), + RIGHT(3), + FRONT(4), + BACK(5); + + final int edgeNumber; + + EdgePosition(int edgeNumber) { + this.edgeNumber = edgeNumber; + } + + public int getEdgeNumber() { + return edgeNumber; + } + } diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index 2091b657..9ad8820c 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -1,12 +1,15 @@ package hse.java.practice.task1; + import java.util.Arrays; /** * Необходимо реализовать интерфейс Cube * При повороте передней грани, меняются верх низ право и лево */ -public class RubiksCube { + + +public class RubiksCube implements Cube { private static final int EDGES_COUNT = 6; @@ -19,23 +22,299 @@ public class RubiksCube { * грань 1 -> цвет 1 * ... */ + + + public RubiksCube() { CubeColor[] colors = CubeColor.values(); +// EdgePosition[] edgePositions = EdgePosition.values(); for (int i = 0; i < 6; i++) { edges[i] = new Edge(colors[i]); + } } + + + CubeColor[][] turn(RotateDirection direction , EdgePosition edgePosition) { + CubeColor[][] parts = new CubeColor[3][3] ; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + switch (direction) { + case CLOCKWISE: + parts[i][j] = edges[edgePosition.getEdgeNumber()].getParts()[2 - j][i]; + break; + + case COUNTERCLOCKWISE: + parts[i][j] = edges[edgePosition.getEdgeNumber()].getParts()[j][2 - i]; + break; + } + } + } + return parts; + } + + + + + @Override + public void up(RotateDirection direction) { + + CubeColor[][] parts = turn(direction , EdgePosition.UP); + + CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(0) ,edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(0).length ); // red + CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(0).length ); //orange + CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(0) ,edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(0) .length ) ; //blue + CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsLine(0) ,edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(0) .length ) ; // green + + switch (direction) { + case COUNTERCLOCKWISE : + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsLine(leftColorEdge , 0 ); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsLine(frontColorEdge , 0 ); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsLine(rightColorEdge, 0 ); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsLine(backColorEdge , 0 ); + break; + + case CLOCKWISE: + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsLine(rightColorEdge, 0 ); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsLine(backColorEdge, 0 ); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsLine(leftColorEdge, 0 ); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsLine(frontColorEdge, 0 ); + break ; + + } + + edges[EdgePosition.UP.getEdgeNumber()].setParts(parts); + } + + @Override + public void down(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.DOWN) ; + + CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(2).length ); // red + CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(2) ,edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(2).length ); //orange + CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(2) ,edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(2) .length ) ; //blue + CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsLine(2) ,edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(2).length ) ; // green + + + switch (direction) { // TODO : можно вынести + case CLOCKWISE : + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsLine(leftColorEdge ,2); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsLine(frontColorEdge,2); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsLine(rightColorEdge,2); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsLine(backColorEdge,2); + break ; + + case COUNTERCLOCKWISE: + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsLine(rightColorEdge,2); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsLine(backColorEdge,2); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsLine(leftColorEdge,2); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsLine(frontColorEdge,2); + break ; + + } + + edges[EdgePosition.DOWN.getEdgeNumber()].setParts(parts); + } + + @Override + public void left(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.LEFT) ; + + CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(0).length ); // red + CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(0).length ); // red + CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(0).length ); // red + CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(0).length ); // red + + + + switch (direction) { // TODO : можно вынести + case COUNTERCLOCKWISE : + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(frontColorEdge, 0); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(upColorEdge, 0); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(backColorEdge, 0); + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(downColorEdge, 0); + break ; + + case CLOCKWISE: + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(backColorEdge, 0); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(downColorEdge, 0); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(frontColorEdge, 0); + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(upColorEdge, 0); + break ; + + } + + edges[EdgePosition.LEFT.getEdgeNumber()].setParts(parts);; + + } + + @Override + public void right(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.RIGHT) ; + edges[EdgePosition.RIGHT.getEdgeNumber()].setParts(parts);; + + CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(2).length ); // red + CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(2).length ); // red + CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(2).length ); // red + CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(2).length ); // red + + + + switch (direction) { // TODO : можно вынести + case COUNTERCLOCKWISE : + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(backColorEdge,2); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(downColorEdge,2); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(frontColorEdge,2); + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(upColorEdge,2); + break ; + + case CLOCKWISE: + + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(frontColorEdge ,2); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(upColorEdge,2); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(backColorEdge,2); + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(downColorEdge,2); + break ; + + + + } + + + + } + + @Override public void front(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.FRONT) ; + + CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(2).length ); // red + CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(0).length ); // red + CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(2).length ); // red + CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(0).length ); // red + + switch (direction) { // TODO : можно вынести + case COUNTERCLOCKWISE : + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(rightColorEdge,2); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(upColorEdge , 2); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(leftColorEdge , 0); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(downColorEdge , 0); + break ; + + + case CLOCKWISE: + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(leftColorEdge ,2 ); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(downColorEdge , 2); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(rightColorEdge , 0); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(upColorEdge , 0); + break ; + + } + + edges[EdgePosition.FRONT.getEdgeNumber()].setParts(parts);; + + } + + @Override + public void back(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.BACK) ; + edges[EdgePosition.BACK.getEdgeNumber()].setParts(parts);; + + CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(0).length ); // red + CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(2).length ); // red + CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(0).length ); // red + CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(2).length ); // red + + switch (direction) { // TODO : можно вынести + case CLOCKWISE : + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(rightColorEdge , 0 ); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(upColorEdge , 0 ); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(leftColorEdge , 2); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(downColorEdge , 2); + break ; + + + case COUNTERCLOCKWISE: + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(leftColorEdge , 0); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(downColorEdge , 0); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(rightColorEdge , 2); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(upColorEdge , 2); + break ; + + } + + } - + + + public Edge[] getEdges() { return edges; } @Override public String toString() { - return Arrays.toString(edges); + String result = ""; + for (int i = 0; i < EDGES_COUNT; i++) { + Edge edge = edges[i]; + result += "\nNew Edge : " + Edge.getEdgeColor(edge)+ " \n"; + CubeColor[][] colorEdge = edge.getParts(); + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + result += " " + colorEdge[j][k] + " " ; + } + result += "\n"; + } + + } + return result; + } + + + + public static void main(String[] args) { + RubiksCube rubiksCube = new RubiksCube(); + CubeColor[][] test = new CubeColor[][] { + {CubeColor.RED , CubeColor.BLUE , CubeColor.ORANGE} , + {CubeColor.RED , CubeColor.BLUE , CubeColor.ORANGE} , + {CubeColor.RED , CubeColor.BLUE , CubeColor.ORANGE} + }; +// rubiksCube.edges[0] = new Edge(test); + rubiksCube.up(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.up(RotateDirection.CLOCKWISE); + + rubiksCube.down(RotateDirection.CLOCKWISE); + rubiksCube.down(RotateDirection.COUNTERCLOCKWISE); + + rubiksCube.right(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.right(RotateDirection.CLOCKWISE); + + rubiksCube.left(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.left(RotateDirection.CLOCKWISE); + + + rubiksCube.front(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.front(RotateDirection.CLOCKWISE); + + + rubiksCube.back(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.back(RotateDirection.CLOCKWISE); + + + + + + + + + System.out.println(rubiksCube); + + + + + +// System.out.println(rubiksCube); } } From 3555d70d585ff3ba074e013fbde9a57187b3bf24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D1=88=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Sat, 31 Jan 2026 23:15:45 +0300 Subject: [PATCH 2/8] replaced color --- .../hse/java/practice/task1/CubeColor.java | 18 +++++++++++++++--- .../java/practice/task1/CubeSimpleTest.java | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/CubeColor.java b/src/main/java/hse/java/practice/task1/CubeColor.java index c414190e..be30d6fe 100644 --- a/src/main/java/hse/java/practice/task1/CubeColor.java +++ b/src/main/java/hse/java/practice/task1/CubeColor.java @@ -1,10 +1,22 @@ package hse.java.practice.task1; public enum CubeColor { - WHITE, - YELLOW, GREEN, - BLUE, RED, + BLUE, + WHITE, + YELLOW, ORANGE } + + +//package hse.java.practice.task1; +// +//public enum CubeColor { +// WHITE, +// YELLOW, +// GREEN, +// BLUE, +// RED, +// ORANGE +//} diff --git a/src/test/java/hse/java/practice/task1/CubeSimpleTest.java b/src/test/java/hse/java/practice/task1/CubeSimpleTest.java index b13c4af7..6e7209fb 100644 --- a/src/test/java/hse/java/practice/task1/CubeSimpleTest.java +++ b/src/test/java/hse/java/practice/task1/CubeSimpleTest.java @@ -28,6 +28,7 @@ void printTest() { } } + @Test void frontClockwise() { RubiksCube cube = new RubiksCube(); From 77a5cd46f15f46130043cf65bcbf05cea935c3df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D1=88=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Sat, 31 Jan 2026 22:24:39 +0300 Subject: [PATCH 3/8] first-commit : testing code --- .../hse/java/practice/task1/CubeColor.java | 6 +- .../java/hse/java/practice/task1/Edge.java | 38 ++- .../hse/java/practice/task1/EdgePosition.java | 25 +- .../hse/java/practice/task1/RubiksCube.java | 285 +++++++++++++++++- 4 files changed, 340 insertions(+), 14 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/CubeColor.java b/src/main/java/hse/java/practice/task1/CubeColor.java index 694eda76..c414190e 100644 --- a/src/main/java/hse/java/practice/task1/CubeColor.java +++ b/src/main/java/hse/java/practice/task1/CubeColor.java @@ -1,10 +1,10 @@ package hse.java.practice.task1; public enum CubeColor { - GREEN, - RED, - BLUE, WHITE, YELLOW, + GREEN, + BLUE, + RED, ORANGE } diff --git a/src/main/java/hse/java/practice/task1/Edge.java b/src/main/java/hse/java/practice/task1/Edge.java index d95ba56b..bffa97da 100644 --- a/src/main/java/hse/java/practice/task1/Edge.java +++ b/src/main/java/hse/java/practice/task1/Edge.java @@ -8,10 +8,10 @@ public class Edge { public Edge(CubeColor[][] parts) { this.parts = parts; - } + } // конструктор для создания сразу готового кубика рубика public Edge(CubeColor color) { - this.parts = new CubeColor[3][3]; + this.parts = new CubeColor[3][3]; // создаем новую грань с цветом 3x3 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { parts[i][j] = color; @@ -19,6 +19,10 @@ public Edge(CubeColor color) { } } + static public CubeColor getEdgeColor(Edge edge ) { + return edge.parts[0][0]; + } + public Edge() { parts = new CubeColor[3][3]; } @@ -27,10 +31,40 @@ public CubeColor[][] getParts() { return parts; } + public CubeColor[] getPartsLine(int i ) { + return parts[i]; + } + public CubeColor[] getPartsRow(int i) { + return new CubeColor[] { + parts[0][i] , parts[1][i] , parts[2][i] , + }; + } + + + public void setParts(CubeColor[][] parts) { this.parts = parts; } + public CubeColor[] setPartsLine1(CubeColor[] partsLine) { + CubeColor[] returnedCubeColor = this.parts[0]; + this.parts[0] = partsLine; + return returnedCubeColor; + } + + public void setPartsLine(CubeColor[] partsLine, int line) { + this.parts[line] = partsLine; + } + public void setPartsRow(CubeColor[] partsRow , int row) { + this.parts[0][row] = partsRow[0]; + this.parts[1][row] = partsRow[1]; + this.parts[2][row] = partsRow[2]; + } + + + + + @Override public String toString() { return Arrays.deepToString(parts); diff --git a/src/main/java/hse/java/practice/task1/EdgePosition.java b/src/main/java/hse/java/practice/task1/EdgePosition.java index f96cdf3c..3536f1b3 100644 --- a/src/main/java/hse/java/practice/task1/EdgePosition.java +++ b/src/main/java/hse/java/practice/task1/EdgePosition.java @@ -8,11 +8,24 @@ * edges[2] -> LEFT * ... */ + +// то есть имеется ввиду , что какие-то элементы храняться сверху / сбоку и тд public enum EdgePosition { - UP, - DOWN, - LEFT, - RIGHT, - FRONT, - BACK + UP(0), + DOWN(1), + LEFT(2), + RIGHT(3), + FRONT(4), + BACK(5); + + final int edgeNumber; + + EdgePosition(int edgeNumber) { + this.edgeNumber = edgeNumber; + } + + public int getEdgeNumber() { + return edgeNumber; + } + } diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index 2091b657..9ad8820c 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -1,12 +1,15 @@ package hse.java.practice.task1; + import java.util.Arrays; /** * Необходимо реализовать интерфейс Cube * При повороте передней грани, меняются верх низ право и лево */ -public class RubiksCube { + + +public class RubiksCube implements Cube { private static final int EDGES_COUNT = 6; @@ -19,23 +22,299 @@ public class RubiksCube { * грань 1 -> цвет 1 * ... */ + + + public RubiksCube() { CubeColor[] colors = CubeColor.values(); +// EdgePosition[] edgePositions = EdgePosition.values(); for (int i = 0; i < 6; i++) { edges[i] = new Edge(colors[i]); + } } + + + CubeColor[][] turn(RotateDirection direction , EdgePosition edgePosition) { + CubeColor[][] parts = new CubeColor[3][3] ; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + switch (direction) { + case CLOCKWISE: + parts[i][j] = edges[edgePosition.getEdgeNumber()].getParts()[2 - j][i]; + break; + + case COUNTERCLOCKWISE: + parts[i][j] = edges[edgePosition.getEdgeNumber()].getParts()[j][2 - i]; + break; + } + } + } + return parts; + } + + + + + @Override + public void up(RotateDirection direction) { + + CubeColor[][] parts = turn(direction , EdgePosition.UP); + + CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(0) ,edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(0).length ); // red + CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(0).length ); //orange + CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(0) ,edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(0) .length ) ; //blue + CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsLine(0) ,edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(0) .length ) ; // green + + switch (direction) { + case COUNTERCLOCKWISE : + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsLine(leftColorEdge , 0 ); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsLine(frontColorEdge , 0 ); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsLine(rightColorEdge, 0 ); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsLine(backColorEdge , 0 ); + break; + + case CLOCKWISE: + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsLine(rightColorEdge, 0 ); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsLine(backColorEdge, 0 ); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsLine(leftColorEdge, 0 ); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsLine(frontColorEdge, 0 ); + break ; + + } + + edges[EdgePosition.UP.getEdgeNumber()].setParts(parts); + } + + @Override + public void down(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.DOWN) ; + + CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(2).length ); // red + CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(2) ,edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(2).length ); //orange + CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(2) ,edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(2) .length ) ; //blue + CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsLine(2) ,edges[EdgePosition.FRONT.getEdgeNumber()].getPartsLine(2).length ) ; // green + + + switch (direction) { // TODO : можно вынести + case CLOCKWISE : + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsLine(leftColorEdge ,2); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsLine(frontColorEdge,2); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsLine(rightColorEdge,2); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsLine(backColorEdge,2); + break ; + + case COUNTERCLOCKWISE: + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsLine(rightColorEdge,2); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsLine(backColorEdge,2); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsLine(leftColorEdge,2); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsLine(frontColorEdge,2); + break ; + + } + + edges[EdgePosition.DOWN.getEdgeNumber()].setParts(parts); + } + + @Override + public void left(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.LEFT) ; + + CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(0).length ); // red + CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(0).length ); // red + CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(0).length ); // red + CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(0).length ); // red + + + + switch (direction) { // TODO : можно вынести + case COUNTERCLOCKWISE : + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(frontColorEdge, 0); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(upColorEdge, 0); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(backColorEdge, 0); + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(downColorEdge, 0); + break ; + + case CLOCKWISE: + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(backColorEdge, 0); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(downColorEdge, 0); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(frontColorEdge, 0); + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(upColorEdge, 0); + break ; + + } + + edges[EdgePosition.LEFT.getEdgeNumber()].setParts(parts);; + + } + + @Override + public void right(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.RIGHT) ; + edges[EdgePosition.RIGHT.getEdgeNumber()].setParts(parts);; + + CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(2).length ); // red + CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(2).length ); // red + CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(2).length ); // red + CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(2).length ); // red + + + + switch (direction) { // TODO : можно вынести + case COUNTERCLOCKWISE : + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(backColorEdge,2); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(downColorEdge,2); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(frontColorEdge,2); + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(upColorEdge,2); + break ; + + case CLOCKWISE: + + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(frontColorEdge ,2); + edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(upColorEdge,2); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(backColorEdge,2); + edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(downColorEdge,2); + break ; + + + + } + + + + } + + @Override public void front(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.FRONT) ; + + CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(2).length ); // red + CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(0).length ); // red + CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(2).length ); // red + CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(0).length ); // red + + switch (direction) { // TODO : можно вынести + case COUNTERCLOCKWISE : + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(rightColorEdge,2); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(upColorEdge , 2); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(leftColorEdge , 0); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(downColorEdge , 0); + break ; + + + case CLOCKWISE: + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(leftColorEdge ,2 ); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(downColorEdge , 2); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(rightColorEdge , 0); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(upColorEdge , 0); + break ; + + } + + edges[EdgePosition.FRONT.getEdgeNumber()].setParts(parts);; + + } + + @Override + public void back(RotateDirection direction) { + CubeColor[][] parts = turn(direction , EdgePosition.BACK) ; + edges[EdgePosition.BACK.getEdgeNumber()].setParts(parts);; + + CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(0).length ); // red + CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(2).length ); // red + CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(0).length ); // red + CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(2).length ); // red + + switch (direction) { // TODO : можно вынести + case CLOCKWISE : + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(rightColorEdge , 0 ); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(upColorEdge , 0 ); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(leftColorEdge , 2); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(downColorEdge , 2); + break ; + + + case COUNTERCLOCKWISE: + edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(leftColorEdge , 0); + edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(downColorEdge , 0); + edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(rightColorEdge , 2); + edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(upColorEdge , 2); + break ; + + } + + } - + + + public Edge[] getEdges() { return edges; } @Override public String toString() { - return Arrays.toString(edges); + String result = ""; + for (int i = 0; i < EDGES_COUNT; i++) { + Edge edge = edges[i]; + result += "\nNew Edge : " + Edge.getEdgeColor(edge)+ " \n"; + CubeColor[][] colorEdge = edge.getParts(); + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + result += " " + colorEdge[j][k] + " " ; + } + result += "\n"; + } + + } + return result; + } + + + + public static void main(String[] args) { + RubiksCube rubiksCube = new RubiksCube(); + CubeColor[][] test = new CubeColor[][] { + {CubeColor.RED , CubeColor.BLUE , CubeColor.ORANGE} , + {CubeColor.RED , CubeColor.BLUE , CubeColor.ORANGE} , + {CubeColor.RED , CubeColor.BLUE , CubeColor.ORANGE} + }; +// rubiksCube.edges[0] = new Edge(test); + rubiksCube.up(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.up(RotateDirection.CLOCKWISE); + + rubiksCube.down(RotateDirection.CLOCKWISE); + rubiksCube.down(RotateDirection.COUNTERCLOCKWISE); + + rubiksCube.right(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.right(RotateDirection.CLOCKWISE); + + rubiksCube.left(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.left(RotateDirection.CLOCKWISE); + + + rubiksCube.front(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.front(RotateDirection.CLOCKWISE); + + + rubiksCube.back(RotateDirection.COUNTERCLOCKWISE); + rubiksCube.back(RotateDirection.CLOCKWISE); + + + + + + + + + System.out.println(rubiksCube); + + + + + +// System.out.println(rubiksCube); } } From cda13f7909fa539911f98f17775316db04462de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D1=88=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Sat, 31 Jan 2026 23:15:45 +0300 Subject: [PATCH 4/8] replaced color --- .../hse/java/practice/task1/CubeColor.java | 18 +++++++++++++++--- .../java/practice/task1/CubeSimpleTest.java | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/CubeColor.java b/src/main/java/hse/java/practice/task1/CubeColor.java index c414190e..be30d6fe 100644 --- a/src/main/java/hse/java/practice/task1/CubeColor.java +++ b/src/main/java/hse/java/practice/task1/CubeColor.java @@ -1,10 +1,22 @@ package hse.java.practice.task1; public enum CubeColor { - WHITE, - YELLOW, GREEN, - BLUE, RED, + BLUE, + WHITE, + YELLOW, ORANGE } + + +//package hse.java.practice.task1; +// +//public enum CubeColor { +// WHITE, +// YELLOW, +// GREEN, +// BLUE, +// RED, +// ORANGE +//} diff --git a/src/test/java/hse/java/practice/task1/CubeSimpleTest.java b/src/test/java/hse/java/practice/task1/CubeSimpleTest.java index b13c4af7..6e7209fb 100644 --- a/src/test/java/hse/java/practice/task1/CubeSimpleTest.java +++ b/src/test/java/hse/java/practice/task1/CubeSimpleTest.java @@ -28,6 +28,7 @@ void printTest() { } } + @Test void frontClockwise() { RubiksCube cube = new RubiksCube(); From afe2d9a01ec891a7801e76bbbca27a2fdc84ad10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D1=88=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Sat, 31 Jan 2026 22:24:39 +0300 Subject: [PATCH 5/8] first-commit : testing code --- src/main/java/hse/java/practice/task1/CubeColor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/CubeColor.java b/src/main/java/hse/java/practice/task1/CubeColor.java index be30d6fe..06352fc7 100644 --- a/src/main/java/hse/java/practice/task1/CubeColor.java +++ b/src/main/java/hse/java/practice/task1/CubeColor.java @@ -1,11 +1,11 @@ package hse.java.practice.task1; public enum CubeColor { - GREEN, - RED, - BLUE, WHITE, YELLOW, + GREEN, + BLUE, + RED, ORANGE } From 70d7c5030281228efbecd158d5ba5e634c7d7e63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D1=88=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Sat, 31 Jan 2026 23:15:45 +0300 Subject: [PATCH 6/8] replaced color --- src/main/java/hse/java/practice/task1/CubeColor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/CubeColor.java b/src/main/java/hse/java/practice/task1/CubeColor.java index 06352fc7..be30d6fe 100644 --- a/src/main/java/hse/java/practice/task1/CubeColor.java +++ b/src/main/java/hse/java/practice/task1/CubeColor.java @@ -1,11 +1,11 @@ package hse.java.practice.task1; public enum CubeColor { - WHITE, - YELLOW, GREEN, - BLUE, RED, + BLUE, + WHITE, + YELLOW, ORANGE } From 2255bb4786308909398ad901026f4210dae52aeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D1=88=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Sun, 1 Feb 2026 11:58:09 +0300 Subject: [PATCH 7/8] left , right , back replace realization --- .../hse/java/practice/task1/RubiksCube.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index 9ad8820c..4bc9e47a 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -54,13 +54,20 @@ CubeColor[][] turn(RotateDirection direction , EdgePosition edgePosition) { return parts; } + private CubeColor[] reverse(CubeColor[] arr) { + CubeColor[] result = new CubeColor[arr.length]; + for (int i = 0; i < arr.length; i++) { + result[i] = arr[arr.length - 1 - i]; + } + return result; + } + @Override public void up(RotateDirection direction) { - CubeColor[][] parts = turn(direction , EdgePosition.UP); CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(0) ,edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(0).length ); // red CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(0).length ); //orange @@ -84,12 +91,12 @@ public void up(RotateDirection direction) { } + CubeColor[][] parts = turn(direction , EdgePosition.UP); edges[EdgePosition.UP.getEdgeNumber()].setParts(parts); } @Override public void down(RotateDirection direction) { - CubeColor[][] parts = turn(direction , EdgePosition.DOWN) ; CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.LEFT.getEdgeNumber()].getPartsLine(2).length ); // red CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(2) ,edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsLine(2).length ); //orange @@ -114,12 +121,12 @@ public void down(RotateDirection direction) { } + CubeColor[][] parts = turn(direction , EdgePosition.DOWN) ; edges[EdgePosition.DOWN.getEdgeNumber()].setParts(parts); } @Override public void left(RotateDirection direction) { - CubeColor[][] parts = turn(direction , EdgePosition.LEFT) ; CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(0).length ); // red CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(0).length ); // red @@ -145,22 +152,19 @@ public void left(RotateDirection direction) { } + CubeColor[][] parts = turn(direction , EdgePosition.LEFT) ; edges[EdgePosition.LEFT.getEdgeNumber()].setParts(parts);; } @Override public void right(RotateDirection direction) { - CubeColor[][] parts = turn(direction , EdgePosition.RIGHT) ; - edges[EdgePosition.RIGHT.getEdgeNumber()].setParts(parts);; CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(2).length ); // red CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(2).length ); // red CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(2).length ); // red CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(2).length ); // red - - switch (direction) { // TODO : можно вынести case COUNTERCLOCKWISE : edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(backColorEdge,2); @@ -176,18 +180,16 @@ public void right(RotateDirection direction) { edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(backColorEdge,2); edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(downColorEdge,2); break ; - - - } + CubeColor[][] parts = turn(direction , EdgePosition.RIGHT) ; + edges[EdgePosition.RIGHT.getEdgeNumber()].setParts(parts);; } @Override public void front(RotateDirection direction) { - CubeColor[][] parts = turn(direction , EdgePosition.FRONT) ; CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(2).length ); // red CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(0).length ); // red @@ -212,14 +214,13 @@ public void front(RotateDirection direction) { } + CubeColor[][] parts = turn(direction , EdgePosition.FRONT) ; edges[EdgePosition.FRONT.getEdgeNumber()].setParts(parts);; } @Override public void back(RotateDirection direction) { - CubeColor[][] parts = turn(direction , EdgePosition.BACK) ; - edges[EdgePosition.BACK.getEdgeNumber()].setParts(parts);; CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(0).length ); // red CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(2).length ); // red @@ -244,12 +245,11 @@ public void back(RotateDirection direction) { } - - + CubeColor[][] parts = turn(direction , EdgePosition.BACK) ; + edges[EdgePosition.BACK.getEdgeNumber()].setParts(parts);; } - public Edge[] getEdges() { return edges; } @@ -282,25 +282,25 @@ public static void main(String[] args) { {CubeColor.RED , CubeColor.BLUE , CubeColor.ORANGE} }; // rubiksCube.edges[0] = new Edge(test); - rubiksCube.up(RotateDirection.COUNTERCLOCKWISE); - rubiksCube.up(RotateDirection.CLOCKWISE); - - rubiksCube.down(RotateDirection.CLOCKWISE); - rubiksCube.down(RotateDirection.COUNTERCLOCKWISE); - - rubiksCube.right(RotateDirection.COUNTERCLOCKWISE); - rubiksCube.right(RotateDirection.CLOCKWISE); - - rubiksCube.left(RotateDirection.COUNTERCLOCKWISE); - rubiksCube.left(RotateDirection.CLOCKWISE); - - - rubiksCube.front(RotateDirection.COUNTERCLOCKWISE); - rubiksCube.front(RotateDirection.CLOCKWISE); - - +// rubiksCube.up(RotateDirection.CLOCKWISE); +// rubiksCube.up(RotateDirection.COUNTERCLOCKWISE); +// +// rubiksCube.down(RotateDirection.CLOCKWISE); +// rubiksCube.down(RotateDirection.COUNTERCLOCKWISE); +// +// rubiksCube.right(RotateDirection.COUNTERCLOCKWISE); +// rubiksCube.right(RotateDirection.CLOCKWISE); +// +// rubiksCube.left(RotateDirection.COUNTERCLOCKWISE); +// rubiksCube.left(RotateDirection.CLOCKWISE); +// +// +// rubiksCube.front(RotateDirection.COUNTERCLOCKWISE); +// rubiksCube.front(RotateDirection.CLOCKWISE); +// +// rubiksCube.back(RotateDirection.COUNTERCLOCKWISE); - rubiksCube.back(RotateDirection.CLOCKWISE); +// rubiksCube.back(RotateDirection.CLOCKWISE); From 2c73aea965e5645db113deaf7cdd34269329ad75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=D1=88=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= Date: Sun, 1 Feb 2026 12:16:36 +0300 Subject: [PATCH 8/8] edit reverse logic --- .../hse/java/practice/task1/RubiksCube.java | 130 ++++++++---------- 1 file changed, 58 insertions(+), 72 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index 4bc9e47a..2b2df930 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -127,65 +127,55 @@ public void down(RotateDirection direction) { @Override public void left(RotateDirection direction) { + CubeColor[] upCol = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(0), 3); + CubeColor[] frontCol = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(0), 3); + CubeColor[] downCol = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(0), 3); + CubeColor[] backColRaw = edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(2); // Столбец 2 BACK + CubeColor[] backCol = reverse(Arrays.copyOf(backColRaw, 3)); - CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(0).length ); // red - CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(0).length ); // red - CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(0).length ); // red - CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(0).length ); // red - - - - switch (direction) { // TODO : можно вынести - case COUNTERCLOCKWISE : - edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(frontColorEdge, 0); - edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(upColorEdge, 0); - edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(backColorEdge, 0); - edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(downColorEdge, 0); - break ; - + switch (direction) { case CLOCKWISE: - edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(backColorEdge, 0); - edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(downColorEdge, 0); - edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(frontColorEdge, 0); - edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(upColorEdge, 0); - break ; - + edges[EdgePosition.FRONT.getEdgeNumber()].setPartsRow(upCol, 0); + edges[EdgePosition.DOWN.getEdgeNumber()].setPartsRow(frontCol, 0); + edges[EdgePosition.BACK.getEdgeNumber()].setPartsRow(reverse(downCol), 2); + edges[EdgePosition.UP.getEdgeNumber()].setPartsRow(backCol, 0); + break; + case COUNTERCLOCKWISE: + edges[EdgePosition.FRONT.getEdgeNumber()].setPartsRow(downCol, 0); + edges[EdgePosition.DOWN.getEdgeNumber()].setPartsRow(reverse(backColRaw), 0); + edges[EdgePosition.BACK.getEdgeNumber()].setPartsRow(reverse(upCol), 2); + edges[EdgePosition.UP.getEdgeNumber()].setPartsRow(frontCol, 0); + break; } - CubeColor[][] parts = turn(direction , EdgePosition.LEFT) ; - edges[EdgePosition.LEFT.getEdgeNumber()].setParts(parts);; - + edges[EdgePosition.LEFT.getEdgeNumber()].setParts(turn(direction, EdgePosition.LEFT)); } @Override public void right(RotateDirection direction) { + // Копируем ДО изменений (столбец 2 для всех, кроме BACK — там столбец 0) + CubeColor[] upCol = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(2), 3); + CubeColor[] frontCol = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(2), 3); + CubeColor[] downCol = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(2), 3); + CubeColor[] backColRaw = edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(0); // Столбец 0 EdgePosition.BACK + CubeColor[] backCol = reverse(Arrays.copyOf(backColRaw, 3)); // Инвертируем из-за ориентации - CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.UP.getEdgeNumber()].getPartsRow(2).length ); // red - CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsRow(2).length ); // red - CubeColor[] frontColorEdge = Arrays.copyOf(edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.FRONT.getEdgeNumber()].getPartsRow(2).length ); // red - CubeColor[] backColorEdge = Arrays.copyOf(edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.BACK.getEdgeNumber()].getPartsRow(2).length ); // red - - switch (direction) { // TODO : можно вынести - case COUNTERCLOCKWISE : - edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(backColorEdge,2); - edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(downColorEdge,2); - edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(frontColorEdge,2); - edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(upColorEdge,2); - break ; - + switch (direction) { + case COUNTERCLOCKWISE: + edges[EdgePosition.FRONT.getEdgeNumber()].setPartsRow(upCol, 2); + edges[EdgePosition.DOWN.getEdgeNumber()].setPartsRow(frontCol, 2); + edges[EdgePosition.BACK.getEdgeNumber()].setPartsRow(reverse(downCol), 0); // Инвертируем при записи + edges[EdgePosition.UP.getEdgeNumber()].setPartsRow(backCol, 2); + break; case CLOCKWISE: - - edges[ EdgePosition.UP.getEdgeNumber() ].setPartsRow(frontColorEdge ,2); - edges[ EdgePosition.BACK.getEdgeNumber() ].setPartsRow(upColorEdge,2); - edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsRow(backColorEdge,2); - edges[ EdgePosition.FRONT.getEdgeNumber() ].setPartsRow(downColorEdge,2); - break ; + edges[EdgePosition.FRONT.getEdgeNumber()].setPartsRow(downCol, 2); + edges[EdgePosition.DOWN.getEdgeNumber()].setPartsRow(reverse(backColRaw), 2); + edges[EdgePosition.BACK.getEdgeNumber()].setPartsRow(reverse(upCol), 0); + edges[EdgePosition.UP.getEdgeNumber()].setPartsRow(frontCol, 2); + break; } - CubeColor[][] parts = turn(direction , EdgePosition.RIGHT) ; - edges[EdgePosition.RIGHT.getEdgeNumber()].setParts(parts);; - - + edges[EdgePosition.RIGHT.getEdgeNumber()].setParts(turn(direction, EdgePosition.RIGHT)); } @Override @@ -221,35 +211,31 @@ public void front(RotateDirection direction) { @Override public void back(RotateDirection direction) { + // Сначала копируем смежные элементы! + CubeColor[] upEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(0), 3); + CubeColor[] downEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(2), 3); + CubeColor[] leftEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(0), 3); + CubeColor[] rightEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(2), 3); - CubeColor[] upColorEdge = Arrays.copyOf(edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(0),edges[EdgePosition.UP.getEdgeNumber()].getPartsLine(0).length ); // red - CubeColor[] downColorEdge = Arrays.copyOf(edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(2),edges[EdgePosition.DOWN.getEdgeNumber()].getPartsLine(2).length ); // red - CubeColor[] leftColorEdge = Arrays.copyOf(edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(0),edges[EdgePosition.LEFT.getEdgeNumber()].getPartsRow(0).length ); // red - CubeColor[] rightColorEdge = Arrays.copyOf(edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(2),edges[EdgePosition.RIGHT.getEdgeNumber()].getPartsRow(2).length ); // red - - switch (direction) { // TODO : можно вынести - case CLOCKWISE : - edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(rightColorEdge , 0 ); - edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(upColorEdge , 0 ); - edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(leftColorEdge , 2); - edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(downColorEdge , 2); - break ; - - + switch (direction) { + case CLOCKWISE: + edges[EdgePosition.UP.getEdgeNumber()].setPartsLine(reverse(rightEdge), 0); + edges[EdgePosition.LEFT.getEdgeNumber()].setPartsRow(reverse(upEdge), 0); + edges[EdgePosition.DOWN.getEdgeNumber()].setPartsLine(reverse(leftEdge), 2); + edges[EdgePosition.RIGHT.getEdgeNumber()].setPartsRow(reverse(downEdge), 2); + break; case COUNTERCLOCKWISE: - edges[ EdgePosition.UP.getEdgeNumber() ].setPartsLine(leftColorEdge , 0); - edges[ EdgePosition.LEFT.getEdgeNumber() ].setPartsRow(downColorEdge , 0); - edges[ EdgePosition.DOWN.getEdgeNumber() ].setPartsLine(rightColorEdge , 2); - edges[ EdgePosition.RIGHT.getEdgeNumber() ].setPartsRow(upColorEdge , 2); - break ; - + edges[EdgePosition.UP.getEdgeNumber()].setPartsLine(reverse(leftEdge), 0); + edges[EdgePosition.LEFT.getEdgeNumber()].setPartsRow(reverse(downEdge), 0); + edges[EdgePosition.DOWN.getEdgeNumber()].setPartsLine(reverse(rightEdge), 2); + edges[EdgePosition.RIGHT.getEdgeNumber()].setPartsRow(reverse(upEdge), 2); + break; } - CubeColor[][] parts = turn(direction , EdgePosition.BACK) ; - edges[EdgePosition.BACK.getEdgeNumber()].setParts(parts);; + // Только теперь поворачиваем саму грань + edges[EdgePosition.BACK.getEdgeNumber()].setParts(turn(direction, EdgePosition.BACK)); } - public Edge[] getEdges() { return edges; } @@ -299,9 +285,9 @@ public static void main(String[] args) { // rubiksCube.front(RotateDirection.CLOCKWISE); // // - rubiksCube.back(RotateDirection.COUNTERCLOCKWISE); +// rubiksCube.back(RotateDirection.COUNTERCLOCKWISE); // rubiksCube.back(RotateDirection.CLOCKWISE); - +//