ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA연습] 스타크래프트 DOS게임 만들기
    카테고리 없음 2022. 11. 8. 18:19

     

    S_Craft.zip
    0.00MB

     

    [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 등의 습득을 위해 연습했습니다.

Designed by Tistory.