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
25 changes: 20 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
# 숫자 야구 게임
## 진행 방법
* 숫자 야구 게임 요구사항을 파악한다.
* 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 과제를 제출한다.
## 구현할 기능 목록

## 과제 제출 과정
* [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse)
* 1-9사이의 숫자중 3개를 뽑아 3자리 수를 정한다.
* 3자리 수를 입력받는다.
* 받은 값이 3자리가 아닌 경우 예외 출력
* 받은 값이 숫자가 아닌 경우 예외 출력
* 받은 값에 중복된 숫자가 있을 시 예외 출력
* 입력값에 따라 힌트를 구분한다.
* 자리와 숫자 둘다 맞춘 경우 => 스트라이크 + 1
* 숫자는 같지만 자리가 다른 경우 => 볼 + 1
* 자리와 숫자 모두 틀린 경우 => 낫싱 (볼과 스트라이크가 모두 0인 상황)
* [예] 상대방(컴퓨터)의 수가 425일 때
* 123을 제시한 경우 : 1 스트라이크,
* 456을 제시한 경우 : 1 스트라이크 1볼,
* 789를 제시한 경우 : 낫싱
* 게임의 승패 유무를 판단한다.
* 3스트라이크인 경우, 게임이 종료된다.
* 3스트라이크가 아니면 3자리 수를 입력받는다.
* 게임 종료가 되면, 다시 게임을 진행할지 완전히 프로그램을 종료할 지를 출력한다.
* 1 입력 시 게임 재시작
* 2 입력 시 프로그램 종료
12 changes: 12 additions & 0 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import controller.BaseBallController;

import java.io.IOException;

public class Application {

public static void main(String[] args) throws IOException {
BaseBallController baseBallController = new BaseBallController();
baseBallController.BaseBallGame();

}
}
46 changes: 46 additions & 0 deletions src/main/java/controller/BaseBallController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package controller;

import domain.Computer;
import domain.Score;
import domain.User;
import service.GameServiceImpl;
import service.GameService;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Objects;

public class BaseBallController {

private static Computer computer;
private static User user;
private static Score score;

private static GameService gameService;

public void BaseBallGame() throws IOException {
computer = new Computer();
user = new User();
score = new Score();
gameService = new GameServiceImpl();
String newGame = "1";
while (Objects.equals(newGame, "1")) {
newGame = BaseBallGameStart();
}

}

public static String BaseBallGameStart() throws IOException {
String nextGame = "0";
gameService.startGame(computer, user, score);
while (!Objects.equals(nextGame, "1") && !Objects.equals(nextGame, "2")){
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하시오.");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
nextGame = (reader.readLine());

}
return nextGame;
}

}
35 changes: 35 additions & 0 deletions src/main/java/domain/Computer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package domain;

import java.util.*;

public class Computer {
private final ArrayList<Integer> numbers;

public Computer(ArrayList<Integer> numbers) {
this.numbers = numbers;
}

public Computer() {
this.numbers = new ArrayList<>();
}

public void reset(){
this.numbers.clear();
Random random = new Random();
random.setSeed(System.currentTimeMillis());

while(this.numbers.size() < 3){
this.computerNumAdd(random.nextInt(9) + 1);
}

}
public ArrayList<Integer> getNumbers() {
return numbers;
}

public void computerNumAdd(int num){
if (!this.numbers.contains(num)){
this.numbers.add(num);
}
}
}
49 changes: 49 additions & 0 deletions src/main/java/domain/Score.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package domain;

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

public Score() {
reset();
}

public void setStrike(Integer strike) {
this.strike = strike;
}

public void setBall(Integer ball) {
this.ball = ball;
}

public Integer getStrike() {
return strike;
}

public Integer getBall() {
return ball;
}

public boolean isFinish(){
return this.strike == 3;
}

public String getScore(){
StringBuilder sb = new StringBuilder();
if (this.ball == 0 && this.strike == 0 ){
return "낫싱";
}
if (this.strike > 0){
sb.append(this.strike).append(" 스트라이크 ");
}
if (this.ball > 0){
sb.append(this.ball).append(" 볼");
}
return sb.toString().trim();
}

public void reset() {
this.strike = 0;
this.ball = 0;
}
}
61 changes: 61 additions & 0 deletions src/main/java/domain/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package domain;

import java.util.ArrayList;


public class User {

private final ArrayList<Integer> numbers;

public ArrayList<Integer> getNumbers() {
return numbers;
}


public User() {
this.numbers = new ArrayList<>();
}

public void reset(){
this.numbers.clear();
}

public void userNumAdd(int num){
if(!this.numbers.contains(num))
{
this.numbers.add(num);
}
}

public void userNumConvert(String userInput){

for (int i = 0; i < userInput.length() ; i++) {
this.userNumAdd(userInput.charAt(i) - '0');
}

if (this.getNumbers().size() != 3) {
this.reset();
throw new IllegalArgumentException("잘못된 입력입니다.");
}

}

public void setNumbers(String num){

if (num.length() != 3 || !isNumeric(num)){
this.reset();
throw new IllegalArgumentException("잘못된 입력입니다.");
}

this.userNumConvert(num);
}

public static boolean isNumeric(String s) {
try {
Integer.parseInt(s);
} catch (NumberFormatException e) {
return false;
}
return !s.contains("0");
}
}
20 changes: 20 additions & 0 deletions src/main/java/service/GameService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package service;

import domain.Computer;
import domain.Score;
import domain.User;

import java.io.IOException;
import java.util.ArrayList;

public interface GameService {
void startGame(Computer computer, User user, Score score) throws IOException;

boolean playGame(Computer computer, User user, Score score) throws IOException;

void userInput(User user) throws IOException;

void compareNumbers(Computer computer, User user, Score score);

void compareNumber(ArrayList<Integer> computerNumbers, Integer userNum, int userIndex, Score score);
}
74 changes: 74 additions & 0 deletions src/main/java/service/GameServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package service;

import domain.Computer;
import domain.Score;
import domain.User;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class GameServiceImpl implements GameService {


@Override
public void startGame(Computer computer, User user, Score score) throws IOException {
computer.reset();
user.reset();
score.reset();
System.out.println(computer.getNumbers());
while (playGame(computer, user, score)) {
user.reset();
score.reset();
}
}

@Override
public boolean playGame(Computer computer, User user, Score score) throws IOException {
while (user.getNumbers().isEmpty()) {
userInput(user);
}
compareNumbers(computer, user, score);
System.out.println(score.getScore());

if (score.isFinish()){
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
return false;
}
return true;
}

@Override
public void userInput(User user) throws IOException {
try {
System.out.print("숫자를 입력해주세요 : ");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String num = reader.readLine();
user.setNumbers(num);
}
catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}

@Override
public void compareNumbers(Computer computer, User user, Score score){
for (int i = 0 ; i < 3 ; i++ ){
compareNumber(computer.getNumbers(), user.getNumbers().get(i), i, score);
}

}

@Override
public void compareNumber(ArrayList<Integer> computerNumbers, Integer userNum, int userIndex, Score score) {
if (computerNumbers.contains(userNum)) {
score.setBall(score.getBall() + 1);
}
if (Objects.equals(computerNumbers.get(userIndex), userNum)) {
score.setBall(score.getBall() - 1);
score.setStrike(score.getStrike() + 1);
}
}

}
Loading