21.11.08(월)
주말에 개념정리..하려고 했는데 푹쉬어 버렸다. 그래서 월요일이였지만 컨디션이 아주 좋았다. 오늘했던 미션은 가계부, 홀짝게임, 행맨게임 3가지가 있었는데 그나마 난이도가 낮아보이는 홀짝게임을 택했다. 코드는 하기와 같다.
import java.util.Scanner;
import static java.lang.Math.min;
import static java.lang.Math.pow;
public class OddOrEven {
public static void main(String[] args) {
OddOrEven oddoreven = new OddOrEven();
oddoreven.play();
}
Scanner sc = inputPlayeName();
int pnameCapital = 100;
int rnameCpatial = 120;
int roundcount = 1;
private int play() {
int rCountNum = rCountNum();
String pInputOddEven = inputOddEven(sc, "홀,짝을 입력해주세요.");
int bettingNum = inputBetnumover(sc, pnameCapital, rnameCpatial);
String rOddEven = rCountnumJudge(rCountNum);
if (pInputOddEven.equals(rOddEven)) {
rnameCpatial = rBalanceLose(rnameCpatial, bettingNum, "현재 상대방의 잔액은 ");
pnameCapital = pBalanceWin(pnameCapital, bettingNum, "현재 나의 잔액은 ");
} else {
pnameCapital = pBalanceLose(pnameCapital, bettingNum);
rnameCpatial = rBalanceWin(rnameCpatial, bettingNum, "현재 상대방의 잔액은 ");
}
if (roundcount == 8 && rnameCpatial == 0) {
playerWin(pnameCapital, roundcount);
} else if (rnameCpatial == 0) {
roundcount++;
rnameCpatial = nextLevel(pnameCapital, roundcount);
return play();
} else if (pnameCapital == 0) {
playerlose(pnameCapital, roundcount);
} else {
return play();
}
return pnameCapital;
}
private static Scanner inputPlayeName() {
Scanner sc = new Scanner(System.in);
String pname = inputOddEven(sc, "플레이어의 이름을 입력해주세요.");
System.out.println("플레이어의 이름은 " + pname + " 입니다.");
return sc;
}
private static int rCountNum() {
int rCountNum;
rCountNum = (int) (Math.random() * 20) + 1;
return rCountNum;
}
private static String inputOddEven(Scanner sc, String s) {
System.out.println(s);
return sc.next();
}
private static int inputBetnumover(Scanner sc, int pnameCapital, int rnameCpatial) {
int inputBetNum = getInputBetNum(sc);
while (inputBetNum != 0) {
if (inputBetNum > min(pnameCapital, rnameCpatial)) {
System.out.println("베팅 금액을 초과하였습니다." + "\n" + min(pnameCapital, rnameCpatial) + " " + "이하로 입력해주세요.");
inputBetNum = getInputBetNum(sc);
} else {
break;
}
}
return inputBetNum;
}
private static int getInputBetNum(Scanner sc) {
System.out.println("베팅 금액을 입력해주세요.");
int inputBetNum = sc.nextInt();
return inputBetNum;
}
private static String rCountnumJudge(int rCountNum) {
String rOddEven;
if (rCountNum % 2 == 0) {
rOddEven = "짝";
} else {
rOddEven = "홀";
}
return rOddEven;
}
private static int rBalanceLose(int rnameCpatial, int bettingNum, String s) {
rnameCpatial -= bettingNum;
System.out.println(s + rnameCpatial + "입니다.");
return rnameCpatial;
}
private static int pBalanceWin(int pnameCapital, int bettingNum, String s) {
pnameCapital += bettingNum;
System.out.println(s + pnameCapital + "입니다.");
return pnameCapital;
}
private static int rBalanceWin(int rnameCpatial, int bettingNum, String s) {
rnameCpatial = pBalanceWin(rnameCpatial, bettingNum, s);
return rnameCpatial;
}
private static int pBalanceLose(int pnameCapital, int bettingNum) {
pnameCapital = rBalanceLose(pnameCapital, bettingNum, "현재 나의 잔액은 ");
return pnameCapital;
}
private static void playerWin(int pnameCapital, int i) {
System.out.println("WIN!!");
System.out.println("당신의 소지금은 " + pnameCapital + " 이며, 총 " + i + "라운드 진행되었습니다.");
}
private static int nextLevel(int pnameCapital, int roundcount) {
int rnameCpatial;
rnameCpatial = (int) (pnameCapital * pow(1.2, roundcount));
System.out.println(roundcount + "라운드" + ">>" + "새로운 상대가 등장합니다.");
return rnameCpatial;
}
private static void playerlose(int pnameCapital, int roundcount) {
System.out.println("당신의 소지금은 " + pnameCapital + " 이며, 총 " + roundcount + "라운드 진행되었습니다.");
System.out.println(" - Game Over - ");
}
}
최대한 객체생활체조를 지키며 해보려고 했는데, 아직 너무 지저분해보인다. 내가 모르는 축약할 수 있는 함수나 다른 방법으로 가독성 높일수 있는 방법이 있을텐데 현재 나로썬 저게 최선이다. 이전보다 나아진게 있다면, 이전까지는 우선 코딩부터 시작하고 시작하면서 목표에 맞게 다시 수정하는 방식으로 진행했다면 이번에는 각 목표에서 필요한 기능들을 어떻게 구현할지 설계하고 각 기능부터 구현을 하였고 그 후 로직에 맞춰 다시 리팩토링 및 정렬을 하였다. 처음으로 이런 방식으로 진행해봤는데 꼬이는거 없이 퍼즐 맞추듯이 딱딱 맞는 느낌이 들어 깔끔했다.
오늘도 질문이 적었다.. 내일부터는 꼭 질문 하나씩은 하자 아무거나라도!
(스터디에서 발췌한 내용)
- 반복적으로 사용되는 객체를 어떻게 관리할 것인가.
- ex) Scanner
- 상태가 있는 객체는 항상 만들어야 한다.
- 생성자를 사용하면 좋음.
- 하지만 반복적으로 사용되는 객체가 상태를 가진다는게 좋은 설계인가를 먼저 의심한다.
- 상태가 없는 객체라면 메소드 영역에 정의될 수 있게 한 후 반복 사용한다.
- hint. 싱글턴 패턴, 유틸성 객체, Spring Bean
- 보통 자바에서는 문자열이 동일한지 비교할때 ==보단 equals를 사용하여 체크한다. 이유는 ==는 문자열이 같은지 확인하는것이 아닌 object가 동일한지를 체크하기 때문이다.
- Math.random()함수 : 0.0보다 크고 1.0보다 작은 값을 랜덤하게 추출한다. 정수 1~20범위로 한정지어 활용하려면 (int)(Math.random()*20)+1; 로 변경해줘야 한다.
- Math.min(a,b)함수 : a와 b 값중 적은 수를 리턴합니다.
- Math.pow(a,b)함수 : a값의 b승 값을 리턴합니다.
- 디버깅 ! 확인하고자 하는 줄 왼쪽에 브레이크 포인트를 걸고 벌레모양을 누른뒤 상황에 맞춰 step into로 버그를 잡아낼 수 있다.(쏠쏠)