개발공부

스타 제작기

pumaclass 2024. 7. 20. 08:54
public class Star {
    public static void main(String[] arg) {
        Zealot zealot = new Zealot();
        Dragoon dragoon = new Dragoon();
        
        while(zealot.gethp() > 0 && dragoon.gethp() > 0){
            zealot.attack(dragoon);
            if(dragoon.gethp() <= 0){
                System.out.println(dragoon.getname() + "(이)가 죽었습니다.)");
                break;
            }
            dragoon.attack(zealot);
            if(zealot.gethp() <= 0){
                System.out.println(zealot.getname() + "(이)가 죽었습니다.");
            }
        }
    }
}

class Zealot{
    private String name = "질럿";
    private int shield = 100;
    private int hp = 100;
    private int att = 80;

    public String getname(){
        return name;
    }

    public int getshield(){
        return shield;
    }

    public void setshield(int shield){
        this.shield = shield;
    }

    public int gethp(){
        return hp;
    }

    public void sethp(int hp){
        this.hp = hp;
    }

    public int getatt(){
        return att;
    }

        void attack(Dragoon dragoon){
            int remainingDamage = att;
            if(dragoon.getshield() > 0){
                if(remainingDamage > dragoon.getshield()){
                    remainingDamage -= dragoon.getshield();
                    dragoon.setshield(0)
                } else{
                    dragoon.setshield(dragoon.getshield() - remainingDamage);
                    remainingDamage = 0;
                }
            }
                    if(remainingDamage > 0){
                        dragoon.sethp(dragoon.gethp() - remainingDamage);
                    }
                System.out.println(name + "이(가)" + dragoon.getname() + "을 공격하여" + " " + dragoon.getshield() + "의 실드와" + " " + dragoon.gethp() + "의 체력이 남았습니다." );

        }
}

class Dragoon{
    private String name = "드라군";
    private int shield = 120;
    private int hp = 80;
    private int att = 60;

    public String getname(){
        return name;
    }

    public int getshield(){
        return shield;
    }

    public void setshield(int shield){
        this.shield = shield;
    }

    public int gethp(){
        return hp;
    }

    public void sethp(int hp){
        this.hp = hp;
    }

    public int getatt(){
        return att;
    }

        void attack(Zealot zealot){
            int remainingDamage = att;
            if(remainingDamage > zealot.getshield()){
                remainingDamage -= zealot.getshield();
                zealot.setshield(0)
            }else{
                zealot.setshield(zealot.getshield() - remainingDamage);
                remainingDamage = 0;
            }
        

            if(remainingDamage > 0){
                zealot.sethp(zealot.gethp() - remainingDamage);
            }
            System.out.println(name + "이(가) " + zealot.getname() + "을 공격하여" + zealot.getshield() + "의 실드와" + zealot.gethp() + "의 체력이 남았습니다.");

        }
}

 

이번에는 좀더 어려운 프로토스끼리 전투를 만들어봤다.

사실 내가 만들었다기보단 gpt의 도움을 받고 내가 읽어가며 이해하는 식으로 진행해봤다.

논리는 실드가 먼저 깎이고 잉여 공격력으로 체력을 깎는 논리다.

 

그리고 프라이빗을 이용하여 다른 매서드에서 int 문으로 가져올 수 있게 했다.

class Zealot{
    private String name = "질럿";
    private int shield = 100;
    private int hp = 100;
    private int att = 80;

    public String getname(){ // 모든 객체가 private으로 지정되어 다른 매서드에서 불러올 수 없으므로 get문을 사용하여 다른 매서드에서 가져올 수 있게 만든다//
        return name;
    }

    public int getshield(){
        return shield;
    }

    public void setshield(int shield){ // 실제 변동될 수 있는 객체이므로 set문을 이용하여 실드를 미리 세팅하고 get으로 변동된 값을 준다//
        this.shield = shield;
    }

    public int gethp(){
        return hp;
    }

    public void sethp(int hp){
        this.hp = hp;
    }

    public int getatt(){
        return att;
    }

 

private을 사용하면 해당 class에 묶여 있는 매서드 외에는 다른 클래스에서 해당 매서드를 사용할수 없더라.

주석에서는 설명을 잘못했는데 각 객체별로 초기화해서 해당 정보를 반환시키면 다른 클래스에서 사용할수있다는걸 확인.

 

        void attack(Dragoon dragoon){ // 질럿이 드라군을 공격하는 행위를 한다
            int remainingDamage = att; // att값이 실드와 체력을 깎으며 변동되어야 하므로 att을 remainingDamage으로 변경한다.
            if(dragoon.getshield() > 0){ // 드라군의 실드가 0보다 클때
                if(remainingDamage > dragoon.getshield()){ // 남아있는 데미지가 실드보다 클 경우
                    remainingDamage -= dragoon.getshield(); // 질럿이 드라군에게 입힐 데미지를 계산한다. 데미지에서 실드를 뺀 값을 계산한다.
                    dragoon.setshield(0) // 실드를 0으로 설정한다.
                } else{ // 그렇지 않다면(공격력이 실드보다 작거나 같다면)
                    dragoon.setshield(dragoon.getshield() - remainingDamage); // 드라군의 실드를 깎고
                    remainingDamage = 0; // 공격력을 0으로 세팅한다
                }
            }
                    if(remainingDamage > 0){ // 남은 데미지가 0보다 크다면
                        dragoon.sethp(dragoon.gethp() - remainingDamage); // 공격력이 체력을 깎는다.
                    }
                System.out.println(name + "이(가)" + dragoon.getname() + "을 공격하여" + " " + dragoon.getshield() + "의 실드와" + " " + dragoon.gethp() + "의 체력이 남았습니다." );

        }

실드를 다 깎은 이후에 남은 데미지가 0보다 크면 그때부터 체력을 깎기 시작한다.

-= 이것도 궁금했는데 찾아보니 - 만 쓰게 되면 remainingDamage의 값이 변하지않는다고 한다.

=연산자도 같이 넣어줘야 남은 공격력의 값이 바뀌므로 빼먹으면 안된다고한다.

실드를 깎고 남은 공격력으로 체력을 깎아야 하므로.

 

public class Star {
    public static void main(String[] arg) {
        Zealot zealot = new Zealot();
        Dragoon dragoon = new Dragoon();
        
        while(zealot.gethp() > 0 && dragoon.gethp() > 0){ //질럿과 드라군이 서로 공격한다
            zealot.attack(dragoon); // 질럿이 드라군을 공격하는 매서드
            if(dragoon.gethp() <= 0){
                System.out.println(dragoon.getname() + "(이)가 죽었습니다.)");
                break;
            }
            dragoon.attack(zealot); // 드라군이 질럿을 공격하는 매서드
            if(zealot.gethp() <= 0){
                System.out.println(zealot.getname() + "(이)가 죽었습니다.");
            }
        }
    }
}

 

딱히 설명은 필요없어보인다.

잘 작동한다

 

당연히 몇번을 반복하든 질럿이 이긴다.

여기에 데미지에 변수를 주는 크리티컬을 도입해볼까 했지만 이 프로젝트는 여기서 접어두고

gpt의 도움없이 코딩이 가능해질때즈음 직접 추가해볼생각이다.

 

지금까지 아이디어를 chatgtp로 구현한뒤 구조를 되짚어가며 이해하려고 노력해봤다.

시원하게 이해한것도 있고 어중간하게 이해된것도 많다.

비율은 아무래도 4:6 정도 되는거 같다.

이런 공부법이 실제로 얼마나 효율적일지는 모르겠지만 확실한건 나같은 응애한테는 도움이 된거같다.

 

나는 흥미가 동해야 움직이는놈이니까