코드스쿼드 코코아_자바#5

VANS·2021년 11월 8일
0

회고

목록 보기
8/79

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

      1. 보통 자바에서는 문자열이 동일한지 비교할때 ==보단 equals를 사용하여 체크한다. 이유는 ==는 문자열이 같은지 확인하는것이 아닌 object가 동일한지를 체크하기 때문이다.
      2. Math.random()함수 : 0.0보다 크고 1.0보다 작은 값을 랜덤하게 추출한다. 정수 1~20범위로 한정지어 활용하려면 (int)(Math.random()*20)+1; 로 변경해줘야 한다.
      3. Math.min(a,b)함수 : a와 b 값중 적은 수를 리턴합니다.
      4. Math.pow(a,b)함수 : a값의 b승 값을 리턴합니다.
      5. 디버깅 ! 확인하고자 하는 줄 왼쪽에 브레이크 포인트를 걸고 벌레모양을 누른뒤 상황에 맞춰 step into로 버그를 잡아낼 수 있다.(쏠쏠)
profile
코딩도 점진적 과부화

0개의 댓글