[JAVA]스타크래프트
SW개발/JAVA

[JAVA]스타크래프트

자바 언어를 활용하여 스타크래프와 비슷한 기능을 하는 프로그램을 제작해보았다.

프로그램은 아래의 형태와 같은 구조를 지닌다.

 

건물의 상속도
유닛의 상속도
게임 클래스 다이어그램

Game 클래스

import java.util.Scanner;

public class Game {
	static int people = 0; //현재 인구수.
	static int people_limit = 10; //제한 인구수.(총 200까지 늘어남)

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int select;
		int build;
		CommandCenter c = new CommandCenter(); //객체 생성.
		SupplyDepot s = new SupplyDepot();
		Barrack b = new Barrack();
		SCV scv = new SCV();
		Marine marine = new Marine();
		Firebat firebat = new Firebat();
		Medic medic = new Medic();

		while (true) { //반복문 수행.

			System.out.println("동작하고 싶은 기능의 번호를 입력해주세요.");
			System.out.print("1.건물건설 2.유닛조회 3.유닛생성 4.유닛삭제 5.건물파괴 : ");
			select = sc.nextInt();
			switch (select) { //동작 기능에 따라 switch case 문 실행.
			case 1: //건물 건설.
				System.out.println("건설하고 싶은 건물의 번호를 입력해주세요.");
				System.out.print("1.커맨드센터 2.서플라이디폿 3.배럭 (그 외 : 메뉴 처음으로) : ");
				build = sc.nextInt();
				if (build == 1) {
					if (c.isBuild(c.build()) == 1) { //건설 완료시.
						System.out.println("커맨드센터 건설을 완료하였습니다.");
					} else {
						System.out.println("커맨드센터 건설에 실패하였습니다.");
					}
				} else if (build == 2) {
					if (c.command_check == 0) {
						System.out.println("서플라이디폿을 짓기 위해서는 커맨드센터가 필요합니다.");
					} else {
						if (s.isBuild(s.build()) == 1) {
							System.out.println("서플라이디폿 건설을 완료하였습니다.");
							System.out.println("인구 수 : " + people + " / " + people_limit);
						} else {
							System.out.println("서플라이디폿 건설에 실패하였습니다.");
						}
					}
				} else if (build == 3) {
					if (c.command_check == 0) {
						System.out.println("배럭을 짓기 위해서는 커맨드센터가 필요합니다.");
					} else {
						if (b.isBuild(b.build()) == 1) {
							System.out.println("배럭 건설을 완료하였습니다.");
						} else {
							System.out.println("배럭 건설에 실패하였습니다.");
						}
					}
				} else {
					continue;
				}
				break;
			case 2: //유닛조회.
				System.out.println("생성된 유닛 목록");
				scv.printUnitPopulation();
				marine.printUnitPopulation();
				firebat.printUnitPopulation();
				medic.printUnitPopulation();
				break;
			case 3: //유닛생성.
				System.out.println("생산가능한 유닛 종류");
				if (c.command_check >= 1) {
					System.out.printf("SCV ");
					if (b.barrack_check >= 1) {
						System.out.printf("Marine Firebat Medic");
					}
					System.out.println("\n생산할 유닛을 고르세요.");
					System.out.println("1.SCV 2.Marine 3.Firebat 4.Medic (그 외 : 메뉴 처음으로)");
					int unit_sel;
					unit_sel = sc.nextInt();
					if (unit_sel == 1) {
						scv.printUnitInfo();
						c.scv();
					} else if (unit_sel == 2) {
						if (b.barrack_check >= 1) {
							marine.printUnitInfo();
							b.marine();
						} else {
							System.out.println("배럭이 없어 Marine을 생산할 수 없습니다.");
						}
					} else if (unit_sel == 3) {
						if (b.barrack_check >= 1) {
							firebat.printUnitInfo();
							b.firebat();
						} else {
							System.out.println("배럭이 없어 Firebat을 생산할 수 없습니다.");
						}
					} else if (unit_sel == 4) {
						if (b.barrack_check >= 1) {
							medic.printUnitInfo();
							b.medic();
						} else {
							System.out.println("배럭이 없어 Medic을 생산할 수 없습니다.");
						}
					} else {
						continue;
					}
				} else {
					System.out.println("생산가능한 유닛이 없습니다.");
				}
				break;
			case 4: //유닛삭제.
				if (c.scv <= 0 && b.marine <= 0 && b.firebat <= 0 && b.medic <= 0) {
					System.out.println("삭제할 유닛이 없습니다.");
				} else {
					System.out.println("현재 생성된 유닛 목록 : SCV : " + c.scv + " 마리, Marine : " + b.marine + " 마리, Firebat : "
							+ b.firebat + " 마리, Medic : " + b.medic + " 마리");
					System.out.println("삭제할 유닛을 고르세요.");
					System.out.println("1.SCV 2.Marine 3.Firebat 4.Medic (그 외 : 메뉴 처음으로)");
					int unit_del;
					unit_del = sc.nextInt();
					if (unit_del == 1) {
						scv.killUnit();
						scv.printUnitPopulation();
					} else if (unit_del == 2) {
						marine.killUnit();
						marine.printUnitPopulation();
					} else if (unit_del == 3) {
						firebat.killUnit();
						firebat.printUnitPopulation();
					} else if (unit_del == 4) {
						medic.killUnit();
						medic.printUnitPopulation();
					} else {
						continue;
					}
				}
				break;
			case 5 : //건물파괴.
				System.out.println("파괴할 건물을 고르세요.");
				System.out.println("1.CommandCenter 2.SupplyDepot 3.Barrack (그 외 : 메뉴 처음으로)");
				int building_del;
				building_del = sc.nextInt();
				if (building_del == 1) {
					c.destroy();
				}
				else if (building_del == 2) {
					s.destroy();
				}
				else if (building_del == 3) {
					b.destroy();
				}
				else {
					continue;
				}
				break;
			default:
				System.out.println("비정상적인 입력입니다.");
			}
		}
	}

}

 

Building 클래스

import java.util.Scanner;

public class Building {
	public int check = 0;
	Game gm = new Game(); //객체 생성.

	public int isBuild(int x) {
		if (x == 1) {
			return 1;
		} else {
			return 0;
		}
	}

	public int build() {
		check++;
		return 1;
	}

	public void destroy() {
		check--;
	}
}

class CommandCenter extends Building { //빌딩 클래스 상속받음.
	public int command_check = 0;
	public static int scv = 0;

	@Override
	public int build() { //메소드 오버라이딩. 커맨드 센터에 맞게 변경.
		if (command_check >= 1) { //커맨드 1개로 제한.
			System.out.println("더이상 커맨드를 건설할 수 없습니다.");
			return 0;
		} else {
			command_check++; 
			return 1;
		}
	}

	public void destroy() {
		if (command_check <= 0) {
			System.out.println("파괴할 커맨드가 존재하지 않습니다.");
		} else {
			command_check--;
			System.out.println("커맨드를 파괴하였습니다.");
		}
	}

	public void scv() {
		if(gm.people >= gm.people_limit ) { //인구수를 체크하여 scv 생산여부 결
			System.out.println("인구수가 모자랍니다.");
			System.out.println("인구 수 : "+gm.people+" / "+gm.people_limit);
		}
		else {
			scv++;
			gm.people++;
			System.out.println("scv가 생산되었습니다.");
			System.out.println("인구 수 : "+gm.people+" / "+gm.people_limit);
		}
	}
}

class SupplyDepot extends Building {
	public int supply_check = 0;
	public int supply = 0;

	@Override
	public int build() { //메소드 오버라이딩.
		if(gm.people_limit>=200) { //인구수 200 넘을 시 서플라이 디폿 건설 불가.
			System.out.println("더이상 서플라이디폿을 건설할 수 없습니다.");
			return 0;
		}
		else {
			supply_check++; //서플라이 갯수 카운트.
			gm.people_limit += 10; //제한 인구수 10 증가.
			return 1;
		}
	}

	public void destroy() {
		if (supply_check <= 0) {
			System.out.println("파괴할 서플라이디폿이 존재하지 않습니다.");
		} else {
			supply_check--;
			gm.people_limit-=10; //파괴시 인구수 -10
			System.out.println("서플라이디폿을 한 개 파괴하였습니다.");
			System.out.println("인구 수 : "+gm.people+" / "+gm.people_limit);
		}
	}

}

class Barrack extends Building {
	public int barrack_check = 0;
	public static int marine = 0;
	public static int firebat = 0;
	public static int medic = 0;

	@Override
	public int build() {  //메소드 오버라이딩.
		if (barrack_check >= 1) {
			System.out.println("더이상 배럭을 건설할 수 없습니다.");
			return 0;
		} else {
			barrack_check++;
			return 1;
		}
	}
	public void destroy() {
		if(barrack_check <=0) {
			System.out.println("파괴할 배럭이 존재하지 않습니다.");
		}
		else {
			barrack_check--;
			System.out.println("배럭을 한 개 파괴하였습니다.");
		}
	}

	public void marine() {
		if(gm.people >= gm.people_limit) { //인구수 모자를 시 유닛 생성 불가.
			System.out.println("인구수가 모자랍니다.");
			System.out.println("인구 수 : "+gm.people+" / "+gm.people_limit);
		}
		else {
			marine++;
			gm.people++;
			System.out.println("marine을 생산하였습니다.");
			System.out.println("인구 수 : "+gm.people+" / "+gm.people_limit);
		}
	}

	public void firebat() {
		if(gm.people >= gm.people_limit) {
			System.out.println("인구수가 모자랍니다.");
			System.out.println("인구 수 : "+gm.people+" / "+gm.people_limit);
		}
		else {
			firebat++;
			gm.people++;
			System.out.println("firebat을 생산하였습니다.");
			System.out.println("인구 수 : "+gm.people+" / "+gm.people_limit);
		}
	}

	public void medic() {
		if(gm.people >= gm.people_limit) {
			System.out.println("인구수가 모자랍니다.");
			System.out.println("인구 수 : "+gm.people+" / "+gm.people_limit);
		}
		else {
			medic++;
			gm.people++;
			System.out.println("medic을 생산하였습니다.");
			System.out.println("인구 수 : "+gm.people+" / "+gm.people_limit);
		}
	}
}

 

 

Unit 클래스

import java.util.Scanner;

public class Unit {
	Game gm = new Game();
	CommandCenter c = new CommandCenter();
	Barrack b = new Barrack();
	
	int people = 0;
	int unit = 0;
	int unit_p = 1;
	int hp, attack, defend = 0;
	public void killUnit() {
		unit --;
		people --;
	}
	public void printUnitInfo() {
		System.out.println("유닛의 체력 : "+hp+", 공력력 : "+attack+", 방어력 : "+defend+", 인구수 : "+unit_p);
	}
	public void printUnitPopulation() {
		System.out.println("해당 유닛의 수 : "+unit+", 사용중인 인구 수 : "+(unit*unit_p));
	}
}

class SCV extends Unit{ //유닛 클래스 상속받아 사용.
	int scv_hp, scv_attack, scv_defend, scv_p;
	SCV(){ //생성자로 유닛에 대한 정보 넣기.
		scv_hp = 60;
		scv_attack = 5;
		scv_defend = 0;
		scv_p = 1;
	}
	CommandCenter c = new CommandCenter();
	
	@Override
	public void killUnit() { //메소드 오버라이딩. killUnit 함수에 맞게 변형.
		if (c.scv <=0) {
			System.out.println("삭제할 SCV가 존재하지 않습니다.");
		}
		else {
			c.scv--;
			gm.people--; //유닛 삭제 시 인구수, scv수 줄임.
		}
	}
	public void printUnitInfo() { //유닛 정보 출력.
		System.out.println("유닛의 체력 : "+scv_hp+", 공력력 : "+scv_attack+", 방어력 : "+scv_defend+", 인구수 : "+scv_p);
	}
	public void printUnitPopulation() { //현재 있는 유닛 수와 사용중인 인구 수 출력.
		System.out.println("scv 수 : "+c.scv+", 사용중인 인구 수 : "+(c.scv*scv_p));
	}
	
	
}
class Marine extends Unit{
	int marine_hp, marine_attack, marine_defend, marine_p;
	Marine(){
		marine_hp = 50;
		marine_attack = 6;
		marine_defend = 0;
		marine_p = 1;
	}
	
	@Override
	public void killUnit() { //메소드 오버라이딩.
		if(b.marine <=0) {
			System.out.println("삭제할 marine이 존재하지 않습니다.");
		}
		else {
			b.marine--;
			gm.people--;
		}
	}
	public void printUnitInfo() {
		System.out.println("유닛의 체력 : "+marine_hp+", 공력력 : "+marine_attack+", 방어력 : "+marine_defend+", 인구수 : "+marine_p);
	}
	public void printUnitPopulation() {
		System.out.println("marine 수 : "+b.marine+", 사용중인 인구 수 : "+(b.marine*marine_p));
	}
	
}
class Firebat extends Unit{
	int firebat_hp, firebat_attack, firebat_defend, firebat_p;
	Firebat(){
		firebat_hp = 50;
		firebat_attack = 16;
		firebat_defend = 1;
		firebat_p = 1;
	}
	
	@Override
	public void killUnit() {
		if(b.firebat <=0) {
			System.out.println("삭제할 firebat이 존재하지 않습니다.");
		}
		else {
			b.firebat--;
			gm.people--;
		}
	}
	public void printUnitInfo() {
		System.out.println("유닛의 체력 : "+firebat_hp+", 공력력 : "+firebat_attack+", 방어력 : "+firebat_defend+", 인구수 : "+firebat_p);
	}
	public void printUnitPopulation() {
		System.out.println("firebat 수 : "+b.firebat+", 사용중인 인구 수 : "+(b.firebat*firebat_p));
	}
	
}
class Medic extends Unit{
	int medic_hp, medic_attack, medic_defend, medic_p;
	Medic(){
		medic_hp = 60;
		medic_attack = 0;
		medic_defend = 1;
		medic_p = 1;
	}
	
	@Override
	public void killUnit() {
		if(b.medic <=0 ) {
			System.out.println("삭제할 medic이 존재하지 않습니다.");
		}
		else {
			b.medic--;
			gm.people--;
		}
	}
	public void printUnitInfo() {
		System.out.println("유닛의 체력 : "+medic_hp+", 공력력 : "+medic_attack+", 방어력 : "+medic_defend+", 인구수 : "+medic_p);
	}
	public void printUnitPopulation() {
		System.out.println("medic 수 : "+b.medic+", 사용중인 인구 수 : "+(b.medic*medic_p));
	}
	
}

 

728x90

'SW개발 > JAVA' 카테고리의 다른 글

[JAVA]스타크래프트 프로그램  (0) 2020.11.01