-
[JAVA연습] 스타크래프트 DOS게임 만들기카테고리 없음 2022. 11. 8. 18:19
[SCraft.java]
import java.util.ArrayList;
import java.util.Scanner;
public class S_Craft {
static boolean behavior = true;
static Scanner sc = new Scanner(System.in);
/* Marine m1 = new Marine(); */
static ArrayList<Unit> units = new ArrayList<Unit>();
boolean unitbool = true;
public static void main(String[] args) {
/*
* 여섯번째 연습 하나씩만 생성한 각 유닛이 아니라 유닛을 원하는대로 생성해보기. 그렇게 생성한 유닛들의 리스트를 띄워서 원하는 유닛에게
* 명령을 내려보기.
*
* 목적 컬렉션의 이해 및 사용.
*
* 작업 1.Unit 클래스로 만든 ArrayList생성 2.지금 있는 while 문 밖에 1.유닛생성, 2.유닛명령, 3.게임종료
* while문을 생성. 3.유닛을 생산 할 수 있는 코드 작성 4.유닛 명령을 선택하면 생성된 유닛의 리스트가 나오도록 코드 작성.
* 5.리스트를 보고 유닛을 골라 선택한 유닛에게 명령을 내릴 수 있도록 코드 수정
*
*/
boolean a = true;
while (true) {
System.out.println("명령을 선택하세요.");
System.out.println("----------------------");
System.out.println("1.유닛생산/2.유닛명령/3.게임종료");
System.out.println("----------------------");
int selectOrder = sc.nextInt(); // 유닛생산인지 명령인지 선택하는 변수.
switch (selectOrder) {
case 1:
System.out.println("어떤 유닛을 생산하시겠습니까?");
System.out.println("----------------------");
System.out.println("1.마린/2.탱크/3.레이스/0.취소");
System.out.println("----------------------");
int creatUnit = sc.nextInt();
if (creatUnit == 1) {
System.out.println("마린을 생성합니다.");
units.add(new Marine());
} else if (creatUnit == 2) {
System.out.println("탱크를 생성합니다.");
units.add(new Tank());
} else if (creatUnit == 3) {
System.out.println("레이스를 생성합니다.");
units.add(new Wraith());
} else if (creatUnit == 0) {
}
break;
case 2:
if (units.isEmpty()) {
System.out.println("생선된 유닛이 없습니다. 유닛을 생산해주세요.");
continue;
}
// 유닛이 없을시 생략
while (true) {
System.out.println("유닛을 선택해주세요.");
System.out.println("----------------------");
for (int i = 0; i < units.size(); i++) {
if (units.get(i) instanceof Marine) {
System.out.println((i + 1) + ".마린" + "\t");
} else if (units.get(i) instanceof Tank) {
System.out.println((i + 1) + ".탱크" + "\t");
} else if (units.get(i) instanceof Wraith) {
System.out.println((i + 1) + ".레이스" + "\t");
}
}
System.out.println("----------------------");
int selectUnit = sc.nextInt();
order(units.get(selectUnit - 1));
break;
}
case 3:
System.out.println("게임을 종료합니다.");
System.exit(0);
break;
default:
break;
}
} // end of outer While
}// end of main
public static void order(Unit unit) {
behavior = true;
String name = "";
while (behavior) {
if (unit instanceof Marine) {
name = "마린";
} else if (unit instanceof Tank) {
name = "탱크";
} else if (unit instanceof Wraith) {
name = "레이스";
}
System.out.println(name + "의 행동을 선택해주세요.");
if (unit instanceof Tank) {
System.out.println("---------------------------------------");
System.out.println("1.이동/ 2.공격 / 3.공업 / 4.방업 / 5.시즈모드 ㅣ 0.행동종료 ");
System.out.println("---------------------------------------");
} else
System.out.println("1.이동/ 2.공격 / 3.공업 / 4.방업 ㅣ 0.행동종료 ");
int select = sc.nextInt();
switch (select) {
case 1:
// 형변환을 해주는 이유 : 마린,탱크, 레이스가 flyable이나 movable을 상속 받아서 사용할 수 있다고
// 하더라도 order() 메서드에 파라미터로 받는 것은 Unit이므로 Flyable이나 Movable 인터페이스의 객체는 아니다.
// 따라서 형변환을 해줘야한다.
if (unit instanceof Flyable)
((Flyable) unit).fly();
else if (unit instanceof Movable)
((Movable) unit).move();
// if(unit instanceof Wraith) { ((Wraith)unit).fly();} else
// ((Movable)unit).move();
/*
* if (unit instanceof Marine) ((Marine)unit).move(); else if (unit instanceof
* Tank) ((Tank)unit).move(); else if (unit instanceof Tank)
* ((Wraith)unit).fly();
*/
break;
case 2:
unit.attack();
break;
case 3:
if (unit instanceof Marine)
unit.aUP(1);
else if (unit instanceof Tank)
unit.aUP(3);
else if (unit instanceof Tank)
unit.aUP(2);
break;
case 4:
if (unit instanceof Marine)
unit.dUP(1);
else
unit.dUP(2);
break;
case 0:
System.out.println("행동을 종료합니다.");
behavior = false;
break;
case 5:
if (unit instanceof Tank)
((Tank) unit).siegeMode();
break;
default:
break;
}
}
}
}// end of class[unit.java]
import java.util.Scanner;
public abstract class Unit {
String unitName;
int life;
int aPoint;
int defence;
int speed;
int max_aPoint;
int max_dPoint;
void attack() {
System.out.println("공격합니다.");
int damage = (int) ((aPoint + 1) * Math.random()); // 0.0~0.9999...
System.out.println(damage + "의 데미지를 주었습니다.");
}
void aUP(int uPoint) {
if (aPoint < max_aPoint) {
System.out.println("공격력 업그레이드"+uPoint);
aPoint += uPoint;
System.out.println("공격력은" + aPoint + "입니다.");
} else {
System.out.println("더 이상 업그레이드가 불가능 합니다.");
}
}
void dUP(int uPoint) {
if (defence < max_dPoint) {
System.out.println("방어력 업그레이드"+uPoint);
defence += uPoint;
System.out.println("방어력은" + defence + "입니다.");
} else {
System.out.println("더 이상 업그레이드가 불가능 합니다.");
}
}
}[movalbe & flyable]
public interface Movable {
public void move();
}package day1028.S_Craft;
public interface Flyable {
public void fly();
}[Marine.java]
import java.util.Scanner;
public class Marine extends Unit implements Movable {
public Marine() {
this.life = 50; // 체력
this.aPoint = 5; // 공격력
this.defence = 0; // 방어력
this.speed = 5; // 속도
this.max_aPoint = 8;
this.max_dPoint = 3;
}
public Marine(int l, int a) {
this.life = l; // 체력
this.aPoint = a; // 공격력
this.defence = 0; // 방어력
this.speed = 5; // 속도
this.max_aPoint = a + 3;
this.max_dPoint = 3;
}
@Override
public void move() {
System.out.println("좌표를 입력하세요.");
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
System.out.println("(" + x + ", " + y + ")로 이동합니다.");
}
}[Wraith.java]
import java.util.Scanner;
public class Wraith extends Unit implements Flyable{
public Wraith() {
this.life = 100; // 체력
this.aPoint = 10; // 공격력
this.defence = 0; // 방어력
this.speed = 10; // 속도
this.max_aPoint = 16;
this.max_dPoint = 6;
}
@Override
public void fly() {
System.out.println("[공중]좌표를 입력하세요.");
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
System.out.println("[공중](" + x + ", " + y + ")로 이동합니다.");
}
}[Tank.java]
import java.util.Scanner;
public class Tank extends Unit implements Movable {
boolean tankMode = false;
public Tank() {
this.life = 150; // 체력
this.aPoint = 30; // 공격력
this.defence = 2; // 방어력
this.speed = 5; // 속도
this.max_aPoint = 39;
this.max_dPoint = 8;
}
@Override
public void move() {
Scanner sc = new Scanner(System.in);
if (tankMode == false) {
System.out.println("좌표를 입력하세요.");
int x = sc.nextInt();
int y = sc.nextInt();
System.out.println("(" + x + ", " + y + ")로 이동합니다.");
} else {
System.out.println("이동 할 수 없습니다.");
}
}
void siegeMode() {
// 시즈모드 행동...
if (tankMode == false) {
System.out.println("시즈모드 ON");
tankMode = true;
} else {
tankMode = false;
System.out.println("시즈모드OFF");
}
}
}인터페이스, 상속관계, ArrayList, Override, Overloading 등의 습득을 위해 연습했습니다.