hahn

JAVA Interface, abstract 이해(게임 만들기) 본문

개발 실습/JAVA

JAVA Interface, abstract 이해(게임 만들기)

hahn 2021. 7. 19. 20:48
728x90
반응형
package javabasic;

abstract class Creature {
	private int hp;
	private int mp;
	private String statement;
	private int str;
	private int def;
	
	@Override
	public String toString() {
		return "hp=" + hp + ", mp=" + mp  + ", str=" + str + ", def=" + def + ", statement=" + statement;
	}
	public int getStr() {
		return str;
	}
	public void setStr(int str) {
		this.str = str;
	}
	public int getDef() {
		return def;
	}
	public void setDef(int def) {
		this.def = def;
	}
	public int getHp() {
		return hp;
	}
	public void setHp(int hp) {
		this.hp = hp;
	}
	public int getMp() {
		return mp;
	}
	public void setMp(int mp) {
		this.mp = mp;
	}
	public String getStatement() {
		return statement;
	}
	public void setStatement(String statement) {
		this.statement = statement;
	}
	
	public void takeHit(int takeHit) {
		hp = hp - takeHit;
	}
	public void takeHit(int takeHit, int def) {
		hp = hp - takeHit + def;
	}
}
package javabasic;

import javabasic.Creature;

import java.util.HashMap;
import java.util.Map;

import javabasic.Action;

class Character extends Creature implements Action{
	private int money;
	private Map<String, Object> weapon;
	
	
	public int getMoney() {
		return money;
	}

	public void setMoney(int money) {
		this.money = money;
	}
	
	public void payMoney(int pay) {
		setMoney(getMoney() - pay);
		System.out.printf("남은 돈 : %d\n",getMoney());
	}
	

	public Map getWeapon() {
		return weapon;
	}
	
	public void setWeapon(String name, int weapon, int reinforce) {
		this.weapon.replace("name", name);
		this.weapon.replace("str", weapon);
		this.weapon.replace("reinforce", reinforce);
	}

	public Character(int hp, int mp, int str, int def) {
		super.setHp(hp);
		super.setMp(mp);
		super.setStr(str);
		super.setDef(def);
		super.setStatement("정상");
		this.weapon = new HashMap<String, Object>();
		weapon.put("name", "");
		weapon.put("str", 0);
		weapon.put("reinforce", 0);
		this.setMoney(100);
	}

	@Override
	public int attack() {
		System.out.printf("%s 만큼의 피해를 입혔습니다.\n", super.getStr() + (int)weapon.get("str"));
		return getStr() + (int)weapon.get("str");
	}

	@Override
	public int defence() {
		System.out.printf("%s 만큼의 피해를 막았습니다.\n", super.getDef());
		return getDef();
		
	}
	
	public void heal(int hp) {
		super.setHp(super.getHp() + hp);
		System.out.printf("HP : %d 회복했습니다.\n", hp);
	}
	public void heal(int hp, int mp) {
		super.setHp(super.getHp() + hp);
		super.setMp(super.getMp() + mp);
		System.out.printf("HP : %d MP : %d 회복했습니다.\n", hp, mp);
	}
	public void spoilFood(int hp) {
		super.setHp(super.getHp() - hp);
		System.out.println("상한 음식입니다. HP가 2 감소했습니다.\n");
	}
	
	public void earnMoney(int money) {
		this.money += money;
	}
	
	public boolean moneyCompare(int money) {
		return (this.money < money);
	}
	
}
package javabasic;

public class Warrior extends Character implements Skill{

	public Warrior(int hp, int mp, int str, int def) {
		super(hp, mp, str, def);
	}
	
	public int skill() {
		
		System.out.println("mp 10을 사용합니다.");
		super.setMp(super.getMp() - 10);
		System.out.printf("강타를 사용하여 %d의 피해를 입혔습니다.\n", super.getStr()*3);
		
		return super.getStr()*3;
		
	}
	public void WarriorInfo() {
		System.out.println("WarriorInfo hp=" + getHp() + ", mp=" + getMp()  + ", str=" + (getStr() + (int)getWeapon().get("str")) + ", def=" + getDef() + ", statement=" + getStatement() +", money=" + getMoney() + ", weapon=" + getWeapon());
	}
	
}
package javabasic;

public interface Skill {
	public int skill();
}
package javabasic;

interface Action{
	public int attack();
	public int defence();
}
package javabasic;

public interface Inven {
	public int money();
	public int weapon();
}
package javabasic;

class Monster extends Creature implements Action{
	public Monster(int hp, int mp, int str, int def) {
		super.setHp(hp);
		super.setMp(mp);
		super.setStr(str);
		super.setDef(def);
		super.setStatement("정상");
	}

	@Override
	public int attack() {
		System.out.printf("%s 만큼의 피해를 입었습니다.\n", super.getStr());
		return getStr();
	}

	@Override
	public int defence() {
		return getDef();
	}
	
	public void MonsterInfo() {
		String HpBar = "";
		System.out.println("MonsterInfo hp=" + getHp() + ", mp=" + getMp()  + ", str=" + getStr() + ", def=" + getDef() + ", statement=" + getStatement());
		for(int i = 0; i < getHp(); i++) {
			HpBar += "❤";
		}
		System.out.println(HpBar);
	}
	
}
package javabasic;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javabasic.Monster;

class Buffer{
	
	BufferedReader bf = null;
	
	public Buffer() {
		this.bf = new BufferedReader(new InputStreamReader(System.in));
	}
	
	public int buf() throws NumberFormatException, IOException {
		try {
			return Integer.parseInt(this.bf.readLine());
		}catch(Exception e){
			return 0;
		}
	}
	
}

public class game extends Thread {

	public static void main(String[] args) throws IOException, InterruptedException{
		
		Buffer bf = new Buffer();
		
		boolean gameContinue = true;
		int hp, mp, str, def = 0;
		int gameMenu = 0;
		int continueCheck = 9;
		int move = 0;
		int select = 3;
		int escape = 0;
		int action = 0;
		int killCount = 0;
		int characterClass = 0;
		int store = 0;
		int weaponSelect = 0;
		
		Warrior wr = null;
		Archer ar = null;
		Monster m1 = null;
		
		String charcter = "⎛⎝(•‿•)⎠⎞";
		String monster1 = "     ╰(‵□′)╯";
		
		while(select != 0) {
			System.out.println("직업 선택해주세요.");
			System.out.println("1. Warrior 2. Archer");
			select = bf.buf();
			if(select == 1) {
				System.out.println("Warrior 스텟 설명");
				hp = (int) Math.floor(Math.random()*100 + 20);
				mp = (int) Math.floor(Math.random()*50 + 10);
				str = (int) Math.floor(Math.random()*10 + 2);
				def = (int) Math.floor(Math.random()*10 + 3);
				System.out.printf("Warrior : HP %d MP %d STR %d DEF %d\n", hp, mp, str, def);
				while(select != 0) {
					System.out.println("Warrior로 결정하시겠습니까? 1. Y , 2. N");
					if(bf.buf() == 1) {
						wr = new Warrior(hp, mp, str, def);
						charcter += "🗡";
						characterClass = 1;
						select = 0;
					}else {
						System.out.println("처음으로 돌아갑니다.");
						select = 3;
						break;
					}
				}
			}else if(select == 2){
				System.out.println("Archer 스텟 설명");
				System.out.println("Archer : HP 30 MP 30 STR 10 DEF 2");
				while(select != 0) {
					System.out.println("Archer로 결정하시겠습니까? 1. Y , 2. N");
					if(bf.buf() == 1) {
						ar = new Archer(30, 30, 10, 2);
						charcter += "🏹";
						characterClass = 2;
						select = 0;
					}else {
						System.out.println("처음으로 돌아갑니다.");
						select = 3;
						break;
					}
				}
			}
		}
		
		while(gameContinue) {
			if(characterClass == 1) {
				gameMenu = 0;
				killCount = 0;
				System.out.println("1. 상점 이용, 2. 사냥터 이동, 3. 회복, 4.게임 종료");
				wr.WarriorInfo();
				gameMenu = bf.buf();
				if(gameMenu == 1) {
					while(store != 3) {
						store = 0;
						weaponSelect = 0;
						System.out.println("1. 무기 구매, 2. 무기 강화, 3. 상점 나가기");
						store = bf.buf();
						if(store == 1) {
							System.out.println("1.목검(10원, +2str), 2.철검(20원, +5str)");
							weaponSelect = bf.buf();
							if(weaponSelect == 1) {
								if(wr.moneyCompare(10)) {
									System.out.println("돈이 없슴니다.");
								}else {
									if(!wr.getWeapon().get("name").equals("")) {
										System.out.println("이미 무기를 가지고 있습니다. 정말 구매하시겠습니까?");
										System.out.println("1. Y   2. N");
										store = bf.buf();
										if(store == 1) {
											wr.payMoney(10);
											wr.setWeapon("목검", 2, 0);
										}
									}else {
										wr.payMoney(10);
										wr.setWeapon("목검", 2, 0);
									}
								}
							}else if(weaponSelect == 2) {
								if(wr.moneyCompare(20)) {
									System.out.println("돈이 없슴니다.");
								}else {
									if(!wr.getWeapon().get("name").equals("")) {
										System.out.println("이미 무기를 가지고 있습니다. 정말 구매하시겠습니까?");
										System.out.println("1. Y   2. N");
										store = bf.buf();
										if(store == 1) {
											wr.payMoney(20);
											wr.setWeapon("철검", 5, 0);
										}
									}else {
										wr.payMoney(20);
										wr.setWeapon("철검", 5, 0);
									}
								}
							}
						}else if(store == 2) {
							if(wr.getWeapon().get("name").equals("")) {
								System.out.println("무기가 없습니다.");
							}else {
								System.out.printf("현재 무기는 %d 강입니다. 강화하시겠습니까?(3원)\n", wr.getWeapon().get("reinforce"));
								System.out.println("1. Y  2. N");
								if(bf.buf() == 1) {
									if(wr.moneyCompare(3)) {
										System.out.println("돈이 없습니다.");
									}else {
										wr.payMoney(3);
										if(Math.random() > 0.7) {
											System.out.println("강화 성공");
											wr.setWeapon((String)wr.getWeapon().get("name"), (int)wr.getWeapon().get("str") + 1, (int)wr.getWeapon().get("reinforce") + 1);
										}else {
											System.out.println("강화 실패(아이템 파괴)");
											wr.setWeapon("", 0, 0);
										}
									}
								}
							}
						}
					}
				}else if(gameMenu == 2) {
					while(continueCheck < 235) {
						move = 0;
						System.out.println("‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾");
						if((continueCheck % 7) == 2 || (continueCheck % 7) == 3 || (continueCheck % 7) == 5) {
							System.out.printf("%"+ continueCheck +"s\n" ,charcter);
						}else if((continueCheck % 7) == 1 || (continueCheck % 7) == 6){
							escape = 0;
							if((continueCheck % 7) == 1){
								monster1 = "     ╰(‵□′)╯";
							}else {
								monster1 = "     (⊙x⊙;)";
							}
							System.out.printf("%"+ continueCheck +"s\n" ,charcter + monster1);
							System.out.printf("%s를 만났습니다. 싸우시겠습니까?(1. 예 / 2. 아니오)\n", monster1);
							escape = bf.buf();
							if((continueCheck % 7) == 1) {
								m1 = new Monster(12, 5, 6, 1);
								m1.MonsterInfo();
							}else {
								m1 = new Monster(20, 2, 5, 2);
								m1.MonsterInfo();
							}
							while(m1.getHp() > 0 && wr.getHp() > 0) {
								if(escape == 2) {
									if(Math.random() > 0.5) {
										break;
									}else{
										System.out.println("도망 실패");
									}
								}
								action = 0;
								System.out.println("1. 공격 2.방어 3.스킬 4.도망간다");
								action = bf.buf();
								if(action == 1) {
									if(Math.random() > 0.3) {
										m1.takeHit(wr.attack());
									}else {
										System.out.println("빗나감");
									}
									sleep(200);
									wr.takeHit(m1.attack());
									sleep(200);
									m1.MonsterInfo();
								}else if(action == 2) {
									wr.takeHit(m1.attack(), wr.defence());
								}else if(action == 3) {
									if(wr.getMp() < 10) {
										System.out.println("MP가 부족합니다.");
									}else {
										m1.takeHit(wr.skill());
										sleep(200);
										wr.takeHit(m1.attack());
										sleep(200);
										m1.MonsterInfo();
									}
								}else if(action == 4) {
									if(Math.random() > 0.5) {
										System.out.println("도망갑니다.");
										break;
									}else {
										System.out.println("도망실패.");
										sleep(200);
										wr.takeHit(m1.attack());
									}
								}
								if(m1.getHp() <= 0) {
									sleep(200);
									System.out.println("몬스터를 잡았습니다.");
									killCount++;
								}
								sleep(200);
								wr.WarriorInfo();
							}
						}else if((continueCheck % 7) == 4){
							action = 0;
							System.out.printf("%"+ continueCheck +"s\n" ,charcter + "   🍖");
							System.out.printf("고기를 발견했습니다. 먹겠습니까?(1. 예 / 2. 아니오)\n");
							action = bf.buf();
							if(action == 1) {
								wr.heal(3, 3);
								sleep(200);
								wr.WarriorInfo();
							}
						}else{
							action = 0;
							System.out.printf("%"+ continueCheck +"s\n" ,charcter + "   🍖");
							System.out.printf("고기를 발견했습니다. 먹겠습니까?(1. 예 / 2. 아니오)\n");
							action = bf.buf();
							if(action == 1) {
								wr.spoilFood(2);
								sleep(200);
								wr.WarriorInfo();
							}
						}
						System.out.println("___________________________________________________________________________________________________________________");
						if(wr.getHp() <= 0) {
							System.out.println("당신은 죽었습니다.\n");
							break;
						}
						System.out.printf("현재 위치 : %d, 남은 거리 : %d", continueCheck - 9, 235 - continueCheck);
						
						while((move < 1 || move >20) && wr.getHp() > 0) {
							System.out.println("   진행하고자 하는 거리를 입력해주세요(1 ~ 20 사이).");
							move = bf.buf();
						}
						
						
						continueCheck = continueCheck + move;
						if(continueCheck <= 0) {
							wr.setMoney(wr.getMoney() + killCount);
							System.out.println("사냥 종료");
						}
					}
					}else if(gameMenu == 3) {
						if(wr.getMoney() > 5) {
							wr.heal(50, 30);
						}else {
							System.out.println("돈이 없어 게임 진행 불가합니다. 게임 종료합니다.");
							gameContinue = false; 
						}
					}else if(gameMenu == 4) {
						gameContinue = false; 
					}
				}

		}
		System.out.println("게임 종료");
	}
}

예전에 실습할 때 만든 건데 기록용으로 올려둬야겠다.

 

원래는 당일 리뷰해서 올리려 했는데 미루고 미뤄서 더 이상 기억이 나지 않는다..

 

중간에 변수 하나 초기화해줘야 했는데 기억 안 난다.

 

다시 보니 아직도 상속 개념은 이해 제대로 못 하고 있는 듯?

 

그냥 막 짜다 보니 변수 선언 엄청 많이 해뒀는데

 

한 번 해봤으니 다음부터는 어느 정도 틀을 잡고 해야겠다.

 

대충 6 ~ 7시간 걸렸던 것 같은데 많이 배웠었다.

728x90
반응형

'개발 실습 > JAVA' 카테고리의 다른 글

JAVA 생성자 이해하기 - 실습  (0) 2021.06.01