본문 바로가기

ETC/복습

[복습_JAVA] 23

실습(메소드와 변수)

- 어떠한 직업의 수익 창출 프로그램

1. Primitive.java(필요한 메소드 모음) 작성하기

- 필요한 변수 선언하기

String position = "원시인";  // 등급
int grade = 3;  // 등급 점수
int money;  // 현재 잔액
int income;  // 수익률
int rating;  // 사냥 추가 성공률

// 전역변수(모든 영역에서 Random 객체를 사용하기 위해 선언)
Random r = new Random();

 

 

※ 생성자 생성하기

public Primitive() {;}

 

 

- 수렵하기(사냥)

boolean hunt(Wild wild) {
	int[] arData = new int[10];  // 10%단위 확률 배열
	int rating = 0;  // 확률
	
	// 야생동물 사냥 성공 확률에 추가 성공률을 더한 확률을 구한다.
	rating = this.rating + wild.rating;
	
	// 확률 제작 
	for (int i = 0; i < rating / 10; i++) {
		arData[i] = 1;
	}
	
	// rating% : 1이 나올 확률
	if(arData[r.nextInt(arData.length)] == 1) {
		return true;  // 사냥 성공
	}
	return false;  // 사냥 실패
}

 

 

- 등급업

// 등급에 대한 정보를 외부에서 전달받는다.
boolean gradeUp(Grade grade) {
	int[] arData = new int[10];  // 확률 배열(10단위)
	
	for (int i = 0; i < grade.rating / 10; i++) {
		arData[i] = 1;
	}
	
	if(arData[r.nextInt(arData.length)] == 1) {  // 승급 성공 시
		this.grade--;  // 승급 성공한 캐릭터의 등급 점수를 1 상승 시킨다.(2등급보다 1등급이 높다.)
		return true;  // 승급 성공
	} 
	return false;  // 승급 실패
}

 

 

- 내 정보

String getInfo() {  // 내 정보
	String str = "등급 : " + position + "\n";
	str += "현재 잔액 : " + money + "만 뼈다귀\n";
	str += "현재 수익률 : " + income + "%\n";
	str += "현재 추가 사냥률 : " + rating + "%";
	return str;
}

 

 

 

2. Grade.java(등급) 작성하기

- 필요한 변수 선언하기

int money;  //등급 상승에 필요한 금액
int grade;  // 등급 점수
String position;  // 등급
int rating;  // 승급 확
int income;  // 추가 수익률

 

 

※ 생성자 생성하기

public Grade() {;}

public Grade(int money, int grade, String position, int rating, int income) {
	this.money = money;
	this.grade = grade;
	this.position = position;
	this.rating = rating;
	this.income = income;
}

 

 

 

3. Wild.java(야생동물) 작성하기

- 필요한 변수 선언하기

String name;  // 야생 동물의 이름
int money;  // 야생 동물 사냥 성공 시 획득 가능한 돈
int rating;  // 사냥 성공 확률

 

 

※ 생성자 생성하기

public Wild() {;}

public Wild(String name, int money, int rating) {
	super();
	this.name = name;
	this.money = money;
	this.rating = rating;
}

 

 

 

4. Mountain.java(main 메소드 안에서 실행) 작성하기

- 필요한 변수 및 배열 선언

Primitive han = new Primitive();
Grade[] arGrade = {
	new Grade(20000, 2, "창지기", 60, 10),
	new Grade(40000, 1, "제사장", 5, 100)
};

Grade grade = null;

Wild[] arWild = {
	new Wild("맘모스", 15000, 50),
	new Wild("시조새", 55000, 30),
	new Wild("공룡", 100000, 10)
};
 
Wild wild = null;
Scanner sc = new Scanner(System.in);
Random r = new Random();
Mountain m = new Mountain();

String answer = null;

int[] arData = new int[10];

int choice = 0;

 

 

- 승급에 대한 메소드 작성

// 소스코드 간결화
// 승급에 대한 로직 작성
// 승급을 시도한 캐릭터의 정보와(person)
// 등급에 대한 정보(grade)를 전달받는다.
void getGradeInfo(Primitive person, Grade grade) {
	int[] gradeRatings = {10, 30};  // 사냥 추가 성공률
	Scanner sc = new Scanner(System.in);
	 
	System.out.println(grade.position + "로 승급하시겠습니까?");
	System.out.println("※ 승급에 필요한 돈 : " + grade.money + "만 뼈다귀");
	System.out.println("※ 승급 확률 : " + grade.rating + "%");
	System.out.println("※ 승급 성공 시 획득 뼈다귀 +" + grade.income + "%");
	System.out.println("※ 승급 성공 시 사냥 성공률 +" + person.rating + "%");
	System.out.println("[Y / N]");
	
	//toUpperCase() : 앞의 문자열을 모두 대문자로
	//toLowerCase() : 앞의 문자열을 모두 소문자로
	String answer = sc.next().toUpperCase();
	
	if(!answer.equals("Y")) {  // 승급 취소
		return;  // void형 메소드에서 강제 종료 시 return;을 적어준다.
	}
	
	// 돈이 부족하다면
	if(person.money < grade.money) {
		System.out.println("승급에 필요한 돈이 부족합니다.");  // 알맞는 메시지 출력 후
		return;  // 메소드 종료
	}

	// 승급의 성공 유무에 상관없이 무조건 돈은 차감되도록 구현한다.
	person.money -= grade.money;
	
	// 첫번째 승급 성공 시 grade : 2
	// 두번째 승급 성공 시 grade : 1
	if(person.gradeUp(grade)) {
		//승급 성공
		person.rating = gradeRatings[2 - person.grade]; //사냥 추가 성공률 반영
		person.position = grade.position;  // 캐릭터의 등급을 승급한 등급으로 수정
		person.income = grade.income;  // 캐릭터의 수익률을 승급한 등급의 수익률로 수정
		System.out.println(person.position + "으(로) 승급 성공");
		return;
	}
	
	//승급 실패
	System.out.println("승급 실패");
}

 

 

- 사냥하기

// 랜덤한 야생동물 소환 후 wild 객체에 담아주기
wild = arWild[r.nextInt(arWild.length)];
 

// 소환한 야생동물을 전달하여 사냥 성공/실패 여부를 확인한다.
if(han.hunt(wild)) {  // 사냥에 성공했다면
	// 야생동물의 전리품(돈)에 추가 수익률을 더한 돈을 캐릭터 통장에 넣어준다.
	// wild.money * 1.0 : 기본 수익률
	// han.income * 0.01 : 추가 수익률
	han.money += wild.money * (1.0 + han.income * 0.01);
	System.out.println(wild.name + " 사냥 성공");
	System.out.println((int)(wild.money * (1.0 + han.income * 0.01)) + "만 뼈다귀를 획득했습니다.");
	break;
}
System.out.println("악!" + wild.name + " 사냥을 실패했습니다.");

 

 

- 승급하기

if(han.grade == 1) {  // 최고 등급에 도달했을 경우
	System.out.println("이미 경지에 올랐습니다."); 
	break;
}

// 사용자가 승급 성공 시 받아야 할 혜택들을 grade에 담아준다.
// 아직 승급 성공인지 실패인지 모른다.
grade = arGrade[3 - han.grade]; 

// 캐릭터 정보와 성공 시 혜택 정보를 전달한다.
m.getGradeInfo(han, grade);

 

 

- 내 정보

System.out.println(han.getInfo());

 

 

- 나가기

if(choice == 4) {break;}
if(choice < 1 || choice > 4) {  // 메뉴 번호의 범위를 벗어났을 때
	System.out.println("잘못 입력하셨습니다.");
	continue;
}

 

 

 

※ Mountain.java 전체 코드(main 메소드 포함된 자바 파일)

import java.util.Random;
import java.util.Scanner;

public class Mountain {
	
	// 소스코드 간결화
	// 승급에 대한 로직 작성
	// 승급을 시도한 캐릭터의 정보와(person) 
	// 등급에 대한 정보(grade)를 전달받는다.
	void getGradeInfo(Primitive person, Grade grade) {
		int[] gradeRatings = {10, 30};  // 사냥 추가 성공률
		Scanner sc = new Scanner(System.in);
		
		System.out.println(grade.position + "로 승급하시겠습니까?");
		System.out.println("※ 승급에 필요한 돈 : " + grade.money + "만 뼈다귀");
		System.out.println("※ 승급 확률 : " + grade.rating + "%");
		System.out.println("※ 승급 성공 시 획득 뼈다귀 +" + grade.income + "%");
		System.out.println("※ 승급 성공 시 사냥 성공률 +" + person.rating + "%");
		System.out.println("[Y / N]");
		
		//toUpperCase() : 앞의 문자열을 모두 대문자로
		//toLowerCase() : 앞의 문자열을 모두 소문자로
		String answer = sc.next().toUpperCase();
		
		if(!answer.equals("Y")) {  // 승급 취소
			return;  // void형 메소드에서 강제 종료 시 return;을 적어준다.
		}
		
		// 돈이 부족하다면
		if(person.money < grade.money) {
			System.out.println("승급에 필요한 돈이 부족합니다.");  // 알맞는 메시지 출력 후
			return;  // 메소드 종료
		}

		// 승급의 성공 유무에 상관없이 무조건 돈은 차감되도록 구현한다.
		person.money -= grade.money;
		
		// 첫번째 승급 성공 시 grade : 2
		// 두번째 승급 성공 시 grade : 1
		if(person.gradeUp(grade)) {
			//승급 성공
			person.rating = gradeRatings[2 - person.grade]; //사냥 추가 성공률 반영
			person.position = grade.position;  // 캐릭터의 등급을 승급한 등급으로 수정
			person.income = grade.income;  // 캐릭터의 수익률을 승급한 등급의 수익률로 수정
			System.out.println(person.position + "으(로) 승급 성공");
			return;
		}
		
		//승급 실패
		System.out.println("승급 실패");
	}
	
	public static void main(String[] args) {
//		printf에서는 %%두 개를 써야 %문자로 인식한다.
//		System.out.printf("%%");
		
		Primitive han = new Primitive();
		Grade[] arGrade = {
				new Grade(20000, 2, "창지기", 60, 10),
				new Grade(40000, 1, "제사장", 5, 100)
		};
		
		Grade grade = null;
		
		Wild[] arWild = {
				new Wild("맘모스", 15000, 50),
				new Wild("시조새", 55000, 30),
				new Wild("공룡", 100000, 10)
		};
		
		Wild wild = null;
		Scanner sc = new Scanner(System.in);
		Random r = new Random();
		Mountain m = new Mountain();
		
		String answer = null;
		
		int[] arData = new int[10];
		
		int choice = 0;
		
		while(true) {
			System.out.println("1. 사냥하기\n2. 등급 올리기\n3. 내 정보\n4. 나가기");
			choice = sc.nextInt();
			
			// 나가기
			if(choice == 4) {break;}
			if(choice < 1 || choice > 4) {  // 메뉴 번호의 범위를 벗어났을 때
				System.out.println("잘못 입력하셨습니다.");
				continue;
			}
			
			// 랜덤한 야생동물 소환 후 wild 객체에 담아주기
			wild = arWild[r.nextInt(arWild.length)];
			
			switch(choice) {
			case 1:  // 사냥하기
				// 소환한 야생동물을 전달하여 사냥 성공/실패 여부를 확인한다.
				if(han.hunt(wild)) {  // 사냥에 성공했다면
					// 야생동물의 전리품(돈)에 추가 수익률을 더한 돈을 캐릭터 통장에 넣어준다.
					// wild.money : 기본 수익률
					// 1.0 + han.income * 0.01 : 추가 수익률
					han.money += wild.money * (1.0 + han.income * 0.01);
					System.out.println(wild.name + " 사냥 성공");
					System.out.println((int)(wild.money * (1.0 + han.income * 0.01)) + "만 뼈다귀를 획득했습니다.");
					break;
				}
				System.out.println("악!" + wild.name + " 사냥을 실패했습니다.");
				break;
			case 2:  // 승급하기
				if(han.grade == 1) {  // 최고 등급에 도달했을 경우
					System.out.println("이미 경지에 올랐습니다."); 
					break;
				}
				
				// 사용자가 승급 성공 시 받아야 할 혜택들을 grade에 담아준다.
				// 아직 승급 성공인지 실패인지 모른다.
				grade = arGrade[3 - han.grade];
				
				// 캐릭터 정보와 성공 시 혜택 정보를 전달한다.
				m.getGradeInfo(han, grade);
				break;
			case 3:
				System.out.println(han.getInfo());  // 내 정보
				break;
			}
		}
		
	}
}

 

 

 

결과(사냥하기)

 

결과(등급 올리기 - 성공)

 

결과(등급 올리기 - 실패)

 

결과(등급 올리기 - 금액부족)

 

결과(내 정보)

 

 

'ETC > 복습' 카테고리의 다른 글

[복습_JAVA] 25  (0) 2022.09.14
[복습_JAVA] 24  (0) 2022.09.08
[복습_JAVA] 22  (0) 2022.09.06
[복습_JAVA] 21  (0) 2022.09.02
[복습_JAVA] 20  (0) 2022.09.01