Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,12 @@

## 과제 제출 과정
* [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse)

## 구현할 기능
* 랜덤 숫자 생성
* 길이는 3, 중복 X
* 숫자 입력 후 랜덤 숫자와 비교
* 숫자와 위치가 같으면 스트라이크
* 수자는 같은데 위치가 다르면 볼
* 모두 맞으면 게임 종료
* 각 게임이 끝나면 다시하기 s가능
10 changes: 10 additions & 0 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import game.Game;

public class Main {
public static void main(String[] args){
Game game = new Game();
do {
game.start();
} while (game.checkGameAgain());
}
}
47 changes: 47 additions & 0 deletions src/main/java/console/Console.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package console;

import game.Score;

import java.util.ArrayList;
import java.util.Scanner;

public class Console {

private static final String ASK_GAME_AGAIN = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.";
private static final String INPUT_NUMBER = "숫자를 입력해주세요 : ";
private static final String GAME_END = "3개의 숫자를 모두 맞히셨습니다! 게임 종료";
private final Scanner scanner;

public Console() {
this.scanner = new Scanner(System.in);
}

public int getGameMenu(){
System.out.println(ASK_GAME_AGAIN);
return scanner.nextInt();
}

public ArrayList<Integer> getPlayerAnswer(){
System.out.println(INPUT_NUMBER);
ArrayList<Integer> playerAnswer = new ArrayList<>();
String input = scanner.next();
String[] splitNumber = input.split("");
for(int idx = 0; idx < 3; idx++){
playerAnswer.add(Integer.parseInt(splitNumber[idx]));
}
return playerAnswer;
}

public void printScore(Score score){
if (score.getStrike() != 0)
System.out.println(String.format("%d 스트라이크", score.getStrike()));
if (score.getBall() != 0)
System.out.println(String.format("%d 볼", score.getBall()));
if (score.getStrike() == 0 && score.getBall() == 0)
System.out.println("낫싱");
}

public void printGameEnd(){
System.out.println(GAME_END);
}
}
16 changes: 16 additions & 0 deletions src/main/java/console/Menu.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package console;

public enum Menu {
DO_GAME(1),
EXIT_GAME(2);

private final int menuNumber;

Menu(int menuNumber) {
this.menuNumber = menuNumber;
}

public static boolean isDoGame(int menuNumber) {
return DO_GAME.menuNumber == menuNumber;
}
}
70 changes: 70 additions & 0 deletions src/main/java/game/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package game;


import console.Console;
import console.Menu;

import java.util.ArrayList;
import java.util.Collections;

public class Game {

private final Console console;
private ArrayList<Integer> answer;

public Game() {
this.console = new Console();
answer = new ArrayList<>(3);
}

public void start(){
makeRandomNumber();
while(true) {
ArrayList<Integer> playerAnswer = console.getPlayerAnswer();
Score score = new Score(0, 0);
setScore(playerAnswer, score);
console.printScore(score);
if (score.getStrike() == 3)
break;
}
console.printGameEnd();
}

private void setScore(ArrayList<Integer> playerAnswer, Score score) {
setStrikeCount(playerAnswer, score);
for (int idx = 0; idx < 3; idx++) {
setBallCount(playerAnswer, score, idx);
}
}

private void setBallCount(ArrayList<Integer> playerAnswer, Score score, int idx){
for (int compIdx = 0; compIdx < 3; compIdx++){
if (compIdx != idx && answer.get(compIdx) == playerAnswer.get(idx))
score.plusBall();
}
}

private void setStrikeCount(ArrayList<Integer> playerAnswer, Score score){
for (int idx = 0; idx < 3; idx++){
if (answer.get(idx) == playerAnswer.get(idx)) {
score.plusStrike();
}
}
}

private void makeRandomNumber() {
answer.clear();
ArrayList<Integer> numbers = new ArrayList<>();
for (int i = 1; i <= 9; i++) {
numbers.add(i);
}
Collections.shuffle(numbers);
for (int idx = 0; idx < 3; idx++) {
answer.add(numbers.get(idx));
}
}

public boolean checkGameAgain(){
return Menu.isDoGame(console.getGameMenu());
}
}
27 changes: 27 additions & 0 deletions src/main/java/game/Score.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package game;

public class Score {
private int ball;
private int strike;

public Score(int ball, int strike) {
this.ball = ball;
this.strike = strike;
}

public int getBall() {
return ball;
}

public void plusBall() {
this.ball++;
}

public int getStrike() {
return strike;
}

public void plusStrike() {
this.strike++;
}
}
42 changes: 42 additions & 0 deletions src/test/java/game/GameTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package game;

import org.junit.jupiter.api.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

import static org.assertj.core.api.Assertions.assertThat;

public class GameTest {

Game game = new Game();

@Test
void testRandomNumberSizeIs3() throws Exception {
Method method = Game.class.getDeclaredMethod("makeRandomNumber");
method.setAccessible(true);
Field field = Game.class.getDeclaredField("answer");
field.setAccessible(true);

ArrayList<Integer> array = (ArrayList<Integer>)field.get(game);
method.invoke(game);
assertThat(array.size()).isEqualTo(3);
}

@Test
void testRandomNumberIsNotDuplicated() throws Exception {
Method method = Game.class.getDeclaredMethod("makeRandomNumber");
method.setAccessible(true);
Field field = Game.class.getDeclaredField("answer");
field.setAccessible(true);

ArrayList<Integer> array = (ArrayList<Integer>)field.get(game);
method.invoke(game);

Set<Integer> set = new HashSet<>(array);
assertThat(set.size()).isEqualTo(array.size());
}
}
13 changes: 0 additions & 13 deletions src/test/java/study/StringTest.java

This file was deleted.