June is Combung

인터페이스 예제 (전투게임) 본문

java/객체지향

인터페이스 예제 (전투게임)

june__Park 2021. 3. 25. 00:25
package test;

import java.util.Random;

class Unit {
	Random rd = new Random();
	final int MAX_HP; // 상수는 무조건 대문자
	int hp;
	String name;

	Unit(int hp, String name) {
		MAX_HP = hp;
		this.hp = hp;
		this.name = name;
	}

	void attack(Unit unit, int range1, int range2) {
		int attackhp = rd.nextInt((range2 - range1) + 1) + range1;
		unit.hp = unit.hp - attackhp;
		System.out.printf("%s가 %s %d 공격 (%d / %d) \n", name, unit.name, attackhp, unit.hp, unit.MAX_HP);
	}
}

class AirUnit extends Unit {
	AirUnit(int hp, String name) {
		super(hp, name); // 부모 생성자에 접근 : 부모안에 상수가 무조건 초기값을 가져야 하기때문에
		// 생성할때 반드시 초기값을 넣어줘야됨
	}
}

class GroundUnit extends Unit {
	GroundUnit(int hp, String name) {
		super(hp, name);
	}
}

interface Heal {
} // 사람만 hp 줄수 있음

interface Repair {
} // 기계만 hp 줄수있음

class Tank extends GroundUnit implements Repair {
	Tank() {
		super(150, "탱크");
	}

	@Override
	public String toString() {
		return "Tank [hp = " + hp + "]";
	}
}

class Zat extends AirUnit {
	Zat() {
		super(100, "제트");
	}

	@Override
	public String toString() {
		return "Zat [hp = " + hp + "]";
	}
}

class FixMechine extends GroundUnit implements Repair {
	FixMechine() {
		super(120, "수리기계");
	}

	@Override
	public String toString() {
		return "FixMechine [hp = " + hp + "]";
	}

	// 수리할 수 있는 기능
	void repairHp(Repair repair) {
		Unit unit = (Unit) repair; // 여러개의 클래스가 있는데 unit 상속받은애 ,
									// repair 상속받은 애만 수리할 수 있음
		// 그래서 unit 타입 이기 때문에 unit 안에 들어가 있는 애만 접근 가능하다
		// MAX_HP ,hp , name 접근이 가능하다
		unit.hp = unit.hp + 10;
		System.out.printf("%s: 수리 완료 %d/%d \n", unit.name, unit.hp, unit.MAX_HP);
	}
}

class Solider extends GroundUnit implements Heal {
	Solider() {
		super(120, "파이터");
	}
}

class Fighter extends GroundUnit implements Heal {
	Fighter() {
		super(100, "솔져");
	}
}

class Healer extends AirUnit implements Heal {
	Healer() {
		super(80, "힐러");
	}

	void heal(Heal heal, int range1, int range2) {
		Unit unit = (Unit) heal;
		int healHp = rd.nextInt((range2 - range1) + 1) + range1;
		;
		unit.hp = unit.hp + healHp;
		System.out.printf("%s: 힐(+%d) 완료 %d/%d \n", unit.name, healHp, unit.hp, unit.MAX_HP);
	}
}

public class interfaceEx {
	public static void main(String[] args) {
		Tank tank = new Tank();
		Zat zat = new Zat();
		FixMechine fx = new FixMechine();
		Fighter fighter = new Fighter();
		Healer healer = new Healer();
		Solider solider = new Solider();
		tank.attack(zat, 6, 12);
		tank.attack(zat, 6, 12);
		tank.attack(zat, 6, 12);
		zat.attack(tank, 5, 8);
		zat.attack(tank, 5, 8);
		fx.repairHp(tank);
		// fx.repairHp(zat); implement Repair zat 클래스에 없어서 불가능
		// 힐러 80 , 파이터 120 , 솔저 만들고 100
		// 탱크 파이터 공격 (5 - 15 )
		// 솔저 탱크 (10 - 18), 제트기 공격
		// 힐러가 파이터 힐 (6- 13)
		tank.attack(fighter, 5, 15);
		solider.attack(tank, 10, 18);
		healer.heal(fighter, 6, 13);
	}
}

'java > 객체지향' 카테고리의 다른 글

메서드 오버로딩과 오버라이딩  (0) 2021.03.25
병원 (완성)  (0) 2021.03.25
날짜와 시간  (0) 2021.03.25
도서관리  (0) 2021.03.25
병원  (0) 2021.03.25
Comments