수정한 부분
1.
무기클래스를 상속받은 클래스들이 모두 필요mp와 데미지를 또 가지고 있음
-> 무기클래스의 하위 클래스에서 모두 필요mp와 데미지 변수 삭제


2.
Player클래스를 상속받은 클래스들이 모두 겹치는 변수들을 또 가지고 있음
-> Player클래스의 하위 클래스에서 모두 겹치는 변수 삭제


3.
Player들이 모두 무기로공격 함수를 가지고 있는데 무기만 다르고 내용이 같음
-> 무기로공격 함수를 전용무기를 인자로 받는 형태로 변경하여 Player클래스에 만들고 하위 클래스에서는 삭제
public void 무기로공격(Player target, 무기 전용무기) {
int playermp = this.getMP();
int targethp = target.getHP();
playermp -= 전용무기.get필요mp();
targethp -= 전용무기.get데미지();
this.setMP(playermp);
target.setHP(targethp);
}
4.
무기와 Player를 생성하는 코드가 Win과 Main클래스에서 겹침
-> Win클래스에서 Main클래스와 겹치는 부분을 삭제하고 Main에서 Win의 생성자를 호출하는 방식으로 변경, 기존 Win의 기본 생성자에 있던 내용은 인자가 있는 생성자로 모두 옮김
public class Main {
public static void main(String[] args) throws InterruptedException {
청룡언월도 청룡 = new 청룡언월도(50,90);
관우 운장 = new 관우("관우", 900, 50, 10, "관우.png", "관우2.png", 청룡);
쌍고검 쌍고 = new 쌍고검(30,30);
유비 현덕 = new 유비("유비", 500, 5, 40, "유비1.png", "유비2.png", 쌍고);
장팔사모 장팔 = new 장팔사모(45,80);
장비 익덕 = new 장비("장비", 700, 40, 15, "장비1.png", "장비2.png", 장팔);
청강검 청강 = new 청강검(35,40);
조조 맹덕 = new 조조("조조", 600, 15, 35, "조조.png", "조조2.png", 청강);
Win frame = new Win(청룡,운장,쌍고,현덕,장팔,익덕,청강,맹덕);
frame.setVisible(true);
}
}
public class Win extends JFrame {
청룡언월도 청룡 ;
관우 운장 ;
쌍고검 쌍고;
유비 현덕;
장팔사모 장팔;
장비 익덕;
청강검 청강;
조조 맹덕;
public Win(청룡언월도 청룡, 관우 운장,쌍고검 쌍고,유비 현덕,장팔사모 장팔,장비 익덕,청강검 청강,조조 맹덕) {
this.청룡 = 청룡;
this.운장 = 운장;
this.쌍고 = 쌍고;
this.현덕 = 현덕;
this.장팔 = 장팔;
this.익덕 = 익덕;
this.청강 = 청강;
this.맹덕 = 맹덕;
}
}
5.
Win생성자 안에 너무 많은 코드가 들어있어서 보기에 깔끔하지 않음.
-> Win생성자 안의 각 구간을 메서드로 분리하여 가독성을 높임
public class Win extends JFrame {
public Win(청룡언월도 청룡, 관우 운장,쌍고검 쌍고,유비 현덕,장팔사모 장팔,장비 익덕,청강검 청강,조조 맹덕) {
생성_플레이어();
생성_상대생성();
생성_progressbar(상대hp, 상대);
생성_progressbar(플레이어hp, 플레이어);
생성_progressbar(상대mp, 상대);
생성_progressbar(플레이어mp, 플레이어);
}
//생성 함수들 (Win생성자에서 빼옴)
public void 생성_플레이어() {
if (Math.random() * 10 < 3) {
플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 운장.getImgFile1())));
플레이어생성 = 0;
플레이어 = 운장;
} else if (Math.random() * 10 >= 8) {
플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 현덕.getImgFile1())));
플레이어생성 = 1;
플레이어 = 현덕;
} else if (Math.random() * 10 >= 3 && Math.random() <= 4) {
플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 맹덕.getImgFile1())));
플레이어생성 = 2;
플레이어 = 맹덕;
} else {
플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 익덕.getImgFile1())));
플레이어생성 = 3;
플레이어 = 익덕;
}
플레이어초상.setBounds(413, 435, 400, 400);
contentPane.add(플레이어초상);
}
public void 생성_상대생성() {
if (Math.random() * 10 < 2 && 플레이어생성 != 0) {
상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 운장.getImgFile1())));
상대 = 운장;
} else if (Math.random() * 10 >= 8 && 플레이어생성 != 1) {
상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 현덕.getImgFile1())));
상대 = 현덕;
} else if (Math.random() * 10 >= 2 && Math.random() <= 4 && 플레이어생성 != 2) {
상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 맹덕.getImgFile1())));
상대 = 맹덕;
} else if (플레이어생성 != 3) {
상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 익덕.getImgFile1())));
상대 = 익덕;
}
상대캐릭터초상.setBounds(345, 10, 400, 400);
contentPane.add(상대캐릭터초상);
}
public void 생성_progressbar(JProgressBar progressbar, Player 캐릭터) {
progressbar.setFont(new Font("굴림", Font.BOLD, 12));
progressbar.setForeground(new Color(0, 255, 0));
progressbar.setMaximum(캐릭터.getHP());
progressbar.setStringPainted(true);
progressbar.setValue(캐릭터.getHP());
progressbar.setBounds(91, 262, 217, 52);
contentPane.add(progressbar);
}
}
개선된 점
중복되는 코드가 많이 줄어들었고 가독성이 좋아졌다. 특히 Win파일에 main 함수를 삭제하고 변수 생성 -> 생성자 -> 함수 순으로 전체 파일을 정리하여 코드 읽기가 쉬워졌다. 함수도 기존 코드에서는 생성자 안에 있던 생성 함수 -> 기존 코드에도 그대로 있던 함수 순으로 순서를 맞추어 용도가 비슷한 함수들이 순서대로 있을 수 있게 했다.
알아낸 점
내가 작성하지 않은 코드를 수정하는 것은 처음이었는데 도통 어떤 의도로 이런 코드를 작성했는지 알 수가 없어서 앞으로 내가 작성하는 코드에는 주석을 잘 달아야겠다고 생각했다. 주석의 중요성을 알았다. 또 처음에는 무작정 보이는 부분부터 고치다가 생성자가 바뀌는 과정에서 이미지 파일 관련 문제가 발생해서 화면이 안 나왔다. 이후 다시 처음부터 계획을 세워서 고친 후에 완성할 수 있었다. 앞으로는 무작정 시작하는 것보다 전체 코드를 이해하고 어떤 문제가 가장 근본적인지 파악하고 시작하는 것이 좋겠다고 생각했다.
더 개선해보고 싶었으나 무서워서 고치지 못한 부분
1) 무기클래스와 Player의 하위 클래스를 모두 삭제하고 무기들은 무기 클래스형의 객체로, 플레이어들은 Player 클래스형의 객체로 생성하면 어떨까? 무기 쌍고검, 무기 장팔사모, Player 관우, Player 유비 이런 식으로, 그러면 Defend 부분을 어떻게 처리해야 할지 모르겠고, 오히려 메인 코드가 복잡해질 것 같아서 포기했다.
2) 청강검과 쌍고검의 방어하기 함수가 방어완료의 조건 빼고는 모두 같다. 겹치는 듯 하면서 완전히 똑같지는 않으니 그냥 뒀는데 이를 더 간단하게 만들 수 있는 방법이 있는지 궁금하다. 오버라이딩으로 해결할 수 있는 문제일까?
방어하기와 유사하게 공격하는 함수가 4종류 정도 있는데 유사하지만 완전히 똑같지는 않다. 이렇게 미묘하게 다르면 그냥 둬야하는걸까? 플레이어 생성과 상대 생성 부분도 똑같지는 않고 유사하다.
'JAVA' 카테고리의 다른 글
| [JAVA] 디자인 패턴 - 템플릿 메소드 (0) | 2025.10.17 |
|---|---|
| [JAVA] 디자인 패턴 - 전략 (짱구 예제) (0) | 2025.10.15 |
| [JAVA] 커피메이커 Ver.1 (3) | 2025.10.01 |
| [JAVA] Thread (0) | 2025.09.24 |
| [JAVA] Generic & Collection (0) | 2025.09.19 |