본문 바로가기
Java/기본 개념 및 클래스

[Java] 27. Java로 스타크래프트 모델링하기

글: Song hyun 2024. 4. 18.
728x90
반응형

[Java] 27. Java로 스타크래프트 모델링하기

모델링 과정

1. 질럿, 저글링, 마린 클래스 생성하기

(1) 클래스마다 사용자 정의 생성자 만들기

(2) 클래스 별로 공격할 때/공격 받았을 때의 메서드 만들기

 

2. 게이트웨이 클래스 생성하기

(1) 게이트웨이 클래스 내부에 질럿, 저글링, 마린 클래스를 생성하는 메서드 만들기


1. 질럿, 저글링, 마린 클래스 생성하기

(1) 클래스마다 사용자 정의 생성자 만들기

-Zealot, Marine, Zergling 세 클래스는 모두 동일한 멤버변수 name, hp, power를 지닌다. 

이 때, 외부에서 멤버변수에 접근하거나 초기화할 수 없도록 private 접근 제어자를 넣는다.

 

(2) 클래스 별로 공격할 때/공격 받았을 때의 메서드 만들기

-각각의 클래스마다 beAttacked/attack(클래스명)의 메서드를 만든다.

이 때, attack 메서드는 각각의 beAttacked 메서드를 인용해 총 3개를 만든다.

=>모든 attack 메서드는 실행시 beAttacked 메서드를 실행하는 식이다.

beAttacked는 해당 객체의 power를 공격받은 객체의 health에서 감한 후, 공격 지문을 출력한다.

 


2. 게이트웨이 클래스 생성하기

(1) 게이트웨이 클래스 내부에 질럿, 저글링, 마린 클래스를 생성하는 메서드 만들기

-게이트웨이 클래스는 gatewayNumber(번호)/count(생산횟수)라는 변수를 가진다. 

 

-예시: createZealot이라는 이름의 질럿 생산 메서드가 있다고 생각해보자.

createZealot메서드는 호출시 count 변수에 1을 더하고, 새로운 Zealot 클래스 객체를 생성한다. 

 


 

 

package starcraft.ver01;

public class Zealot {
	private String name;
	private int power;
	private int hp;

	// Zealot 클래스의 사용자 정의 생성자
	public Zealot(String name) {
		this.name = name;
		power = 5;
		hp = 80;
	}

	// 각 변수의 getter 메서드
	public String getName() {
		return name;
	}

	public int getPower() {
		return power;
	}

	public int gerHp() {
		return hp;
	}

	// 질럿이 저글링을 공격합니다.
	public void attackZergling(Zergling z) {
		System.out.println("[" + this.name + "]이 [" + z.getName() + "]을 공격합니다.");
		z.beAttacked(this.power); // 질럿의 공격력을 beAttacked 메서드에 대입
	}

	// 질럿이 마린을 공격합니다.
	public void attackMarine(Marine m) {
		System.out.println("[" + this.name + "]이 [" + m.getName() + "]을 공격합니다.");
		m.beAttacked(this.power);
	}

	// 자신이 공격을 당합니다.
	public void beAttacked(int power) {
		// 방어적 코드 작성
		// 80--75 = 5
		// 5--75 = 0
		if (hp <= 0) {
			System.out.println("[" + this.name + "]은 이미 사망했습니다.");
			hp = 0;
			return;
		}
		hp -= power;
	}
	
	public void showInfo() {
		System.out.println("=====상태창=====");
		System.out.println(" 이름: "+this.name);
		System.out.println(" 공격력: "+this.power);
		System.out.println(" 생명력: "+this.hp);
	}

}
package starcraft.ver01;

public class Zergling {
	private String name;
	private int power;
	private int hp;

	public Zergling(String name) {
		this.name = name;
		power = 3;
		hp = 50;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPower() {
		return power;
	}

	public void setPower(int power) {
		this.power = power;
	}

	public int getHp() {
		return hp;
	}

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

	// get,set 메서드
	// 단축키 : 알트+시프트+s

	// 저글링이 질럿을 공격합니다. attackZealot
	public void attackZealot(Zealot z) {
		System.out.println("[" + this.name + "]이 [" + z.getName() + "]을 공격합니다.");
		z.beAttacked(this.power);
	}

	// 저글링이 마린을 공격합니다. attackMarine
	public void attackMarine(Marine m) {
		System.out.println("[" + this.name + "]이 [" + m.getName() + "]을 공격합니다.");
		m.beAttacked(this.power);
	}

	// 공격을 당할 때
	public void beAttacked(int power) {
		// 방어적 코드 작성
		if (hp <= 0) {
			System.out.println("[" + this.name + "]은 이미 사망했습니다.");
			hp = 0;
			return;
		}
		hp -= power;
	}
	
	public void showInfo() {
		System.out.println("=====상태창=====");
		System.out.println(" 이름: "+this.name);
		System.out.println(" 공격력: "+this.power);
		System.out.println(" 생명력: "+this.hp);
	}

}
package starcraft.ver01;

public class Marine {
	private String name;
	private int power;
	private int hp;

	public Marine(String name) {
		this.name = name;
		power = 4;
		hp = 70;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPower() {
		return power;
	}

	public void setPower(int power) {
		this.power = power;
	}

	public int getHp() {
		return hp;
	}

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

	// 마린이 질럿을 공격합니다.
	public void attackZealot(Zealot z) {
		System.out.println("[" + this.name + "]이 [" + z.getName() + "]을 공격합니다.");
		z.beAttacked(this.power);
	}

	// 마린이 저글링을 공격합니다.
	public void attackZergling(Zergling z) {
		System.out.println("[" + this.name + "]이 [" + z.getName() + "]을 공격합니다.");
		z.beAttacked(this.power);
	}

	// 공격을 당할 때
	public void beAttacked(int power) {
		// 방어적 코드 작성
		if (hp <= 0) {
			System.out.println("[" + this.name + "]은 이미 사망했습니다.");
			hp = 0;
			return;
		}
		hp -= power;
	}
	
	public void showInfo() {
		System.out.println("=====상태창=====");
		System.out.println(" 이름: "+this.name);
		System.out.println(" 공격력: "+this.power);
		System.out.println(" 생명력: "+this.hp);
	}

}
728x90
반응형