Main 클래스에서의 무기들(청룡언월도, 쌍고검, 장팔사모, 청강검) 값 초기화
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", "장비2.png", 장팔);
청강검 청강 = new 청강검(35,40);
조조 맹덕 = new 조조("조조", 600, 15, 35, "조조.png", "조조2.png", 청강);
// 무기 플레이어무기 = 운장.전용무기;
// int 무기필요mp = 청룡.필요mp;
System.out.println(운장.전용무기.get필요mp());
}
}
Win 클래스에서의 무기들(청룡언월도, 쌍고검, 장팔사모, 청강검) 값 초기화
public class Win extends JFrame {
private JPanel contentPane;
private JTextArea ta;
/**
* Launch the application.
*/
청룡언월도 청룡 = new 청룡언월도(50, 90);
관우 운장 = new 관우("관우", 500, 50, 10, "관우.png", "관우2.png", 청룡);
쌍고검 쌍고 = new 쌍고검(30, 30);
유비 현덕 = new 유비("유비", 900, 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 클래스 내에서 플레이어 생성
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;
플레이어 = 익덕;
}
Win 클래스 내에서상대 생성
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())));
상대 = 익덕;
캐릭터 랜덤 생성을 위해서 Math.random을 쓴건 알겠으나, Math.random을 if문 마다 돌리면 값이 일정하게 정해져 있지 않기 때문에 캐릭터 랜덤 생성에 문제가 생길 수 있어 보임. 변수를 플레이어 자신과 상대방으로 하나씩 만들어서 랜덤 출력값을 넣어놓고 그 값에 대한 if문으로 변경해야할 듯.
Win 클래스 내에서 플레이어 생성
int random1 = (int)(Math.random()*10);
if (random1 < 3) {
플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 운장.getImgFile1())));
플레이어생성 = 0;
플레이어 = 운장;
} else if (random1 >= 8) {
플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 현덕.getImgFile1())));
플레이어생성 = 1;
플레이어 = 현덕;
} else if (random1 >= 3 && random1 <= 4) {
플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 맹덕.getImgFile1())));
플레이어생성 = 2;
플레이어 = 맹덕;
} else {
플레이어초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 익덕.getImgFile1())));
플레이어생성 = 3;
플레이어 = 익덕;
}
Win 클래스 내에서 상대 생성
int random2 = (int)(Math.random()*10);
if (random2 < 2 && 플레이어생성 != 0) {
상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 운장.getImgFile1())));
상대 = 운장;
} else if (random2 >= 8 && 플레이어생성 != 1) {
상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 현덕.getImgFile1())));
상대 = 현덕;
} else if (random2 >= 2 && random2 <= 4 && 플레이어생성 != 2) {
상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 맹덕.getImgFile1())));
상대 = 맹덕;
} else if (플레이어생성 != 3) {
상대캐릭터초상.setIcon(new ImageIcon(Win.class.getResource("/image/" + 익덕.getImgFile1())));
상대 = 익덕;를 입력하세요
public interface Defend {
public void 방어하기();
}
public class 쌍고검 extends 무기 implements Defend {
public boolean 방어완료;
@Override
public void 방어하기() {
int 방어확률 = (int) (Math.random() * 100);
if (방어확률 < 20) {
this.방어완료 = true;
} else
this.방어완료 = false;
}
public class 청강검 extends 무기 implements Defend {
public boolean 방어완료;
@Override
public void 방어하기() {
int 방어확률 = (int) (Math.random() * 100);
if (방어확률 < 15) {
this.방어완료 = true;
} else
this.방어완료 = false;
}
쌍고검과 청강검에서 Defend의 기능이 있어서 interface까지 만들어서 오버라이드를 하였지만, 막상 Defend 인터페이스에는 아무런 바디가 구현되어 있지 않아(추상클래스?), 반복을 줄였다거나 통일감을 만들었다거나 하는 장점이 없어보임.
인터페이스를 더 활용하기 위해 Defend에 방어확률 숫자 인자를 통해 if문을 안에서 방어를 성공했는지 여부를 알려주는 바디를 구현함으로써
청강검과 쌍고검에서는 상속을 통해 숫자 인자만 넣으면 성공확률을 알 수 있게 한다면 코드가 훨씬 간결해질 수 있을듯.
상위 인터페이스






여기서 MyRemoteControl에서 RemoteRole을 상속을 이미 했는데 굳이 오버라이드를 해야하는 이유?
1. 클래스를 상속했을 경우: 오버라이드 없이 상위클래스의 메서드를 사용할 수 있다.
2. 인터페이스를 구현할 경우: 말 그대로 '구현'하는 것이기 때문에 바디를 오버라이드를 통해 하위클래스에서 구현해야한다(추상메서드).
만약 인터페이스의 바디를 상위 인터페이스에서 이미 구현했다면?
이때에는 하위클래스에서 구현없이 default를 통해 바로 사용할 수 있다.
(RemoteRole은 내용이 비어있는 인터페이스(껍데기)이기 때문에, 이를 가져다 쓰는 MyRemoteControl은 반드시 오버라이드를 통해 그 빈 공간을 채워주어야 정상적으로 작동함.)


엄마 클래스에서 왜 핸드폰 핸드폰bag이 되는걸까?
핸드폰: 자료형
핸드폰bag: 변수
수정 전

수정 전의 코드는 엄마의 핸드폰bag에 있는 핸드폰을 그저 짱구가 복사하였기에 뺏어간 후에도 엄마의 핸드폰bag에 핸드폰이 남아있는 문제 발생.
수정후
public void 핸드폰뺏기(엄마 엄) {
if (엄.핸드폰압수bag != null) {
this.phone = 엄.핸드폰압수bag;
엄.핸드폰압수bag = null; //추가된부분
System.out.println("핸드폰 뺏기 성공!");
}
엄마의 핸드폰bag을 null로 초기화함으로써 핸드폰이 2개가 되는 문제 해결.
