프로그래밍 언어 복습/JAVA

#56 JAVA 스타그래프트 게임

사재원 교수 2022. 6. 11. 22:44

아직 완벽히 숙지는 안됬지만 중간중간 강사님 코드를 훔쳐보며 스스로 할줄은 알게 된듯 하다.

기록목적으로 일단 올려봅니다 :)

 

[테란팀] 마린 3마리 VS [저그팀] 저글링 1마리 히드라 1마리

전투를 하는 게임입니다.

 

[기본 셋팅]

package NewProject;

class Unit{
	int price;
	int hp;
	int attack;
	int defence;
	String target;
	double speed;
	String characteristic;
	
	Unit(int price, int hp, int attack, int defence, String target, double speed, String characteristic){
		this.price = price;
		this.hp = hp;
		this.attack = attack;
		this.defence = defence;
		this.target = target;
		this.speed = speed;
		this.characteristic = characteristic;
	}
	
}


class Juggling extends Unit{
	Juggling(){
		super(50, 35, 5, 0, "지상", 2.612, "지상,소형,생체");
	}
	void print() {//출력
		System.out.println("저글링의 생산비용은 미네랄 :"+price+", 체력: "+hp+", 공격력: "+attack+" 방어력: "+defence+
				"\n, 공격대상: "+target+", 이동속도: "+speed+", 유닛특성: "+characteristic);

	}
}

class Hydra extends Unit{
	Hydra(){
		super(100, 80, 10, 0, "지상,공중", 1.741, "지상,중형,생체");
	}
	void print() {//출력
		System.out.println("히드라의 생산비용은 미네랄 :"+price+", 체력: "+hp+", 공격력: "+attack+" 방어력: "+defence+
				"\n, 공격대상: "+target+", 이동속도: "+speed+", 유닛특성: "+characteristic);

	}
}

class Marine extends Unit{
	Marine(){
		super(50, 50, 6, 0, "지상,공중", 1.875, "지상,소형,생체");
	}
	void print() {//출력
		System.out.println("마린의 생산비용은 미네랄 :"+price+", 체력: "+hp+", 공격력: "+attack+" 방어력: "+defence+
				"\n, 공격대상: "+target+", 이동속도: "+speed+", 유닛특성: "+characteristic);

	}
}


public class Q1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Juggling j = new Juggling();
		Hydra h = new Hydra();
		Marine[] m = new Marine[3];
		
		for(int i = 0;i<m.length;i++) {
			m[i] = new Marine();
		}
		
		j.print();
		h.print();
		
		for(int i=0;i<m.length;i++) {
			m[i].print();
		}

		
		
	}

}

이건 만드는데 쉽기도 하고 좀 칠게 많고 귀찮아서 만약 이 글을 읽는 사람들 중에 이 문제를 풀어보고 싶은 사람이 있다면

이 코드는 복붙을 하고 문제를 풀어보는게 좋을 것 같다.

 

정답 코드 공개 

package NewProject;

import java.security.PublicKey;

import Test.jaewon;

/*
 * 공격은 순서대로 단, 객체가 살아있는 경우
 * 타켓은 첫번째 객체를 집중적으로 공격을 하고 객체가 소멸하면 그 다음 객체로 이동
 */

//테란 클래스
class Terran{
	//1. 마린 객체 생성
	Marine[] m = new Marine[3];
	//2. 턴 횟수 변수 생성
	int turn = 0;
	//3. 마린 객체 생성
	Terran(){
		for(int i=0;i<m.length;i++) {
			m[i] = new Marine();
			m[i].print();
		}
	}
	//4. 공격할 마린 선택
	public Marine AttackM() {
		if(m[0] != null || m[1] != null || m[2] != null) {
			while(m[turn%3] == null) {
				turn ++;
			}
			System.out.println(turn%3 + "번째 마린이 공격을 합니다.");
			return m[turn++%3];
		}else {
			return null;
		}
	}
	//5. 공격을 당할 마린 선택
	public Marine WhoM() {
		for(int i=0;i<m.length;i++) {
			if(m[i] != null) {
				System.out.println(i + "번째 마린이 공격을 당합니다.");
				return m[i];
			}
		}
		return null;
	}
	//6. 죽은 마린 확인
	public void CheckM() {
		for(int i=0;i<m.length;i++) {
			if(m[i] != null && m[i].hp <= 0) {
				m[i] = null;
				System.out.println(i + "번째 마린이 죽었습니다.");
			}
		}
	}
	//7. 게임종료 확인
	public boolean GameoverM() {
		for(int i=0;i<m.length;i++) {
			if(m[i] != null) {
				return true;
			}
		}
		System.out.println("마린이 전부 죽었습니다.");
		return false;
	}
}

class Zerg{
	//1. 히드라 저글링 생성
	Juggling j;
	Hydra h;
	//2. 턴 변수 생성
	int turn = 0;
	//3. 히드라 저글링 객체 생성
	Zerg(){
		j = new Juggling();
		h = new Hydra();
		j.print();
		h.print();
	}
	public Juggling goJug() {
		return j;
	}
	public Hydra goHydra() {
		return h;
	}
	
	//4. 마린을 공격함
	//5. 공격을 당할 저그 선정
	public void WhoZ(Marine m) {
		if(j != null) {
			System.out.println("저글링이 마린에게 공격을 당합니다.");
			m.hp -= j.attack;
		}else {
			System.out.println("히드라가 마린에게 공격을 당합니다.");
			m.hp -= h.attack;
		}
	}
	//6. 죽은 객체 선정
	public void CheckZ() {
		if(j == null) {
			j = null;
			System.out.println("저글링이 죽었습니다.");
		}if(h == null) {
			h = null;
			System.out.println("히드라가 죽었습니다.");
		}
	}
	//7. 게임종료 선정
	public boolean GameoverZ() {
		if(j != null) {
			return true;
		}
		if(h != null) {
			return true;
		}
		return false;
	}
	
}


public class Q2 {
   public static void main(String[] args) {
      
	   
	   Terran t = new Terran();
	   Zerg z = new Zerg();
	   boolean chk = true;
	   int count = 1;
	   
	   while(chk) {
		   //테란이 먼저 공격
		   // 누가 공격할래?
		   System.out.println((count++) + "턴 테란 공격");
		   Marine m = t.AttackM(); //내가 공격할게 !
		   z.WhoZ(m); //마린이 저그 공격 ! 
		   z.CheckZ(); //저그 누가 죽었나 ~ 확인
		   chk = z.GameoverZ(); //저그 다 죽었는지 확인?
		   if(chk == false) {
			   System.out.println("테란팀이 이겼습니다.");
			   continue;
		   }
		   //저그가 공격
		   // 누가 공격할래?
		   System.out.println((count++) + "턴 저그 공격");

		   if(z.turn % 2 == 0 && z.j != null) {
			   //저글링이 공격
			   System.out.println("저글링이 공격합니다.");
			   Juggling j = z.goJug(); //저글링 생성 완료 내가 널 떄릴거야
			   m = t.WhoM(); //맞을 마린이 누구냐
			   m.hp -= j.attack; //저글링이 공격 !
			   t.CheckM(); //마린 누가 죽었니?
			   chk = t.GameoverM(); //마린이 다 죽었니?
			   if(chk == false) {
				   System.out.println("저그팀이 이겼습니다.");
			   }
			   
			   
			   
		   }else if(z.turn % 2 == 1 && z.h != null) {
			   //히드라가 공격
			   Hydra h = z.goHydra();
			   m = t.WhoM();
			   m.hp -= h.attack;
			   t.CheckM();
			   chk = t.GameoverM();
			   if(chk == false) {
				   System.out.println("저그팀이 이겼습니다.");
			   }
			   
		   }
		   z.turn ++;
	   }
   }

}

내가 해본 문제 중에 나름 난이도가 있다보니 생각을 많이 하면서 하다보니 주석이 다소 유치하게 ...? 많이 달려있긴한데 그래도 도움은 될 거다... ㅎ..

오늘 하루종일 이 코드를 이해하고 외우는데 시간을 다 쏟은 듯 하다.

내일 눈 뜨자마자 이 코드를 백지상태에서 쳐보고 나의 암기력과 이해력을 테스트해봐야겠다. 아직 이 문제를 100퍼센트 마스터한 느낌은 확실히 아니다.

그리고 자꾸 자바 핑계로 미루고 있는데 html css script를 공부해야할 듯 하다...!! 더 이상 미루면 안될듯 하다.

 

감사합니다.