Skip to content

Commit

Permalink
refactor(Rule): print 함수 구현 Rule -> Three로 이동 및 Rule에 location 정보 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
Jong1co committed Apr 27, 2024
1 parent 8f84b35 commit a7350e2
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 118 deletions.
62 changes: 9 additions & 53 deletions src/BusanRule.ts
Original file line number Diff line number Diff line change
@@ -1,59 +1,15 @@
import { ThreeSixNineGame, ThreeSixNineGameImpl } from ".";
import { ClapCounter } from "./ClapCounter";
import { Player } from "./Player";
import { Rule } from "./Rule";

export class BusanRule implements ThreeSixNineGame {
do369(number: number): string {
let clapCount = 0;

for (let num of String(number)) {
if (Number(num) % 3 === 0) clapCount++;
}

return clapCount > 0 ? "clap".repeat(clapCount) : `${number}`;
}

async playGame(players: Player[], clapCounter?: ClapCounter) {
// test를 위해서 100으로 제한해둠
// test가 영향을 안 받게 하기 위해서는 mocking을 해줘야 할 것 같음

try {
for (let index = 0; index < Infinity; index++) {
await this.print(index, players, clapCounter);
}
} catch (e: any) {
console.log(e.message);
}
}

async print(index: number, players: Player[], clapCounter?: ClapCounter) {
const playerLength = players.length;
export class BusanRule implements Rule {
private location = "부산";

const number = index + 1;
const answer = this.do369(number);
getLocation = () => {
return this.location;
};

const player = players[index % playerLength];
const isIncorrectAnswer = this.isTurnOfIncorrectAnswer(player);

if (isIncorrectAnswer) {
const incorrectAnswer = this.getIncorrectAnswer(number);
console.log(`부산 - ${player.name}: ${incorrectAnswer}`);
throw new Error("틀렸습니다! 게임을 종료합니다.");
}

const clapCount = answer.match(/clap/g)?.length || 0;

clapCounter?.addClapCount(clapCount);

console.log(`부산 - ${player.name}: ${answer}`);
}

private isTurnOfIncorrectAnswer(player: Player) {
const random = Math.random();
return player.incorrectAnswerRate > random;
}
do369(number: number): string {
const clapNumberList = String(number).match(/3|6|9+/g);

private getIncorrectAnswer(number: number) {
return number - 1;
return clapNumberList ? "clap".repeat(clapNumberList.length) : `${number}`;
}
}
5 changes: 5 additions & 0 deletions src/Rule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { ThreeSixNineGame } from "./TreeSixNineGame";

export interface Rule extends Pick<ThreeSixNineGame, "do369"> {
getLocation: () => string;
}
61 changes: 9 additions & 52 deletions src/SeoulRule.ts
Original file line number Diff line number Diff line change
@@ -1,57 +1,14 @@
import { ThreeSixNineGame, ThreeSixNineGameImpl } from "./TreeSixNineGame";
import { Player } from "./Player";
import { ClapCounter } from "./ClapCounter";
import { Rule } from "./Rule";

export class SeoulRule implements ThreeSixNineGame {
do369(number: number): string {
for (let num of String(number)) {
if (Number(num) % 3 === 0) return "clap";
}

return `${number}`;
}

async playGame(players: Player[], clapCounter?: ClapCounter) {
// test를 위해서 100으로 제한해둠
// test가 영향을 안 받게 하기 위해서는 mocking을 해줘야 할 것 같음

try {
for (let index = 0; index < Infinity; index++) {
await this.print(index, players, clapCounter);
}
} catch (e: any) {
console.log(e.message);
}
}

async print(index: number, players: Player[], clapCounter?: ClapCounter) {
const playerLength = players.length;

const number = index + 1;
const answer = this.do369(number);
export class SeoulRule implements Rule {
private location = "서울";
getLocation = () => {
return this.location;
};

const player = players[index % playerLength];
const isIncorrectAnswer = this.isTurnOfIncorrectAnswer(player);

if (isIncorrectAnswer) {
const incorrectAnswer = this.getIncorrectAnswer(number);
console.log(`서울 - ${player.name}: ${incorrectAnswer}`);
throw new Error("틀렸습니다! 게임을 종료합니다.");
}

const clapCount = answer.match(/clap/g)?.length || 0;

clapCounter?.addClapCount(clapCount);

console.log(`서울 - ${player.name}: ${answer}`);
}

private isTurnOfIncorrectAnswer(player: Player) {
const random = Math.random();
return player.incorrectAnswerRate > random;
}
do369(number: number): string {
const clapNumberList = String(number).match(/3|6|9+/g);

private getIncorrectAnswer(number: number) {
return number - 1;
return clapNumberList ? "clap" : `${number}`;
}
}
64 changes: 52 additions & 12 deletions src/TreeSixNineGame.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,78 @@
import { BusanRule } from "./BusanRule";
import { ClapCounter, ClapCounterImpl } from "./ClapCounter";
import { Player, PlayerImpl } from "./Player";
import { Rule } from "./Rule";
import { SeoulRule } from "./SeoulRule";
import { Util } from "./Util";

export interface ThreeSixNineGame {
do369: (number: number) => string;
playGame: (players: Player[], clapCounter?: ClapCounter) => void;
playGame: (players: Player[], clapCounter?: ClapCounter) => Promise<void>;
isTurnOfIncorrectAnswer: (plyaer: Player) => boolean;
}

export class ThreeSixNineGameImpl implements ThreeSixNineGame {
rule: ThreeSixNineGame;
rule: Rule;

constructor(rule: ThreeSixNineGame) {
constructor(rule: Rule) {
this.rule = rule;
}

do369(number: number) {
return this.rule.do369(number);
}

async playGame(players: Player[], clapCounter?: ClapCounter | undefined) {
async playGame(players: Player[], clapCounter?: ClapCounter) {
// test를 위해서 100으로 제한해둠
// test가 영향을 안 받게 하기 위해서는 mocking을 해줘야 할 것 같음

try {
await this.rule.playGame(players, clapCounter);
} catch (e) {
console.log(e);
return e;
for (let index = 0; index < Infinity; index++) {
await this.print(index, players, clapCounter);
}
} catch (e: any) {
console.log(e.message);
}
}

async print(index: number, players: Player[], clapCounter?: ClapCounter) {
const playerLength = players.length;

const number = index + 1;
const answer = this.do369(number);

const player = players[index % playerLength];
const isIncorrectAnswer = this.isTurnOfIncorrectAnswer(player);

if (isIncorrectAnswer) {
const incorrectAnswer = this.getIncorrectAnswer(number);
console.log(
`${this.rule.getLocation()} - ${player.name}: ${incorrectAnswer}`
);
throw new Error("틀렸습니다! 게임을 종료합니다.");
}

const clapCount = answer.match(/clap/g)?.length || 0;

clapCounter?.addClapCount(clapCount);

console.log(`서울 - ${player.name}: ${answer}`);
}

isTurnOfIncorrectAnswer(player: Player) {
const random = Util.random();
return player.incorrectAnswerRate >= random;
}

private getIncorrectAnswer(number: number) {
return number - 1;
}
}

const players = [
{ name: "짱구", incorrectAnswerRate: 0.2 }, //
{ name: "훈이", incorrectAnswerRate: 0.3 },
{ name: "맹구", incorrectAnswerRate: 0.25 },
{ name: "짱구", incorrectAnswerRate: 1 }, //
{ name: "훈이", incorrectAnswerRate: 0 },
{ name: "맹구", incorrectAnswerRate: 0 },
{ name: "유리", incorrectAnswerRate: 0.1 },
].map((variable) => new PlayerImpl(variable));

Expand All @@ -43,7 +83,7 @@ const busanRule = new BusanRule();
const seoulGame = new ThreeSixNineGameImpl(seoulRule);
const busanGame = new ThreeSixNineGameImpl(busanRule);

const gameList = [seoulGame, busanGame];
const gameList = [busanGame];

(async () => {
await Promise.all(
Expand Down
3 changes: 2 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { ClapCounter, ClapCounterImpl } from "./ClapCounter";
import { Player, PlayerImpl } from "./Player";
import { Util } from "./Util";

export interface ThreeSixNineGame {
do369: (number: number) => string;
Expand Down Expand Up @@ -61,7 +62,7 @@ export class ThreeSixNineGameImpl implements ThreeSixNineGame {
}

isTurnOfIncorrectAnswer(player: Player) {
const random = Math.random();
const random = Util.random();
return player.incorrectAnswerRate > random;
}

Expand Down

0 comments on commit a7350e2

Please sign in to comment.