[Java] 사다리 게임 (2)

LaStella·2023년 3월 10일

사다리 게임 구현

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문을 사용합니다. 파싱된 두 정수 사람 수와 사다리 높이를 통해 사다리 객체를 생성합니다.
profile
개발자가 되어가는 중...

0개의 댓글