ddit/Java

객체지향개념을 이해하기 위한 게임만들기

ssong2ku 2022. 6. 10. 21:32
728x90
package game;


	public class Item {
		   String name;
		   int maxHp, maxMp, att, def;
		   
		   Item(String name, int maxHp, int maxMp, int att, int def){
		      this.name=name;
		      this.maxHp=maxHp;
		      this.maxMp=maxMp;
		      this.att=att;
		      this.def=def;
		   }
		   
		   String itemInfo(){
		      String info=this.name+": ";
		      
		      if(maxHp>0) info+="체력+"+maxHp;
		      if(maxMp>0) info+="마나+"+maxMp;
		      if(att>0)   info+="공격+"+att;
		      if(def>0)   info+="방어+"+def;
		      return info;
		   }
		   
		   
		}
package game;

import java.util.Scanner;

public class Main {
	Character c;
	Item[]items;
	Monster[]monsters;
	Scanner sc = new Scanner(System.in);
	
	Main(){
		c= new Character("가렌",100,50,20,10);
		   items = new Item[12];
		      items[0] = new Item("나무검", 0, 0, 10, 0);
		      items[1] = new Item("천갑옷", 0, 0, 0, 10);
		      items[2] = new Item("체력구슬", 10, 0, 0, 0);
		      items[3] = new Item("마나구슬", 0, 10, 0, 0);
		      items[4] = new Item("강철검", 0, 0, 30, 0);
		      items[5] = new Item("가죽갑옷", 0, 0, 0, 30);
		      items[6] = new Item("체력주머니", 50, 0, 0, 0);
		      items[7] = new Item("마나주머니", 0, 50, 0, 0);
		      items[8] = new Item("무한의대검", 0, 0, 100, 0);
		      items[9] = new Item("가시갑옷", 0, 0, 0, 100);
		      items[10] = new Item("체력의 샘", 100, 0, 0, 0);
		      items[11] = new Item("마나의 샘", 0, 100, 0, 0);

		
		monsters=new Monster[3];
		monsters[0]=new Monster("바위게", 20,20,10,10,50,new Item[] {items[0],
				items[1],items[2],items[3]});
		
		monsters[1]=new Monster("협곡의전령", 100,20,50,50,100,new Item[] {items[4],
				items[5],items[6],items[7]});
		
		monsters[2]=new Monster("바론", 5000,2000,200,200,400,new Item[] {items[8],
				items[9],items[10],items[11]});
		
	}
	public static void main(String[] args) {
		new Main().start();
	}
	void consoleClean() {
		for(int i=0; i<100;i++)
			System.out.println();
	}
	
	private void start() {
		int input =0;
		System.out.println("=============게임시작======================");
		while(true) {
			if(c.hp<=0) {
				System.out.println("플레이어의 체력이 없습니다.");
				System.out.println("게임을 종료합니다");
				break;
			}
			System.out.println("-------------메인메뉴------------");
	         System.out.println("1. 내정보     2. 사냥     0. 종료");
	         System.out.println("--------------------------------");
	         System.out.print("메뉴를 입력해 주세요>>");
	         input = Integer.parseInt(sc.nextLine());
	         switch (input) {
	         case 1:
	            c.showInfo();
	            break;
	         case 2:
	            hunt();
	            break;
	         case 0:
	            System.out.println("종료되었습니다.");
	            System.exit(0);
	            break;
	        }
	    }
	}

	private void hunt() {
		consoleClean();
		Monster originM = monsters[(int)(Math.random()*monsters.length)];
		Monster m = new Monster(originM.name, originM.maxHp, originM.maxMp,originM.att ,originM.def,
				originM.exp,originM.items);
		System.out.println("---------------전투화면------------------");
		System.out.println(m.name + "을()를 만났습니다. 전투를 시작합니다.");
		
		int input =0;
		battle: while(true) {
			System.out.print("1.공격  2.도망>>");
			input = Integer.parseInt(sc.nextLine());
			switch(input) {
			case 1:
				c.attack(m);if(m.hp<=0) {
					System.out.println(m.name+"을(를) 처치하였습니다.");
					System.out.println("-------------전투종료-------------");
					c.getExp(m.exp);
					c.getItem(m.itemDrop());
					System.out.println();
					break battle;
				}
			
			m.attack(c);
				if(c.hp<=0) {
					System.out.println(c.name+"이(가) 죽었습니다.");
					System.out.println("-------------전투종료-------------");
					System.out.println();
					break battle;
			}
			break;
			case 2:
				System.out.println(m.name +"(으)로 부터 도망쳤습니다.");
				break battle;
		}
	}
		
}
}
package game;

public class Character {
	//속성
	String name;
	int maxHp, maxMp,hp,mp, att, def,level,exp,nextExp;
	Item[] items;
	
	Character(String name, int maxHp,int maxMp, int att, int def){
		this.att=att;
		this.def=def;
		this.maxMp=maxMp;
		this.maxHp=maxHp;
		this.hp=maxHp;
		this.mp=maxMp;
		this.name=name;
		this.level=1;
		this.exp=0;
		this.nextExp=this.level*100;
		this.items=new Item[50];
	}

	void showInfo() {
		System.out.println("---------상태----------");
		System.out.println("이름 : "+name);
		System.out.println("레벨 : "+level +"("+exp+"/"+nextExp+")");
		System.out.println("체력 : "+hp+"/"+maxHp);
		System.out.println("마나 : "+mp+"/"+maxMp);
		System.out.println("공격 : "+att);
		System.out.println("방어 : "+def);
		System.out.println("---------------------");
		System.out.println("---------아이템-------");
		for(int i =0; i<this.items.length; i++) {
			if(items[i]!=null) {
				System.out.println(items[i].itemInfo());
			}
		}
		
		System.out.println("-----------------------");
		System.out.println();
		
	}
	void attack(Monster m) {
		int damage = this.att-m.def;
		damage=(damage<=0)?(1):(damage);
		m.hp = m.hp<damage?0:m.hp-damage;
		System.out.println(name + "(이)가 공격으로 "+m.name+"에게 "+ damage +
				"만큼 데미지를 주었습니다.");
		System.out.println(m.name +"의 남은 체력 : "+m.hp);
		System.out.println();
 	}
	void getExp(int exp) {
		System.out.println(exp + "의 경험치를 획득했습니다.");
		this.exp += exp;
		while(nextExp<=this.exp) {
			this.exp-=nextExp;
			levelUp();
		}
	}
	void levelUp() {
		this.level++;
		this.maxHp+=10;
		this.maxMp+=5;
		this.att+=2;
		this.def+=2;
		this.mp=this.maxMp;
		this.hp=this.maxHp;
		this.nextExp=level*100;
		System.out.println("LEVEL UP!!");
	}
	
	void getItem(Item item) {
		System.out.println(item.name + "을(를) 획득하였습니다.");
		for(int i =0; i<items.length;i++) {
			if(items[i]==null) {
				this.items[i]=item;
				break;
			}
		}
		this.maxHp+=item.maxHp;
		this.maxMp+=item.maxMp;
		this.att+=item.att;
		this.def+=item.def;
	}


}
package game;

public class Monster {
	String name;
	int maxHp, maxMp, att, def,exp,hp,mp;
	Item[] items;
	
	Monster(String name, int maxHp,int maxMp, int att, int def,
					int exp, Item[]items){
		this.att=att;
		this.def=def;
		this.mp=maxMp;
		this.hp=maxHp;
		this.maxMp=maxMp;
		this.maxHp=maxHp;
		this.name=name;
		this.exp=exp;
		this.items=items;
	}
	
	void attack(Character c) {
		int damage = this.att-c.def;
		damage=(damage<=0)?(1):(damage);
		c.hp = c.hp<damage?0:c.hp-damage;
		System.out.println(name + "(이)가 공격으로 "+c.name+"에게 "+ damage +
				"만큼 데미지를 주었습니다.");
		System.out.println(c.name +"의 남은 체력 : "+c.hp);
		System.out.println();
 	}
	
	
	Item itemDrop() {
		return items[(int)(Math.random()*items.length)];
	}
}
728x90