diff --git a/ykoiso/src/B030_IceGame.java b/ykoiso/src/B030_IceGame.java new file mode 100644 index 0000000000000000000000000000000000000000..df9b3528d6de2c954f08d11ff8292335f49c6e24 --- /dev/null +++ b/ykoiso/src/B030_IceGame.java @@ -0,0 +1,122 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B030_IceGame { + public enum DIRECTION { + // 命令のenum + UP("U", 0, -1), + RIGHT("R", 1, 0), + DOWN("D", 0, 1), + LEFT("L", -1, 0); + + private String str; + private final int x, y; + + DIRECTION(String str, int x, int y) { + this.str = str; + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public String getStr() { + return str; + } + + // 逆検索 + public static DIRECTION getByStr(final String str) { + for (final DIRECTION DIRECTION : DIRECTION.values()) { + if (DIRECTION.name().startsWith(str)) { + return DIRECTION; + } + } + // 異常はぬるぽを返す + return null; + } + } + + // 定数 + private static final String ICE = "#"; + private static final String FLOOR = "."; + + public static void main(String[] args) { + /* finalつけ忘れない */ + final Scanner scan = new Scanner(System.in); + // 各種読み込み + final int height = scan.nextInt(); + final int width = scan.nextInt(); + String[][] map = new String[height][width]; + /* 混乱を招く変数名をやめようHは高さで文中に使われている */ + for (int i = 0; i < height; i++) { + String str = scan.next(); + map[i] = str.split(""); + } + int x = scan.nextInt() - 1; + int y = scan.nextInt() - 1; + final int orderNum = scan.nextInt(); + final List orderList = new ArrayList<>(); + for (int i = 0; i < orderNum; i++) { + // enum型で保持 + orderList.add(DIRECTION.getByStr(scan.next())); + } + B030_IceGame ice = new B030_IceGame(); + Position position = ice.new Position(x, y); + // 命令に合わせて移動 + for (int i = 0; i < orderNum; i++) { + position.move(map, width, height, orderList.get(i)); + } + // 最終座標の表示 + position.showPosition(); + scan.close(); + } + + // ポジションのクラス + class Position { + private int x, y; + + Position(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + // 位置を命令に従って変える + public void move(final String[][] map, final int width, final int height, + final DIRECTION direction) { + int currentX = x + direction.getX(); + int currentY = y + direction.getY(); + // 壁に隣接しているか + while (currentY < height && currentY >= 0 && currentX < width && currentX >= 0) { + x = currentX; + y = currentY; + // 床が氷ではないか + if (map[currentY][currentX].equals(FLOOR)) { + break; + } + currentX += direction.getX(); + currentY += direction.getY(); + } + } + + // 現在の位置を表示 + public void showPosition() { + System.out.println((x + 1) + " " + (y + 1)); + } + } + +} diff --git a/ykoiso/test/B030_IceGameTest.java b/ykoiso/test/B030_IceGameTest.java new file mode 100644 index 0000000000000000000000000000000000000000..907d9abe5f661d99e59ddbaf9b82df05eef054de --- /dev/null +++ b/ykoiso/test/B030_IceGameTest.java @@ -0,0 +1,104 @@ +import static org.junit.Assert.assertThat; +import org.junit.Test; +import static org.hamcrest.CoreMatchers.*; + +public class B030_IceGameTest { + String[][] map = { + {".", ".", "#", ".", ".",}, + {".", ".", ".", ".", ".",}, + {"#", "#", ".", ".", ".",}, + {".", ".", "#", ".", ".",}, + {".", ".", ".", ".", ".",} + }; + final int width = 5; + final int height = 5; + int x = 2; + int y = 2; + B030_IceGame ice = new B030_IceGame(); + B030_IceGame.Position position; + + @Test + public void 上向きに移動できる() { + position = ice.new Position(x, y); + position.move(map, width, height, B030_IceGame.DIRECTION.UP); + final int actualX = position.getX(); + final int expectedX = x; + assertThat(actualX, is(expectedX)); + final int actualY = position.getY(); + final int expectedY = y - 1; + assertThat(actualY, is(expectedY)); + } + @Test + public void 右向きに移動できる() { + position = ice.new Position(x, y); + position.move(map, width, height, B030_IceGame.DIRECTION.RIGHT); + final int actualX = position.getX(); + final int expectedX = x+1; + assertThat(actualX, is(expectedX)); + final int actualY = position.getY(); + final int expectedY = y; + assertThat(actualY, is(expectedY)); + } + @Test + public void 下向きに移動できる() { + position = ice.new Position(x, y); + position.move(map, width, height, B030_IceGame.DIRECTION.DOWN); + final int actualX = position.getX(); + final int expectedX = x; + assertThat(actualX, is(expectedX)); + final int actualY = position.getY(); + final int expectedY = y + 2; + assertThat(actualY, is(expectedY)); + } + @Test + public void 左向きに移動できる() { + position = ice.new Position(x, y); + position.move(map, width, height, B030_IceGame.DIRECTION.LEFT); + final int actualX = position.getX(); + final int expectedX = x-2; + assertThat(actualX, is(expectedX)); + final int actualY = position.getY(); + final int expectedY = y; + assertThat(actualY, is(expectedY)); + } + @Test + public void 移動先が氷の時2マス移動する() { + x=2; + y=4; + position = ice.new Position(x, y); + position.move(map, width, height, B030_IceGame.DIRECTION.UP); + final int actualX = position.getX(); + final int expectedX = x; + assertThat(actualX, is(expectedX)); + final int actualY = position.getY(); + final int expectedY = y-2; + assertThat(actualY, is(expectedY)); + } + @Test + public void 移動先が床の時1マス移動する() { + x=3; + y=4; + position = ice.new Position(x, y); + position.move(map, width, height, B030_IceGame.DIRECTION.UP); + final int actualX = position.getX(); + final int expectedX = x; + assertThat(actualX, is(expectedX)); + final int actualY = position.getY(); + final int expectedY = y-1; + assertThat(actualY, is(expectedY)); + } + @Test + public void 移動先が壁の時移動しない() { + x=3; + y=0; + position = ice.new Position(x, y); + position.move(map, width, height, B030_IceGame.DIRECTION.UP); + final int actualX = position.getX(); + final int expectedX = x; + assertThat(actualX, is(expectedX)); + final int actualY = position.getY(); + final int expectedY = y; + assertThat(actualY, is(expectedY)); + } + +}