Skip to content
47 changes: 47 additions & 0 deletions src/main/java/baseball/Ball.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package baseball;

import java.util.Objects;

public class Ball {

private final int position, ballNo;

public Ball(int position, int ballNo) {
this.position = position;
this.ballNo = ballNo;
}

public BallStatus play(Ball ball) {

// 1,4 - 2,5 / nothing
// 1,4 - 2,4 / ball
// 1,4 - 1,4 / strike

if (this.equals(ball)) {
return BallStatus.STRIKE;
}

if (ball.matchBallNumber(ballNo)) {
return BallStatus.BALL;
}

return BallStatus.NOTHING;
}

private boolean matchBallNumber(int ballNo) {
return this.ballNo == ballNo;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Ball)) return false;
Ball ball = (Ball) o;
return position == ball.position && ballNo == ball.ballNo;
}

@Override
public int hashCode() {
return Objects.hash(position, ballNo);
}
}
10 changes: 10 additions & 0 deletions src/main/java/baseball/BallStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package baseball;

public enum BallStatus {
BALL, STRIKE, NOTHING;


public boolean isNotNothing() {
return this != NOTHING;
}
}
37 changes: 37 additions & 0 deletions src/main/java/baseball/Balls.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package baseball;

import java.util.ArrayList;
import java.util.List;

public class Balls {

private List<Ball> answers; // 1,2,3

public Balls(List<Integer> answers) {
this.answers = mapBalls(answers);
}

public BallStatus play(Ball userBall) {
return answers.stream()
.map(answer -> answer.play(userBall))
.filter(BallStatus::isNotNothing)
.findFirst()
.orElse(BallStatus.NOTHING);
}

public PlayResult play(List<Integer> balls) {
PlayResult result = new PlayResult();

Balls userBalls = new Balls(balls);

return result;
}

private static List<Ball> mapBalls(List<Integer> answers) {
List<Ball> balls = new ArrayList<>();
for (int i = 0; i < answers.size(); i++) {
balls.add(new Ball(i + 1, answers.get(i)));
}
return balls;
}
}
11 changes: 11 additions & 0 deletions src/main/java/baseball/PlayResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package baseball;

public class PlayResult {
public int getStrikes() {
return 0;
}

public int getBalls() {
return 0;
}
}
33 changes: 33 additions & 0 deletions src/main/java/baseball/ValidationUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package baseball;

import java.util.HashSet;
import java.util.Set;

public class ValidationUtils {

public static final int MIN_VALUE = 0;
public static final int MAX_VALUE = 10;

public static boolean validNo(int no) {
return no > MIN_VALUE && no < MAX_VALUE;
}

public static boolean validNoDuplication(int balls) {

String numbers = String.valueOf(balls);
Set<Character> set = new HashSet<>();
char[] numbersCharArray = numbers.toCharArray();

for (char num : numbersCharArray) {
if (!set.add(num)) {
return false;
}
}

return true;
}

public static boolean validLengthThree(int balls) {
return String.valueOf(balls).length() == 3;
}
}
32 changes: 32 additions & 0 deletions src/main/java/baseballgame/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package baseballgame;

import util.ScannerUtil;

public class InputView {

private final ScannerUtil scanner;

public InputView(ScannerUtil scanner) {
this.scanner = scanner;
}

public String[] input() {
System.out.print("숫자를 입력해 주세요 : ");

final String number = scanner.nextLine();

validateInputLength(number);

return number.split("");
}

private void validateInputLength(final String string) {
if (string.length() != 3) {
throw new RuntimeException("숫자는 반드시 3자리만 입력 해야 합니다.");
}
}

public ScannerUtil getScanner() {
return scanner;
}
}
101 changes: 101 additions & 0 deletions src/main/java/baseballgame/NumberBaseBallGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package baseballgame;

import util.BaseballRandomNumber;
import util.BaseballScanner;
import util.RandomNumberUtil;
import util.ScannerUtil;

public class NumberBaseBallGame {

private final InputView inputView;
private String[] randomNumber;

public NumberBaseBallGame() {
RandomNumberUtil randomNumberCreator = new BaseballRandomNumber();
ScannerUtil scanner = new BaseballScanner();
this.inputView = new InputView(scanner);
randomNumber = randomNumberCreator.createRandomNumber();
}

public void start() {
boolean isCorrect = false;

while (!isCorrect) {
final String[] input = inputView.input();
int strikes = 0, balls = 0;

// 스트라이크 체크
strikes = checkStrikes(input, strikes);

// 볼 체크
balls = checkBalls(input, balls);

if (printBallStrikeCount(strikes, balls)) break;
}
}

private boolean printBallStrikeCount(final int strikes, final int balls) {
if (strikes == 3) {
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임종료");
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
final String s = inputView.getScanner().nextLine();

if (resetOrRestart(s)) return true;
}

if (strikes == 0 && balls == 0) {
System.out.println("낫싱");
}

if (strikes > 0 && balls == 0) {
System.out.println(strikes + "스트라이크");
}

if(strikes == 0 && balls > 0) {
System.out.println(balls + "볼");
}

if (strikes > 0 && balls > 0) {
System.out.println(strikes + "스트라이크 " + balls + " 볼");
}
return false;
}

private boolean resetOrRestart(final String s) {
if (s.equals("1")) {
start();
}

if (s.equals("2")) {
return true;
}
return false;
}

private int checkBalls(final String[] input, int balls) {
for (int i = 0; i < 3; i++) {
if (!randomNumber[i].equals(input[i]) && containsNumbers(randomNumber, input[i])) {
balls++;
}
}
return balls;
}

private int checkStrikes(final String[] input, int strikes) {
for (int i = 0; i < 3; i++) {
if (randomNumber[i].equals(input[i])) {
strikes++;
}
}
return strikes;
}

private boolean containsNumbers(final String[] randomNumber, final String s) {
for (String e : randomNumber) {
if (e.equals(s)) {
return true;
}
}
return false;
}
}
10 changes: 10 additions & 0 deletions src/main/java/baseballgame/TestMain.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package baseballgame;

public class TestMain {

public static void main(String[] args) {
final NumberBaseBallGame game = new NumberBaseBallGame();

game.start();
}
}
48 changes: 48 additions & 0 deletions src/main/java/calculator/StringCalculator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package calculator;

import java.util.Scanner;

public class StringCalculator {

private final Scanner scanner;

public StringCalculator(final Scanner scanner) {
this.scanner = scanner;
}

public String input() {
return scanner.nextLine();
}

public int calculatorResult(String input) {
final String[] split = input.split(" ");
int result = Integer.parseInt(split[0]);
String operator;
for (int i = 1; i < split.length; i = i + 2) { // 1,3,5,7,~~
final int num = Integer.parseInt(split[i + 1]);
operator = split[i];
result = operation(operator, num, result);
}
return result;
}

private int operation(final String operator, final int num, int result) {
switch (operator) {
case "+":
result += num;
break;
case "-":
result -= num;
break;
case "*":
result *= num;
break;
case "/":
result /= num;
break;
default:
throw new IllegalArgumentException("잘못된 연산자입니다.");
}
return result;
}
}
24 changes: 24 additions & 0 deletions src/main/java/util/BaseballRandomNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package util;

import java.util.Random;

public class BaseballRandomNumber implements RandomNumberUtil {
@Override
public String[] createRandomNumber() {
final Random random = new Random();

int first, second, third;

first = random.nextInt(9) + 1;

do {
second = random.nextInt(9) + 1;
} while (first == second);

do {
third = random.nextInt(9) + 1;
} while (first == third || third == second );

return new String[]{String.valueOf(first), String.valueOf(second), String.valueOf(third)};
}
}
10 changes: 10 additions & 0 deletions src/main/java/util/BaseballScanner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package util;

import java.util.Scanner;

public class BaseballScanner implements ScannerUtil {
@Override
public String nextLine() {
return new Scanner(System.in).nextLine();
}
}
6 changes: 6 additions & 0 deletions src/main/java/util/RandomNumberUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package util;

public interface RandomNumberUtil {

String[] createRandomNumber();
}
6 changes: 6 additions & 0 deletions src/main/java/util/ScannerUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package util;

public interface ScannerUtil {

String nextLine();
}
Loading