Battle 과제 코드 수정 - 공격/힐링 모듈화 + 레벨업 모듈화

2025. 5. 30. 14:27·컴퓨터공학과/Java 1 & 2

 

 

기존 코드/ 변경 코드입니다.

 

기존의 코드에서는 HP를 깎는 부분이 중복되고 있습니다. 이는 모든 속성 FIRE, WATER, EARTH 모두 공통적으로 가지고있으니

불필요하다고 생각됩니다. 따라서 이를 모듈화하고자 합니다. 

 

// NEW !! 공통 피해 계산 메소드
public void dealDamage(Player target, double multiplier) {
    int beforeHp = target.hp;
    int damage = (int)(this.power * multiplier);
    target.hp -= damage;
    System.out.println(target.name + "(이)가 " + name + "에게 " + damage + " 만큼의 피해를 입었습니다.");
}

 

이를 부모 클래스..이자 추상 클래스인 Player에 붙이겠습니다.

 

기존의 힐링 메소드 중복부분 또한 모듈화하였다. 고유 스킬 명은 유지하되, 아래 중복부분은 모두 Player 클래스에 만들고, 상속받아 사용한다. 배율(ratio)만 입력하면 힐할 수 있도록 다시 설정하였다.

 

최종 변경 힐링 메소드

	public void heal(double ratio) {
	    int beforeHp = this.hp;
	    this.setHp((int)(this.hp * ratio));
	    int healAmount = this.hp - beforeHp;
	    System.out.println(this.name + "(이)가 HP를 " + healAmount + " 만큼 회복했습니다.");
	}

 

 

레벨업 모듈화

기존에 공격횟수가 5회 넘어가면 레벨업하는 것도 모듈화하였다.

 

public void increaseAttackCountAndCheckLevelUp() {
    this.attackCount++;
    if (this.attackCount > 5 && this.level < 2) {
        this.setLevel(2);
        System.out.println(this.name + "의 레벨이 2로 상승했습니다!");
    }
}

이를 플레이어 클래스에 추가하고, 하위 불,물,땅 타입 클래스는 모두 간소화하였다. 

 

물 궁극기 시전- 반사

	    if (target instanceof WATER && target.getLevel()>=2) { 
		    target.ultimateSkill(this);
		    return;
		}

해당 부분이 불, 땅 타입의 궁극기&일반 공격 사용시에 공통으로 들어가있다. 반복코드이므로 모듈화 시켜준다. Player타입에만 넣어주었다.

 

속성 넣어주기

기존에는 그냥 임의로 넣었던 공격하기 스킬이다.

이제 속성에 따라 공격력을 쎄게 해주기 위해, 삼항연산자를 통해 구현했다.

@Override
public void attackSkill(Player target) {
    System.out.println(name + "(이)가 " + target.name + "에게 물대포를 시전합니다.");
    if (target.dash()) return;
    double multiplier = (target instanceof FIRE) ? 1.25 : 1.15;
    dealDamage(target, multiplier);
    checkLevelUp();
}

public void attackSkill(Player target, boolean isUltimate) {
    double multiplier = (target instanceof FIRE) ? 1.25 : 1.15;
    dealDamage(target, multiplier);
    checkLevelUp();
}

이는 WATER타입의 공격 코드로, 타겟이 FIRE 타입일 때, 삼항연산자로 1.25배 배율 적용, 기존은 1.15배 적용이다.

 

근데 일반공격은 그냥 power로 통일하기로해서 1.15 => 1.0으로 이후 변경하였다.

 

기존 땅타입 코드 / 수정 이후 땅타입 코드(속성반영)

 

 

기존 불타입 코드 / 수정 이후 불타입 코드(속성 반영)

 

초기 출력 - 한글 깨짐 발생 => UTF -8고정 파일 생성

아마테라스에서 로그 뜨는 창이 한글이 깨지는 일이 발생했다.

그리고, 아무리 공격해도 스크롤이 내려가지 않아, 이를 추가함.

 

TextAreaOutPutStream 클래스를 만든다. 

package view;

import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

import javax.swing.JTextArea;

public class TextAreaOutputStream extends OutputStream {
    private JTextArea textArea;

    public TextAreaOutputStream(JTextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void write(int b) {
        textArea.append(String.valueOf((char) b));
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }
    
    @Override
    public void write(byte[] b, int off, int len) {
        String text = new String(b, off, len, StandardCharsets.UTF_8);
        textArea.append(text);
     // 자동 스크롤
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }

}

view 패키지의 battle.java 에 추가한코드

      textArea_1 = new JTextArea();
        JScrollPane scrollPane = new JScrollPane(textArea_1);
        scrollPane.setBounds(104, 634, 988, 185);
        contentPane.add(scrollPane);

        PrintStream printStream = new PrintStream(new TextAreaOutputStream(textArea_1), true, "UTF-8");
        System.setOut(printStream);
        System.setErr(printStream);

 

이제 정상적으로 출력 되었다.

 

 

 

WATER타입 궁극기 사용 공격

 

기존 코드

if (attacjer.getLevel() >= 2) 부분을 보면, 항상 궁극기를 사용하게 되어있다.

그런데 WATER 타입은 궁극기가 '반사'이므로 공격을받지도 않았는데 반사를 하는건 말이 안되었다.

 

따라서 이를 변경함.

 

    if (attacker instanceof WATER) {
        attacker.attackSkill(target);
    } else if (attacker.getLevel() >= 2) {
        attacker.ultimateSkill(target);
    } else {
        attacker.attackSkill(target);
    }

변경 이후 볼 수 있는 콘솔 창.

레벨업을 하더라도, 기존 공격스킬인 '물대포'를 그대로 사용한다.

 

하단을 보면, 엠버가 공격 시에, 웨이드는 피격받은 데미지의 0.5배를 반환하는 것을 볼 수 있다.

 

 

오류 수정 - 무지개반사로 PLAYER가 죽을 때

기존 코드에서는 타겟이 죽었을 때만 반영하지, 공격자가 죽었을 경우는 고려하지 않았음.

view의 battle에 해당 로직을 추가하여 죽는것을 확인할 수 있도록 하였다.

 

 

레벨업 오류

기존 코드에서는 checkLevelUp() 메소드에서 공격카운트를 세고, 레벨업을 하는 구조였다.

그러다보니, 5회 이상 공격해야 레벨업을 하는 시나리오에서 벗어나, 3회만 공격해도 레벨업을 하는 기이한 현상 발생. (왜? 공격에 실패해도 처리하고, 도망가도 처리하는 등의 문제가 발생하였다.)

 

따라서 카운팅은 자체 클래스에서 진행하고, 그카운트를 불러와서 레벨업하는걸로 재차 수정하였다.

 

Player 코드 : 각 타입들 모두 수정한 코드

 

 

 

 

생성자 변경 및 뷰→메인 플레이어 생성 역할 변경

view에서 플레이어를 생성하던 기존 코드를 변경하여 Main에서 생성하도록 변경하였다.

이를 적용하기 위해, view/battle.java 파일에서는 기존 생성부분을 삭제하고, 생성자에서 플레이어를 인자로 받아, 생성하는 것으로 변경하였다.

HP가 MAX일 때 회복하는 현상 수정.

기존에는 MAX hp를 설정하지않아, HP가 100인 경우에도 회복을 진행하고, 그 수치가 실제 hp에 반영되었었다.

Player.java 파일에서 MAX HP를 설정하고, 해당 수치에서 힐링하기 버튼을 눌렀을 때에는 “현재 HP가 MAX에요!”라는 메시지와 함께 회복불가하도록 설정하였다.

 

+06.06. PM 5:00 추가

최대 HP 초과 회복 현상 수정

ex) 99에서 10만큼 회복시 100에서 멈추는 것이 아니라 회복 이후 HP가 109가 됨

해당 문제는 MAX_HP 상수를 선언하고 회복 이후 100이 넘지 않도록 healAmount가 조정되도록 설정해 해결하였다.

▲수정한 코드 (좌) |실행 화면 (우)

 

그 외 추가적인 시도..

(좌측 Controller.java 파일 우측, 실제 오류 화면)

기존에 view 파일인 battle에서 기타동작을 컨트롤하는 메소드들이 너무 많아, MVC 패턴을 사용하여 컨트롤러 생성하고자 했다. 모든 변수에 getter/setter를만들고 코드 수정을 완료하려했으나, 뷰 창에서 아무것도 표시되지않는 치명적인 오류가 발생했다. 이를 해결하고자 생성형 AI를 사용해 여러 번 수정해보았으나 불가능해 결국 컨트롤러를 만들려는 시도는 무산되었다.

 

 

'컴퓨터공학과 > Java 1 & 2' 카테고리의 다른 글

JAVA backjoon 10815 이진탐색, 스트링빌더, 배열  (0) 2025.07.13
JAVA프로그래밍및실습/최윤정교수님/기말고사 범위  (0) 2025.06.08
Generic&Collection, Summary  (0) 2025.05.30
JAVA프로그래밍 및 실습I 과제#7예외처리 조사 및 사용하기  (0) 2025.05.17
[문제해결] 이클립스 패키지탐색기에서 파일이 열리는 경우  (0) 2025.05.17
'컴퓨터공학과/Java 1 & 2' 카테고리의 다른 글
  • JAVA backjoon 10815 이진탐색, 스트링빌더, 배열
  • JAVA프로그래밍및실습/최윤정교수님/기말고사 범위
  • Generic&Collection, Summary
  • JAVA프로그래밍 및 실습I 과제#7예외처리 조사 및 사용하기
sihyes
sihyes
24학번 컴퓨터공학과
  • sihyes
    시혜적으로개발
    sihyes
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (114)
      • 단순 설정 (10)
      • 백엔드 공부(BE, AWS) (8)
        • 로그인&회원가입 (3)
        • 파일업로드&GPT (2)
      • 컴퓨터공학과 (51)
        • 운영체제 (0)
        • Artificial Intelligence (0)
        • Java 1 & 2 (23)
        • 컴퓨터네트워크 (3)
        • 모앱JavaScript (0)
        • Data structures (9)
        • 소프트웨어공학 (5)
        • 오픈SW플랫폼 제출용 (5)
        • Python - 문해프 (1)
      • 개인 프로젝트 (2)
        • 알바솔로몬 (1)
        • PLACO 프로젝트 (0)
      • 도서 공부(정리) (20)
        • 알고리즘 코딩 테스트 자바 편 (1)
        • SQL첫걸음 (8)
        • 코딩 자율학습 스프링 부트 3 자바 백엔드 개발 .. (6)
        • Do it! 지옥에서 온 문서 관리자 깃&깃허브 .. (5)
      • 개인공부정리페이지 (12)
        • 백준 & 프로그래머스 (3)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ㅇ
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
sihyes
Battle 과제 코드 수정 - 공격/힐링 모듈화 + 레벨업 모듈화
상단으로

티스토리툴바