실습(메소드와 변수)
- 어떠한 직업의 수익 창출 프로그램
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 |