소스 : java ¶
public class BaseBallTest extends TestCase{ Beholder beholder; Extractor extractor; BaseBall baseBall; public void setUp() { beholder= new Beholder(); extractor= new Extractor(); baseBall= new BaseBall(beholder, extractor); } public void testStrikeCount() { beholder.setAnswer("111"); assertEquals(0, beholder.getStrikeCount("000")); assertEquals(1, beholder.getStrikeCount("001")); assertEquals(2, beholder.getStrikeCount("110")); } public void testBallCount() { beholder.setAnswer("123"); assertEquals(0, beholder.getBallCount("000")); assertEquals(1, beholder.getBallCount("102")); assertEquals(2, beholder.getBallCount("321")); assertEquals(3, beholder.getBallCount("231")); } public void testNumberCreation() { for(int i=0;i<100;i++) { String number= extractor.getRandomBall(); assertEquals(3, number.length()); assertFalse(baseBall.duplicated(number)); } } public void testDuplicated() { assertTrue(baseBall.duplicated("101")); assertTrue(baseBall.duplicated("122")); assertFalse(baseBall.duplicated("123")); } public void testGamePlay() { BaseBall game= new BaseBall(beholder, extractor); beholder.setAnswer("123"); game.inputNumber("152"); assertFalse(game.isGameOver()); assertEquals(1, game.getStrike()); assertEquals(1, game.getBall()); game.inputNumber("123"); assertTrue(game.isGameOver()); } }
public class GameMain { public static void main(String[] args) { BaseBall baseBall= new BaseBall(new Beholder(), new Extractor()); Scanner input= new Scanner(System.in); System.out.println("baseball game"); while(!baseBall.isGameOver()) { String number= input.nextLine(); if(baseBall.isProper(number)) { baseBall.inputNumber(number); } else { System.out.println("what are you doing?"); System.exit(0); } System.out.print(baseBall.getStrike() + " strike, "); System.out.println(baseBall.getBall() + "ball"); } System.out.println("good"); } }
public class BaseBall { String playerInput; private Beholder beholder; private Extractor extractor; private String number; public BaseBall(Beholder beholder, Extractor extractor) { number= "000"; this.beholder= beholder; this.extractor= extractor; beholder.setAnswer(this.extractor.getRandomBall()); } public boolean isGameOver() { return getStrike()==3; } public void inputNumber(String string) { number= string; } public int getStrike() { return beholder.getStrikeCount(number); } public int getBall() { return beholder.getBallCount(number); } public boolean isProper(String number) { try { Integer.parseInt(number); } catch(Exception e) { return false; } return number.length()==3 && !duplicated(number); } public boolean duplicated(String number) { char[] chars= number.toCharArray(); return chars[0]== chars[1] || chars[0]== chars[2] || chars[1]== chars[2]; } }
public class Beholder { char[] numbers; public void setAnswer(String string) { numbers= string.toCharArray(); } public int getStrikeCount(String string) { char[] inputChars= string.toCharArray(); int count= 0; for(int i=0;i<numbers.length;i++) { count += numbers[i]==inputChars[i]? 1:0; } return count; } public int getBallCount(String string) { int count= 0; for(char c : numbers) { if(string.contains(String.valueOf(c))) count++; } return count - getStrikeCount(string); } }
public class Extractor { Vector<String> numbers= new Vector<String>(); public String getRandomBall() { initNumbers(); String number= ""; for(int i=0;i<3;i++) { int index= (int)(Math.random()*numbers.size()); number+= numbers.elementAt(index); numbers.removeElementAt(index); } return number; } private void initNumbers() { numbers.clear(); for(int i=0;i<10;i++) { numbers.add(String.valueOf(i)); } } }
리펙토링 ¶
추출기 - 매직 넘버와 공갯수 조절 가능하게
public class Extractor { Set<String> numbers= new LinkedHashSet<String>(); public String getRandomBall(int nBall) { while(numbers.size()<ballLimit(nBall)) { numbers.add(getRandom(ballLimit(nBall))); } return getOneWord(numbers); } private int ballLimit(int nBall) { return nBall>numberLimit()? numberLimit() : nBall; } public int numberLimit() { return 10; } private String getOneWord(Set<String> set) { String result= ""; for(String num : set) { result += num; } return result; } private String getRandom(int range) { return String.valueOf((int)(Math.random()*range)); } }
잡담 ¶
if문과 이중for 루프를 돌지 않으려고 발버둥쳤다;
벡터를 이용해 번호를 뽑는 것은 효율적인것 같진 않지만, 새로운 시도라서 신선했다
----
JTDStudy JTDStudy/첫번째과제
벡터를 이용해 번호를 뽑는 것은 효율적인것 같진 않지만, 새로운 시도라서 신선했다