Skip to content
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

[전남대 BE_정우재] 미션 제출합니다. #154

Open
wants to merge 16 commits into
base: main
Choose a base branch
from
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
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,12 @@
# java-baseball-precourse
# java-baseball-precourse

구현할 기능

- 사용자에게 값을 입력받는 기능
- 사용자가 맞출 3자리 숫자를 생성하는 기능
- 사용자의 입력값이 중복되지 않은 값인지 판단하는 기능.
- 사용자의 잘못된 입력값에 대해 IllegalArgumentException을 처리하는 기능
- 볼의 갯수를 판단하는 기능
- 스트라이크의 갯수를 판단하는 기능
- 사용자의 입력값이 답을 맞췄는지 확인하는 기능
- 사용자가 답을 맞춘 후에 계속해서 겜을 다시할지 겜을 종료할지 선택을 받고 처리하는 기능
12 changes: 12 additions & 0 deletions src/main/java/Applicaiton.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
public class Applicaiton {
public static void main(String[] args) {
while(true) {
boolean again; //사용자가 답을 맞춘뒤에 다시 게임을 할지 안할지 여부를 저장하는 변수
again = Baseball.play();
if(again) //계속하고자 하면 다시 continue 진행
continue;
else //그만하고자 하면 application 종료
break;
}
}
}
44 changes: 44 additions & 0 deletions src/main/java/Baseball.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
public class Baseball {
//야구 게임 전반적인 흐름을 처리
public static boolean play(){
Util myutil = new Util();
Input input = new Input();
GenerateAnswer answer = new GenerateAnswer();

int gameAnswer = answer.generateAnswer(); //숫자 3자리를 생산해냄
System.out.println(gameAnswer);
int userInput; //사용자의 입력을 받는 변수

while (true) {
try {
userInput = input.getInput(); //사용자의 입력값을 받음.
} catch (IllegalArgumentException e){ //예외 발생시 잘못됐음을 출력하고 게임 종료
System.out.println(e.getMessage());
return false;
}

boolean result; //사용자가 답을 맞췄는지 여부를 담는 변수

result = myutil.process(userInput, gameAnswer);
if (result){ //답을 맞춘 경우에는 현재 게임 종료
break;
}
else {
continue;
}//그렇지 않은 경우는 답을 맞추기 위해서 다시 시도
}

//답을 맞추고 게임이 종료된 시점
GameAgain game = new GameAgain();
boolean again; //게임을 더 진행할지 여부를 담는 변수

try {
again = game.gameAgain(); //게임을 추가적으로 진행할지 여부를 받음.
} catch (IllegalArgumentException e){ //예외 발생시 잘못됐음을 출력하고 false를 던져 게임 종료
System.out.println(e.getMessage());
return false;
}

return again;
}
}
24 changes: 24 additions & 0 deletions src/main/java/GameAgain.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import java.util.Scanner;

public class GameAgain {
public boolean gameAgain() throws IllegalArgumentException{ //게임을 또 할지 여쭤보고 그 결과를 알려주는 함수
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
int input;
Scanner scan = new Scanner(System.in);

try { //사용자의 입력이 올바르지 않으면 IllegalArgumentException 던짐
input = scan.nextInt();
}catch(Exception e){
throw new IllegalArgumentException("잘못된 값을 입력하였습니다");
}

switch (input){
case 1 :
return true;
case 2:
return false;
default: //1과 2이외의 값이 입력되는 경우 예외 던짐
throw new IllegalArgumentException("잘못된 값을 입력하였습니다");
}
}
}
31 changes: 31 additions & 0 deletions src/main/java/GenerateAnswer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import java.util.Random;

public class GenerateAnswer {
public int generateAnswer(){ // 숫자 3자리를 만들어내는 함수
Random random =new Random();
int [] Answer = new int[3]; // 사용자가 맞춰야 하는 정답을 담는 int 배열
int temp;
Answer[0]=random.nextInt(8)+1; //첫 번째 숫자 생성

while(true) { //두번째 숫자는 1번째 숫자와 다른 값이 오게끔
temp = random.nextInt(8)+1;
if (Answer[0] == temp)
continue;
else
break;
}
Answer[1] = temp;

while(true) { //세번째 숫자는 1,2번째 숫자와 다른 값이 오게끔
temp = random.nextInt(8)+1;
if (Answer[0] == temp || Answer[1] == temp)
continue;
else
break;
}
Answer[2] = temp;

String str = ""+Answer[0]+Answer[1]+Answer[2]; //
return Integer.parseInt(str);
}
}
39 changes: 39 additions & 0 deletions src/main/java/Input.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import java.util.Scanner;

public class Input {
public int getInput() throws IllegalArgumentException{ //사용자의 입력을 받는 함수
System.out.println("숫자를 입력해 주세요");
int input;
Scanner scan = new Scanner(System.in);

try { //사용자의 입력이 올바르지 않으면 IllegalArgumentException 던짐
input = scan.nextInt();
}catch(Exception e){
throw new IllegalArgumentException("잘못된 값을 입력하였습니다");
}

boolean isOK = isValid(input); //사용자의 입력이 중복되지 않은 숫자들로 이루어져 있는지 판단
if (isOK)
return input;
else
throw new IllegalArgumentException("잘못된 값을 입력하였습니다"); //그렇지 않으면 IllegalArgumentException 던지기
}

public boolean isValid(int input){ // 사용자의 입력이 중복되지 않은 숫자들인지 판단하는 함수
String str = Integer.toString(input);
if(str.length() != 3)
return false;
int[] arr = new int[3];
arr[0] =Character.getNumericValue(str.charAt(0));
arr[1] =Character.getNumericValue(str.charAt(1));
arr[2] =Character.getNumericValue(str.charAt(2));

if (arr[0]== 0 || arr[1] == 0 || arr[2] ==0) //입력값중에 0이 있는 경우는 정상이 아님.
return false;

if (arr[0] != arr[1] && arr[0] != arr[2] && arr[1] != arr[2]) //세 숫자가 모두 다른 경우는 정상
return true;
else
return false;
}
}
69 changes: 69 additions & 0 deletions src/main/java/Util.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import java.util.Random;
import java.util.Scanner;

public class Util {
public boolean process(int userInput, int gameAnswer) { //입력값과 답을 비교하여 결과를 출력하는 함수
int[] input = new int[3]; //볼과 스트라이크 계산을 위해 userInput을 크기가 3인 배열에 대입.
input[0] = userInput / 100;
input[1] = userInput / 10 - input[0] * 10;
input[2] = userInput % 10;

int[] answer = new int[3]; //볼과 스트라이크 계산을 위해 gameAnswer을 크기가 3인 배열에 대입.
answer[0] = gameAnswer / 100;
answer[1] = gameAnswer / 10 - answer[0] * 10;
answer[2] = gameAnswer % 10;

int strike; //스트라이크의 갯수를 담는 변수
int ball; //볼의 갯수를 담는 변수

strike = countStrike(input, answer);
ball = countBall(input, answer);
ball = ball - strike; // 볼의 갯수는 앞에서 구한 볼의 갯수에서 strike를 빼줘야 함.

if (strike + ball == 0) { //볼과 스트라이크의 갯수가0인 경우에는 낫싱
System.out.println("낫싱");
return false;
} else {
switch (ball) {
case 0:
break;
default: //볼이 있는 경우 볼 출력
System.out.print(ball + "볼 ");
break;

}
switch (strike) {
case 0:
System.out.println();
return false;
case 1:
case 2:
System.out.println(strike + "스트라이크");
return false;
default:
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
return true;
}
}
}

public int countStrike(int[] input, int[] answer){ //strike의 갯수를 구하는 함수
int cnt = 0;

for(int i = 0; i< input.length; i++){
if(input[i]==answer[i])
cnt++;
}

return cnt;
}

public int countBall(int[] input, int[] answer){ //ball의 갯수를 구하는 함수
int cnt = 0;
for(int i = 0; i< input.length; i++){
if(input[i]==answer[0] || input[i] == answer[1] || input[i] == answer[2])
cnt++;
}
return cnt;
}
}
43 changes: 43 additions & 0 deletions src/test/java/GameAgainTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
//
class GameAgainTest {
InputStream sysInBackup;
@BeforeEach
void setUp() {
sysInBackup = System.in;
}

@AfterEach
void tearDown() {
System.setIn(sysInBackup);
}

void sysIn(String input) {
System.setIn(new ByteArrayInputStream(input.getBytes()));
}
@Test
void gameAgain() {
String [] success = {"1","2"};
String[] fails = {"3","4", "ㄱㄴㄷ"};
GameAgain gameAgain = new GameAgain();

sysIn(success[0]);
assertThat(gameAgain.gameAgain()).isTrue();

sysIn(success[1]);
assertThat(gameAgain.gameAgain()).isFalse();

for(int i = 0; i < fails.length; i++){
sysIn(fails[i]);
assertThrows(IllegalArgumentException.class, ()->{gameAgain.gameAgain();});
}
}
}
18 changes: 18 additions & 0 deletions src/test/java/GenerateAnswerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

class GenerateAnswerTest {

@Test
void generateAnswer() {
Input userInput = new Input();
GenerateAnswer generateAnswer = new GenerateAnswer();

for(int i = 0; i < 5000 ; i++){
assertThat(userInput.isValid(generateAnswer.generateAnswer())).isTrue();
}

}
}
59 changes: 59 additions & 0 deletions src/test/java/InputTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

class InputTest {

InputStream sysInBackup;
@BeforeEach
void setUp() {
sysInBackup = System.in;
}

@AfterEach
void tearDown() {
System.setIn(sysInBackup);
}

void sysIn(String input) {
System.setIn(new ByteArrayInputStream(input.getBytes()));
}


@Test
void getInput() {
String[] success = {"123", "451", "874"};
String[] fails = {"ㄱㄴㄷ", "42", "119", "001", "1111"};
Input input = new Input();
for(int i = 0; i < success.length; i++){
sysIn(success[i]);
assertThat(input.isValid(input.getInput())).isTrue();
}

for(int i = 0; i < fails.length; i++){
sysIn(fails[i]);
assertThrows(IllegalArgumentException.class, ()->{input.getInput();});
}

}

@Test
void isValid() {
int[] success ={123, 124, 125};
int[] fails ={111, 102, 022};
Input input = new Input();
for(int i = 0; i < success.length;i++){
assertThat(input.isValid(success[i])).isTrue();
}

for(int i = 0; i < fails.length;i++){
assertThat(input.isValid(fails[i])).isFalse();
}
}
}