Skip to content

숫자 야구 게임 pr #171

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
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