๐Ÿ“–์šฐํ…Œ์ฝ” 5๊ธฐ ํ”„๋ฆฌ์ฝ”์Šค 4์ฃผ์ฐจ ํšŒ๊ณ 

๊น€์˜์šฐยท2022๋…„ 11์›” 23์ผ
0
post-thumbnail

๐ŸŽฏ ์ฃผ์ œ

์ด๋ฒˆ์ฃผ ์ฃผ์ œ๋Š” ๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ ๊ฒŒ์ž„์ด์—ˆ๋‹ค. ๋‹ค๋ฆฌ ๊ธธ์ด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๋‹ค๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์œ„ ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋‹ค๋ฆฌ ๋๊นŒ์ง€ ๋„๋‹ฌํ•˜๋ฉด ์ข…๋ฃŒ๋˜๋Š” ๊ฒŒ์ž„์ด์—ˆ๋‹ค. ์ž‘๋…„์— ๋ณด์•˜๋˜ ์˜ค์ง•์–ด ๊ฒŒ์ž„์— ๋‚˜์˜จ ๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ์™€ ์œ ์‚ฌํ•œ ๊ฒŒ์ž„์ด๋ผ ๋งŒ๋“ค๋ฉด์„œ๋„ ์ •๋ง ์žฌ๋ฐŒ์—ˆ๋˜ ์ฃผ์ œ์˜€๋‹ค.


๐Ÿ’ช ๋…ธ๋ ฅํ•œ ๋ถ€๋ถ„

โ—์ถ”๊ฐ€์ ์ธ ํ•™์Šต

์ด๋ฒˆ์ฃผ์—๋Š” ๋งŽ์€ ์ œ์•ฝ ์‚ฌํ•ญ๋“ค์ด ๊ฑธ๋ ค์žˆ๋Š” ์ƒํƒœ๋กœ ๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

4์ฃผ์ฐจ ๋ฏธ์…˜ ๊ณต์ง€ ๋ฉ”์ผ ์ค‘ ์ผ๋ถ€์ด๋‹ค. ๋ฉ”์ผ์„ ์ฝ์œผ๋ฉฐ ์ด๋ฒˆ์—” ์ง„์งœ ์ •ํ˜•ํ™”๋œ ํ‹€ ์•ˆ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž ๋‹ค์งํ–ˆ๋‹ค. ํƒ€ ์ฐธ๊ฐ€์ž๋ถ„๋“ค์˜ 3์ฃผ์ฐจ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋ณด๋ฉฐ MVC ํŒจํ„ด์„ ๊ณต๋ถ€ํ•˜๊ณ ์ž ํ–ˆ๊ณ , js์˜ class์— ๋Œ€ํ•œ ๊นŠ์ด์žˆ๋Š” ๊ณต๋ถ€๋„ ์ง„ํ–‰ํ•ด๋ณด๊ณ ์ž ํ–ˆ๋‹ค. ๋‹ค์Œ์€ ํ•™์Šต ๋‚ด์šฉ์„ ๋‹ด์€ ๋งํฌ์ด๋‹ค.


โ—๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

3์ฃผ์ฐจ ํ”ผ๋“œ๋ฐฑ ์‚ฌํ•ญ์— ํฌํ•จ๋œ ๋‚ด์šฉ์ด๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ์„ ๋•Œ 4์ฃผ์ฐจ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ์˜ ๋‚ด๊ฒŒ ๊ฐ€์žฅ ๋ถ€์กฑํ–ˆ๋˜ ๋ถ€๋ถ„์ด ์•„๋‹๊นŒ ์‹ถ๋‹ค. ์ฐธ๊ณ ์šฉ์œผ๋กœ ๋‚จ๊ฒจ์ค€ ๋งํฌ๋ฅผ ๋ณด๋ฉฐ ์ •๋ง ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๊ฐ์ฒด๋Š” ์บก์Šํ™”๋œ ์ƒํƒœ์™€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์–ด ์žˆ๋Š” ํ–‰๋™์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉด์„œ ํ˜‘๋ ฅํ•œ๋‹ค. ๊ฐ์ฒด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ๊ฐ์ฒด ๊ทธ์— ๋”ฐ๋ฅธ ๋กœ์ง(ํ–‰๋™)์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๊ณ , ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐ์ฒด ์Šค์Šค๋กœ ๋‚ด๋ถ€์˜ ์ƒํƒœ๊ฐ’๋„ ๋ณ€๊ฒฝํ•œ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐ์ฒด๊ฐ€ ์Šค์Šค๋กœ ์ผ์„ ํ•˜๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค.

getter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ž์˜ ์ผ๋ถ€์ด๋‹ค. ๋‚˜๋Š” ์ด๋ฒˆ ๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ์œ„ ๋ฌธ๊ตฌ๋ฅผ ๊ณ„์† ์ƒ๊ฐํ•˜๋ฉฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ์ด์ „๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์กŒ๋Š”์ง€ ์‹ค์ œ ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์•Œ์•„๋ณด์ž.


class Lotto {
  #numbers;

  constructor(numbers) {
    this.validate(numbers);
    this.#numbers = numbers;
  }

  validate(numbers) {
    if (numbers.length !== 6) throw new Error(ErrorMsg.INVALID_LOTTO_COUNT);

    if (new Set(numbers).size !== numbers.length)
      throw new Error(ErrorMsg.INVALID_LOTTO_DUPLICATE);

    if (numbers.join("").replace(/[0-9]/g, "").length > 0)
      throw new Error(ErrorMsg.INVALID_LOTTO_NOT_NUM);
  }

  printNumbers() {
    Console.print(`[${this.#numbers.join(", ")}]`);
  }

  getNumbers() {
    return this.#numbers.map((number) => String(number));
  }
}

3์ฃผ์ฐจ์— ์ž‘์„ฑํ–ˆ๋˜ ๋กœ๋˜ ๊ฐ์ฒด์ด๋‹ค. ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด์Šค๋Ÿฝ๊ฒŒ ์“ฐ์ง€ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋กœ๋˜ ๊ฐ์ฒด๋Š” ๊ทธ์ € ๋กœ๋˜ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๊ฑฐ๋‚˜ ์ €์žฅํ•œ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ ๋งŒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.


class BridgeGame {
  #answer;
  #currentPosition;
  #totalTrial;

  constructor(bridge) {
    this.#answer = bridge;
    this.#currentPosition = 0;
    this.#totalTrial = 1;
  }

  move() {
    if (this.#currentPosition < this.#answer.length) this.#currentPosition += 1;
  }

  retry() {
    this.#totalTrial += 1;
    this.#currentPosition = 0;
  }

  get totalTrial() {
    return this.#totalTrial;
  }

  get currentPosition() {
    return this.#currentPosition;
  }

  getCorrectDirection() {
    return this.#answer[this.#currentPosition];
  }

  getIsLastPosition() {
    return this.#currentPosition === this.#answer.length;
  }

  getCrossState(state) {
    if (state === "failed")
      return [
        ...this.#answer.filter((v, i) => i < this.#currentPosition),
        `X${this.#answer[this.#currentPosition]}`,
      ];

    return this.#answer.filter((v, i) => i < this.#currentPosition);
  }
}

4์ฃผ์ฐจ ๋ฏธ์…˜์— ์ž‘์„ฑํ–ˆ๋˜ ๋‹ค๋ฆฌ ๊ฒŒ์ž„ ๊ฐ์ฒด์ด๋‹ค. ์™„๋ฒฝํ•˜์ง„ ์•Š์ง€๋งŒ ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด๋ ค๋Š” ๋…ธ๋ ฅ์„ ํ•œ ๊ฒƒ์ด ๋ณด์ธ๋‹ค. ๋‹ค๋ฆฌ๊ฒŒ์ž„ ๊ฐ์ฒด๋Š” ์ •๋‹ต๋‹ค๋ฆฌ, ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์œ„์น˜, ์ด ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ํ•„๋“œ์— ์ €์žฅํ•œ๋‹ค. move ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ์ด๋™์‹œํ‚ค๊ณ , retry ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒŒ์ž„์„ ์žฌ์‹œ์ž‘ ์‹œํ‚จ๋‹ค. ๋˜ ํ˜„์žฌ๊นŒ์ง€์˜ ๊ฒŒ์ž„ ์ง„ํ–‰์ƒํ™ฉ์„ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’์„ ํ†ตํ•ด ๊ตฌํ•˜๊ณ , getCrossState ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์™ธ๋ถ€๋กœ ๊ทธ ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค.

๋‹จ์ˆœํžˆ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ–ˆ๋˜ ๋กœ๋˜ ๊ฐ์ฒด์™€๋Š” ๋‹ฌ๋ฆฌ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๊ฐ’์„ ์ปจํŠธ๋กค ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๊ณ , ์™ธ๋ถ€์—์„  ๊ฐ’์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ ‘๊ทผ ์—†์ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.


โ—๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI ๋กœ์ง ๋ถ„๋ฆฌํ•˜๊ธฐ

3์ฃผ์ฐจ ํ”ผ๋“œ๋ฐฑ ์‚ฌํ•ญ์— ํฌํ•จ๋œ ๋‚ด์šฉ์ด๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง...? UI ๋กœ์ง...? ์‚ด๋ฉด์„œ ์ฒ˜์Œ ๋“ค์–ด๋ณธ ๋ง์ด์—ˆ๋‹ค. ๋ถ€๋„๋Ÿฝ์ง€๋งŒ ์ด ์š”๊ตฌ ์กฐ๊ฑด์ด ์–ด๋–ค ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ํŒ๋‹จํ•˜๋Š”๋ฐ ๊ฝค ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ๋‚ด๊ฐ€ ํ•ด์„ํ•œ UI ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ตฌ๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

- UI ๋กœ์ง

์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„, ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•˜๋Š” ๋กœ์ง

- ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง

UI ๋กœ์ง ์ด์™ธ์˜ ๋ชจ๋“  ๋กœ์ง

์ด๋ฒˆ์ฃผ ๋ฏธ์…˜์—๋Š” ์ฃผ์–ด์ง„ ๊ฐ์ฒด์™€ ํด๋ž˜์Šค๊ฐ€ ์ •๋ง ๋งŽ์•˜๋‹ค. InputView, OutputView, BridgeGame, BridgeMaker, BridgeRandomNumberGenerator ์ด๋ ‡๊ฒŒ 5๊ฐœ๋‚˜ ์ฃผ์–ด์กŒ๋‹ค. ์ด์ค‘ View๊ฐ€ ๋ถ™์€ ๋‘ ๊ฐ์ฒด๊ฐ€ UI๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋“ค์ด์—ˆ๊ณ , ๋‚˜๋จธ์ง€ ๊ฐ์ฒด๋“ค๊ณผ ํด๋ž˜์Šค๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ–ˆ๋‹ค.


๋‚˜๋Š” UI๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ ์ •๋ง ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ UI๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋กœ์ง์ด๋ผ ์ƒ๊ฐํ•ด์„œ UI ๋กœ์ง๋งŒ ์ž˜ ์ž‘์„ฑํ•˜๋ฉด ๋‚˜๋จธ์ง„ ํŽธํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ ํŒ๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

const InputView = {
  readBridgeSize(callback) {
    this.getUserInput(
      Question.BRIDGE_SIZE,
      callback,
      this.readBridgeSize.bind(this)
    );
  },

  readMoving(callback) {
    this.getUserInput(
      Question.MOVE_DIRECTION,
      callback,
      this.readMoving.bind(this)
    );
  },

  readGameCommand(callback) {
    this.getUserInput(
      Question.RESTART,
      callback,
      this.readGameCommand.bind(this)
    );
  },

  getUserInput(question, callback, redirect) {
    Console.readLine(question, (input) => {
      try {
        callback(input);
      } catch (error) {
        Console.print(error.message);
        redirect(callback);
      }
    });
  },
};

์ด๋ฒˆ์ฃผ ๋ฏธ์…˜์— ์‹ค์ œ๋กœ ์ž‘์„ฑํ–ˆ๋˜ InputView ์ฝ”๋“œ์ด๋‹ค. ์ •๋ง ์ž…๋ ฅ๊ฐ’์„ ๋‹ค๋ฃจ๋Š” ๋ถ€๋ถ„๋งŒ์„ ์ž‘์„ฑํ•˜๊ณ ์ž ๋…ธ๋ ฅํ–ˆ๊ณ , ํ•„์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค.


โ—ํ•„๋“œ ์ˆ˜ ์ค„์ด๊ธฐ

์ด๋ฒˆ์—๋„ ์—ญ์‹œ 3์ฃผ์ฐจ ํ”ผ๋“œ๋ฐฑ์— ํฌํ•จ๋œ ๋‚ด์šฉ์ด๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ ์ •๋ง ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ์—ˆ๊ณ  ๊ทธ ๊ฒฐ๊ณผ ๋‚˜๋ฆ„ ํš๊ธฐ์ (?)์ธ ์•„์ด๋””์–ด๋ฅผ ๋‚ธ ๋ถ€๋ถ„์ด์—ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋ณด์ง€ ๋ชปํ•ด ๋‚ด ์ƒ๊ฐ์ด ์–ผ๋งˆ๋‚˜ ํšจ๊ณผ์ ์ธ์ง€๋Š” ๋น„๊ตํ•ด๋ณด์ง€ ๋ชปํ–ˆ์œผ๋‚˜ ๋‚˜๋ฆ„ ํ˜ผ์ž์„œ๋Š” ๋ฟŒ๋“ฏํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋ผ ๊ณต์œ ํ•˜๊ณ ์ž ํ•œ๋‹ค.

๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฆฌ์˜ ๊ธธ์ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.
3

์ด๋™ํ•  ์นธ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”. (์œ„: U, ์•„๋ž˜: D)
U
[ O ]
[   ]

์ด๋™ํ•  ์นธ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”. (์œ„: U, ์•„๋ž˜: D)
U
[ O | X ]
[   |   ]

๊ฒŒ์ž„์„ ๋‹ค์‹œ ์‹œ๋„ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. (์žฌ์‹œ๋„: R, ์ข…๋ฃŒ: Q)
Q
์ตœ์ข… ๊ฒŒ์ž„ ๊ฒฐ๊ณผ
[ O | X ]
[   |   ]

๊ฒŒ์ž„ ์„ฑ๊ณต ์—ฌ๋ถ€: ์‹คํŒจ
์ด ์‹œ๋„ํ•œ ํšŸ์ˆ˜: 1

๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ ๊ฒŒ์ž„์˜ ์˜ˆ์‹œ์ด๋‹ค. ๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ ๊ฒŒ์ž„์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉํ–ฅ์„ ์„ ํƒํ•˜๋ฉด ๊ทธ์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค. ์ด ๋ฌธ์ž์—ด์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์ง€ ๊ณ ๋ฏผํ–ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๋ฐฐ์—ด์— ์ €์žฅํ•ด ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.
  2. ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ํ™œ์šฉํ•ด ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ์ƒ๊ฐํ•ด๋‚ธ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ •๋‹ต ๋‹ค๋ฆฌ์™€ ์ €์žฅ๋œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐฐ์—ด์„ ๋น„๊ตํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด ๋ฐฉ์‹์ด ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ฌ๋ผ ์ด๋ฅผ ์ ์šฉํ•ด๋ณด๊ณ ์ž ํ–ˆ์ง€๋งŒ ์ด๋ฏธ BridgeGame ํด๋ž˜์Šค์—๋Š” ์„ธ๊ฐœ์˜ ํ•„๋“œ๊ฐ€ ์กด์žฌํ–ˆ์œผ๋ฏ€๋กœ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์€ ์—†์„๊นŒ ๊ณ ๋ฏผํ•ด๋ณด์•˜๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ๋‚ด๊ฐ€ ์ด์•ผ๊ธฐํ•œ ๋‚˜๋ฆ„์˜ ํš๊ธฐ์ (?)์ธ ๋ฐฉ์‹์ด๋‹ค. ๋‚ด BridgeGame์˜ ๋กœ์ง์„ ์ž ๊น ์„ค๋ช…ํ•˜์ž๋ฉด bridge ํ•„๋“œ์— ์ •๋‹ต ๋‹ค๋ฆฌ๋ฅผ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ณ , currentPostion ํ•„๋“œ์— ์‚ฌ์šฉ์ž์˜ ์œ„์น˜ ๊ฐ’์„ ์ˆซ์ž๋กœ ์ €์žฅํ•˜์—ฌ ์ด๋ฅผ ์ธ๋ฑ์Šค์ฒ˜๋Ÿผ ํ™œ์šฉํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋ฌธ์ž์—ด์˜ ์ƒ์„ฑ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์กฐ๊ฑด

  • ํ˜„์žฌ ์œ„์น˜๊นŒ์ง€์˜ ์ •๋‹ต ๋ฐฐ์—ด๋งŒ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋‹ต์„ ๋งž์ท„๋Š”์ง€, ํ‹€๋ ธ๋Š”์ง€์— ๋”ฐ๋ผ ๋ฌธ์ž์—ด์˜ ํ˜•ํƒœ๊ฐ€ ๋ฐ”๋€๋‹ค.
  • ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž๋Š” 'O', 'X', ' '(๊ณต๋ฐฑ) ๋ฟ์ด๋‹ค.

๋ฐฉ๋ฒ•

  1. ์ •๋‹ต ๋ฐฐ์—ด์„ ์‹œ์ž‘๋ถ€๋ถ„์—์„œ ํ˜„์žฌ ์œ„์น˜๊นŒ์ง€๋กœ ์ž๋ฅธ๋‹ค.

  2. ์œ— ๋ฌธ์ž์—ด(Up), ์•„๋žซ ๋ฌธ์ž์—ด(Down)์„ ์ƒ์„ฑํ•  ๋‘ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.

  3. ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋‹ต์„ ๋งž์ท„๋Š”์ง€, ํ‹€๋ ธ๋Š”์ง€ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

  4. ๋งž์ท„๋‹ค๋ฉด ์ž˜๋ฆฐ ์ •๋‹ต ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ‹€๋ ธ๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ์š”์†Œ์— X๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    • ex) ๋ฐ˜ํ™˜ ๋ฐฐ์—ด ์˜ˆ์‹œ
      ๋งž์ท„์„ ๋•Œ: ["U", "D", "U"]
      ํ‹€๋ ธ์„ ๋•Œ: ["U", "D", "XU"]
  5. ์ž…๋ ฅ ๋ฐ›์€ ์ž˜๋ฆฐ ์ •๋‹ต ๋ฐฐ์—ด์„ ์ด์šฉํ•ด Up, Down์„ ์ฑ„์šด๋‹ค.

    • ex) ๋งž์ท„์„ ๋•Œ
      ์ž˜๋ฆฐ ์ •๋‹ต ๋ฐฐ์—ด: ["U", "D", "U"]
      Up: [" O ", " ", " O "]
      Down: [" ", " O ", " "]

    -> U๋ฉด Up์— " O ", Down์— " "
    -> D๋ฉด Up์— " ", Down์— " O "

    • ex) ํ‹€๋ ธ์„ ๋•Œ
      ์ž˜๋ฆฐ ์ •๋‹ต ๋ฐฐ์—ด: ["U", "D", "XU"]
      Up: [" O ", " ", " "]
      Down: [" ", " O ", " X "]

    -> XU๋ฉด Up์— " ", Down์— " X "
    -> XD๋ฉด Up์— " X ", Down์— " "

  6. join ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ Up, Down์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ” ์ถœ๋ ฅํ•œ๋‹ค.

์œ„ ๊ณผ์ •์„ ๊ฑฐ์น  ๋•Œ ์ •๋‹ต ๋ฐฐ์—ด์„ ์ž˜๋ผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ถ€๋ถ„๊นŒ์ง€๋ฅผ BridgeGame์ด, ์ดํ›„ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ถ€๋ถ„์„ OutputView๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์ถ”๊ฐ€์ ์ธ ํ•„๋“œ ์—†์ด ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•ด๋ƒˆ๋‹ค.

์œ„ ๋‚ด์šฉ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ถ”๊ฐ€์ ์ธ ๋ถ€๋ถ„์€ ์šฐํ…Œ์ฝ” 5๊ธฐ ํ”„๋ฆฌ์ฝ”์Šค 4์ฃผ์ฐจ ๋ฏธ์…˜ MVC ์ ์šฉ๊ธฐ์— ์ž์„ธํžˆ ์ ์–ด๋†“์•˜์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค.


์ „์ฒด ์ฝ”๋“œ๋Š” https://github.com/kyw0716/javascript-bridge์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
๋ถˆํŽธํ•œ ์ผ๋“ค์„ ๊ฐœ๋ฐœ๋กœ ํ’€์–ด๋‚ด๊ณ  ์‹ถ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€