자바 언어를 활용하여 스타크래프와 비슷한 기능을 하는 프로그램을 제작해보았다.
프로그램은 아래의 형태와 같은 구조를 지닌다.
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 |
---|