사다리 게임 구현
Main.java
public class Main {
public static void main(String[] args) {
Console console = new Console();
RandomLadderGenerator generator = new RandomLadderGenerator();
new LadderGame(console, generator).run();
}
}
- 사다리를 랜덤하게 생성해주는 제네레이터와 입/출력 관리를 하는 콘솔을 파라미터로 새로운 사다리게임을 만들어 실행합니다.
RandomLadderGenerator.java
import java.util.Random;
public class RandomLadderGenerator {
private final Random random = new Random();
public Ladder generate(int sizeOfPeople, int sizeOfLadder) {
boolean[][] ladder = new boolean[sizeOfLadder][sizeOfPeople];
for (int row = 0; row < sizeOfLadder; row++) {
for (int col = 0; col < sizeOfPeople-1; col++) {
ladder[row][col] = random.nextBoolean();
}
}
return new Ladder(ladder);
}
}
- 사다리의 라인을 랜덤으로 생성하는 클래스입니다.
- 2차 boolean배열을 사용하여 라인이 있는 경우에만 true가 저장됩니다.
Ladder.java
public class Ladder {
private final boolean[][] ladder;
public Ladder(boolean[][] ladder) {
this.ladder = ladder;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (int row = 0; row < ladder.length; row++) {
for (int col = 0; col < ladder[0].length-1; col++) {
if (ladder[row][col]) {
sb.append("|-");
continue;
}
sb.append("| ");
}
sb.append("|\n");
}
return String.valueOf(sb);
}
}
- 2차 boolean배열을 속성으로 가지는 사다리 객체입니다.
- 사다리를 출력하는 toString을 오버라이딩하여 라인이 있는 곳은 "
-" 없는 곳은 " "이 출력됩니다.
- 라인은 사다리열을 기준으로 오른쪽으로 출력됩니다.
- 따라서 마지막열에는 라인이 존재하지 않습니다.
Console.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Console {
private final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public String input(String prompt) throws IOException {
System.out.println(prompt);
return br.readLine();
}
public void inputError() {
System.out.println("입력이 잘못되었습니다.");
}
}
- 입/출력을 관리하는 Console클래스입니다.
- input메소드는 입력문구를 출력하고 입력을 받아 이를 반환하는 메소드입니다.
- inputError메소드는 잘못된 입력을 알리는 에러메세지를 출력하는 메소드입니다.
LadderGame.java
import java.io.IOException;
public class LadderGame implements Runnable {
private final int MIN_SIZE_OF_PEOPLE = 2;
private final int MIN_SIZE_OF_LADDER = 1;
private final Console console;
private final RandomLadderGenerator generator;
public LadderGame(Console console, RandomLadderGenerator generator) {
this.console = console;
this.generator = generator;
}
@Override
public void run() {
int sizeOfPeople, sizeOfLadder;
while (true) {
try {
String inputString = console.input("참여할 사람은 몇 명인가요?");
sizeOfPeople = parse(inputString, MIN_SIZE_OF_PEOPLE);
inputString = console.input("최대 사다리 높이는 몇 개인가요?");
sizeOfLadder = parse(inputString, MIN_SIZE_OF_LADDER);
break;
} catch (IOException | NumberFormatException e) {
console.inputError();
}
}
Ladder ladder = generator.generate(sizeOfPeople,sizeOfLadder);
System.out.println(ladder);
}
private int parse(String inputString, int limit) throws IOException {
int result = Integer.parseInt(inputString);
if (result < limit) {
throw new IOException();
}
return result;
}
}
- 사다리 게임은 입/출력을 관리하는 Console과 사다리를 랜덤으로 생성해주는 Generator을 속성으로 가집니다.
- 사람 수와 사다리의 높이를 입력받아 이를 Integer형으로 파싱하는 메소드를 가집니다.
- 입력에서 에러 발생 시(미입력:IOException, 숫자이외의 다른문자 입력:NumberFOrmatException) 입력에러 문구를 출력합니다.
- 잘못된 입력 이후 다시 입력을 받도록 while문을 사용합니다. 파싱된 두 정수 사람 수와 사다리 높이를 통해 사다리 객체를 생성합니다.