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
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# 숫자 야구 게임

### *기능 요구사항*
* 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이라는 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
* 예) 상대방(컴퓨터)의 수가 425일 때,
* 123을 제시한 경우 : 1스트라이크
* 456을 제시한 경우 : 1스트라이크 1볼
* 789를 제시한 경우 : 낫싱

* 위 숫자 야구게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
* 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
* 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
### *구현할 기능*
#### Computer
- 1-9로 이루어진 세 난수 생성
- 세 난수의 중복 검사
#### User
* 3자리수 입력
* 입력한 수의 유효성 검사(중복이 있는지, 숫자로 구성되어 있는지, 0이 존재하는지)
* 재시작할지 선택
#### BaseballGame
* User가 입력한 값과 Computer가 생성한 값을 비교하여 스트라이크 개수 반환
* User가 입력한 값과 Computer가 생성한 값을 비교하여 볼 개수 반환
* 결과 출력 (스트라이크, 볼의 개수 또는 낫싱)
* 게임 종료 (스트라이크 개수가 3개인 경우 유저에게 재시작 여부 묻기)
#### MainApp
* 게임 시작
80 changes: 80 additions & 0 deletions src/main/BaseballGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package main;

import java.util.ArrayList;

public class BaseballGame {

private static final int INPUT_SIZE = 3;

private Computer computer;
private User user;

private boolean start = true;

private ArrayList<Integer> computerNum;
private ArrayList<Integer> userNum;

public BaseballGame() {
computer = new Computer();
user = new User();
}

/* 사용자에게 수를 입력받고, 컴퓨터는 난수 생성 */
public void run() {
computer.createRandomNum();

while (start) {
user.inputNumber();
compare();
}
}

/* 숫자 비교하여 스트라이크, 볼 체크 */
public void compare() {
int strike = 0;
int ball = 0;

computerNum = computer.getRandomNum();
userNum = user.getNum();

/* 스트라이크 개수 체크 */
for (int i = 0; i < INPUT_SIZE; i++) {
if (computerNum.get(i).equals(userNum.get(i))) {
strike += 1;
}
}

/* 볼 개수 체크 */
for (int i = 0; i < INPUT_SIZE; i++) {
if (computerNum.contains(userNum.get(i)) && computerNum.get(i) != userNum.get(i)) {
ball += 1;
}
}

/* 결과 출력 */
result(strike, ball);

/* 정답일 경우 유저에게 재시작 여부 묻기 */
if(strike == 3) {
restart();
}
}

/* 결과 출력 */
public void result(int strike, int ball) {
if (strike <= 0 && ball <= 0) {
System.out.println("Nothing");
} else {
System.out.println("strike: " + strike + " ball: " + ball);
}
}

public void restart() {
if(user.restart()) {
start = true;
computer.createRandomNum();
}else {
start = false;
}
}
}
34 changes: 34 additions & 0 deletions src/main/Computer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package main;

import java.util.ArrayList;

public class Computer {

private static final int BALL_SIZE = 3;

private ArrayList<Integer> randomNum; //랜덤숫자를 담을 리스트

/* 난수 생성 */
public ArrayList<Integer> createRandomNum() {
randomNum = new ArrayList<>();

while(randomNum.size() < BALL_SIZE) {
int num = (int)(Math.random() * 9 + 1);

if(!isDifferent(num)) {
randomNum.add(num);
}
}
return randomNum;
}

/* 중복 확인 */
public boolean isDifferent(int num) {
return randomNum.contains(num);
}

/* getter */
public ArrayList<Integer> getRandomNum() {
return randomNum;
}
}
16 changes: 16 additions & 0 deletions src/main/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* MainApp
*
* 2019-12-19
*
*/

package main;

public class Main {

public static void main(String[] args) {
BaseballGame game = new BaseballGame();
game.run();
}
}
89 changes: 89 additions & 0 deletions src/main/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package main;

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

public class User {

private static final int INPUT_SIZE = 3;

private ArrayList<Integer> inputNum;

Scanner sc;

/* 유저로부터 숫자 입력받기 */
public void inputNumber() {
String input;

inputNum = new ArrayList<>();
sc = new Scanner(System.in);

while (true) {
System.out.print("숫자를 입력해 주세요 : ");
input = sc.next();

if (isInteger(input) && checkInputLen(input) && isDifferent(input)) {
changeInput(input);
break;
}
}
}

/* 유저가 입력한 값이 숫자(1-9)인지 체크 */
public boolean isInteger(String input) {
char tmp;

for (int i = 0; i < input.length(); i++) {
tmp = input.charAt(i);

if (!('1' <= tmp && tmp <= '9')) {
return false;
}
}
return true;
}

/* 유저가 입력한 값이 3글자인지 체크 */
public boolean checkInputLen(String input) {
return input.length() == INPUT_SIZE;
}

/* 유저가 입력한 값이 다 다른지 체크 */
public boolean isDifferent(String input) {

if (input.charAt(0) == input.charAt(1) || input.charAt(0) == input.charAt(2)
|| input.charAt(1) == input.charAt(2)) {
return false;
}
return true;
}

/* 유저가 입력한 값(String)을 int로 변환해서 리스트에 삽입 */
public void changeInput(String input) {
for (int i = 0; i < INPUT_SIZE; i++) {
char c = input.charAt(i);
int value = (int)c - 48;
inputNum.add(value);
}
}

/* getter */
public ArrayList<Integer> getNum() {
return inputNum;
}

/* 재시작할건지 선택 */
public boolean restart() {
while(true) {
System.out.print("재시작하려면 1, 종료하려면 2 입력 : ");
int choice = sc.nextInt();
if(choice == 1) {
return true;
}
else {
sc.close();
return false;
}
}
}
}
File renamed without changes.
File renamed without changes.