본문 바로가기
Programming/Java

[우아한테크코스 3기 프리코스 2주차] 자동차 경주 게임

by IN.0 2019. 12. 8.
728x90
반응형

이번 주 수요일(12.04)에 2주차 미션 메일을 받았다.

저번에 README를 master로 업데이트 해버리는 실수를 했는데,

이번에는 일단 branch부터 만들고 README를 업데이트 했다.

README

난이도는 저번과 비슷하게 느껴진다.

Java project 설정이 안되어있다.

1주차 후기에서 빼먹었는데, 제일 처음에 클론하고 나면 Java project 설정이 안되어있어서 class 생성이 안된다.

설정

최상위 폴더를 우클릭하고 Properties에 들어와서 Project Facets를 Java로 설정한다.

여기서 저런 모양으로 안뜨고 파란색 링크 글씨만 뜨는 경우가 있는데, 그럴땐 그 파란색을 누르면 된다.

Apply and Clone을 하면 이제 자바 프로젝트로 설정이 완료된다.

package domain;

import java.util.InputMismatchException;
import java.util.Scanner;

public class User {

	public String[] EnterCarName_ReturnArray() {
		String[] CarNameArray;
		Scanner scanner = new Scanner(System.in);
		while (true) {
			System.out.print("경주할 자동차 이름을 5자 이하로 입력하세요. (이름은 쉼표(,) 기준으로 구분) : ");
			String CarNameString = scanner.nextLine();
			CarNameArray = StringToArray(CarNameString);
			int error_or_not = Exception(CarNameArray);
			if (error_or_not == 0) {
				break;
			}
			System.out.println("자동차 이름을 1자 이상 5자 이하로 입력해주세요.");
			scanner.reset();
		}
		return CarNameArray;
	}
	
	public int Exception(String[] arr) {
		int error = 0;
		for (int i=0; i<arr.length; i++) {
			if (arr[i].length() > 5 || arr[i].length() == 0) {
				error += 1;
				break;
			}
		}
		return error;
	}
	
	public String[] StringToArray(String str) {
		String[] arr;
		arr = str.split(",");
		
		for (int i=0; i<arr.length; i++) {
			String name = arr[i];
			arr[i] = name.trim();
		} 
		
		return arr;
	}
	
	public int Attempt() {
		int result=0;
		while (true) {
			System.out.print("시도할 회수는 몇회인가요?(1 이상의 숫자만 입력) : ");
			int[] ErrorCheck_and_Num = Attempt_Exception();

			if (ErrorCheck_and_Num[0] == 0) {
				result = ErrorCheck_and_Num[1];
			}
			if (result != 0) {
				break;
			}
		}
		return result;
	}
	
	public int[] Attempt_Exception() {
		Scanner scanner = new Scanner(System.in);
		int TryNum = 0;
		int error = 0;
		int[] result = new int[] {0,0};
		try {
			TryNum = scanner.nextInt();
		} catch(InputMismatchException ime) {
		    System.out.println("숫자만 입력 가능합니다.");
		    scanner.reset();
		    error += 1;
		}
		result[0] = error;
		if (result[0] == 0 ) {
			result[1] = TryNum;
		}
		return result;	
	}
}

User.java

일단 먼저 유저에게 자동차 이름을 받기 위한 클래스를 만들었다.

EnterCarName_ReturnArray 메서드를 통해 사용자에게 인풋 요청을 하고,

사용자에게 받은 자동차 이름을 array로 리턴한다.

콤마(,) 기준으로 문자열을 분리하고 trim 함수로 앞뒤 공백을 없앤다.

아무것도 입력하지 않거나 5자를 넘게 입력할 경우는 Exception 메서드로 예외처리하여 다시 받는다.

구글링을 통해 scanner.reset()이라는 기능을 새로 배웠다.

그리고 사용자에게 시도 횟수를 입력받는 Attempt 메서드를 만들고

Attempt_Exception 메서드를 통해 예외처리를 해주었다.

메서드와 변수 이름을 직관적으로 짓다보니 좀 길어졌다.

package domain;

public class Car {
	private final String name;
    private int position = 0;

    public Car(String name) {
        this.name = name;
    }
    
    public void MoveOrNot() {
    	int num = Random_Number();
    	if (num >= 4) {
    		position += 1;
    	}
    }
    
    public int Random_Number() {
    	int random_number = (int) (Math.random() * 10);
    	return random_number;
    }
    
    public void Visual() {
    	System.out.print(name+" : ");
    	for (int i=0; i<position; i++) {
    		System.out.print("-");
    	}
    	System.out.println();
    }
    
    public int GetPosition() {
    	return position;
    }
    
    public String GetName() {
    	return name;
    }
}

Car.java

9번째 라인 (Car 메서드 부분) 까지는 원래부터 주어져 있었고, 변경이 불가능하다.

일단 0~9 랜덤넘버를 생성하는 메서드를 만들고, 그 값을 MoveOrNot 메서드에 넣어서

4 이상이면 position 값을 더하도록 해주었다.

그리고 결과를 시각적으로 출력해주는 Visual 메서드를 만들었다.

 

package domain;

public class Main {
	public static void main (String[] args) {
		User user = new User();
		String[] names = user.EnterCarName_ReturnArray();
		Car[] cars = new Car[names.length];
		int number = user.Attempt();
		
		for (int i=0; i<names.length; i++) {
			Car car = new Car(names[i]);
			cars[i] = car;
		}
		
		ResultStick(number,cars);
		Winner(cars);	
	}
	
	public static void ResultStick(int number,Car[] cars) {
		System.out.println();
		System.out.println("실행 결과");
		
		for (int j=0; j<number; j++) {
			for (int i=0; i<cars.length; i++) {
				cars[i].MoveOrNot();
				cars[i].Visual();
			}
			System.out.println();
		}
	}
	
	public static void Winner(Car[] cars) {
		String name = "";
		int max = -1;
		for (int i=0; i<cars.length; i++) {
			
			if (cars[i].GetPosition() == max) {
				name = name +", "+cars[i].GetName();
			}
			if (cars[i].GetPosition() > max) {
				name = cars[i].GetName();
				max = cars[i].GetPosition();
			}
		}
		System.out.println(name+"가 최종 우승했습니다.");
	}
}

Main.java

메인 클래스의 메인 메서드는 다른 메서드들을 실행시키는 도화지 역할만 하게 만들었다.

Car 클래스를 어떻게 이용해야 하는지 고민이 많았는데, Car[] 이라는 array도 만들 수 있다는 것을 깨닫고

의외로 쉽게 풀렸다.

ResultStick 메서드는 각 car들의 실시간 결과값을 Visual 메서드를 통해 모아 보여준다.

Winner 메서드는 우승자가 누구인지 출력해준다.

그리고 Main이 위의 두 기능을 모으는 역할을 한다.


1주차보다 많이 발전한게 스스로 느껴졌다.

Car 클래스를 통해서 클래스를 어떻게 써야할지 조금 더 감을 잡았다.

그래도 여전히 모르는 기능이 많고 (python에서의 list.append(값) 기능, "-"*10 같은 기능은 없는지..)

메서드 앞에 붙는 public static void.. 같은 것의 의미도 명확히 모르겠다.

3주차에도 열심히 하자!

728x90
반응형

댓글