*PoketmonArchive 클래스
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class PoketmonCenter {
private PoketmonArchive pArchive;
private String[] poketmon;
private String fPoketmon;
public PoketmonCenter(PoketmonArchive pArchive) {
// 생성자에서 포켓몬아카이브 인스턴스를 인자로 받아 필드로 할당
this.pArchive = pArchive;
// 출현 가능한 포켓몬 이름 배열을 필드로 할당
this.poketmon = new String[] { "파이리", "꼬부기", "이상해씨" };
setfPoketmon(poketmon);
}
// 포켓몬 생성 메소드
Poketmon initPoketmon(String pName) {
Poketmon p = new Poketmon(pName, initPoketmonStat(), initPoketmonSkill());
return p;
}
// 포켓몬 스탯 초기화 메소드
Map<String, Object> initPoketmonStat() {
Map<String, Object> stat = new LinkedHashMap<String, Object>();
stat.put("pkName", fPoketmon); // 포켓몬 이름 저장
//해당 포켓몬의 poketmonAllStat 스탯데이터를 복사하여 새로운 stat 맵 구조에 추가
stat.putAll(pArchive.poketmonAllStat.get(fPoketmon));
// 기본 스탯 변경 +(int)(Math.random()*20-10)
stat.put("hp", (int) stat.get("hp") + (int) (Math.random() * 20 - 10)); // hp값 변경
stat.put("power", (int) stat.get("power") + (int) (Math.random() * 20 - 10)); // power값 변경
stat.put("speed", (int) stat.get("speed") + (int) (Math.random() * 20 - 10)); // speed값 변경
return stat;
}
// 포켓몬 스킬 초기화 메소드
Map<String, Integer> initPoketmonSkill() {
Map<String, Integer> skills = new LinkedHashMap<String, Integer>();
// 포켓몬에 해당하는 타입의 스킬 리스트를 담음.
List<String> s = pArchive.typeSkillsMap.get(pArchive.poketmonAllStat.get(fPoketmon).get("type"));
// 랜덤으로 두 개의 스킬 생성
int rd = (int) (Math.random() * s.size());
int rd2 = (int) (Math.random() * s.size());
// 랜덤 값이 같으면 랜덤을 한번 더 돌림.
while (rd == rd2) {
rd2 = (int) (Math.random() * s.size());
}
skills.put(s.get(rd), pArchive.skillPowerMap.get(s.get(rd)));
skills.put(s.get(rd2), pArchive.skillPowerMap.get(s.get(rd2)));
return skills;
}
public String getfPoketmon() {
return fPoketmon;
}
public void setfPoketmon(String[] fPoketmon) {
// 파이리, 꼬부기, 이상해씨 중 하나 선택
this.fPoketmon = poketmon[(int) (Math.random() * 2)];
}
}
*PoketmonCenter 클래스
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class PoketmonCenter {
private PoketmonArchive pArchive;
private String[] poketmon;
private String fPoketmon;
public PoketmonCenter(PoketmonArchive pArchive) {
// 생성자에서 포켓몬아카이브 인스턴스를 인자로 받아 필드로 할당
this.pArchive = pArchive;
// 출현 가능한 포켓몬 이름 배열을 필드로 할당
this.poketmon = new String[] { "파이리", "꼬부기", "이상해씨" };
setfPoketmon(poketmon);
}
// 포켓몬 생성 메소드
Poketmon initPoketmon(String pName) {
Poketmon p = new Poketmon(pName, initPoketmonStat(), initPoketmonSkill());
return p;
}
// 포켓몬 스탯 초기화 메소드
Map<String, Object> initPoketmonStat() {
Map<String, Object> stat = new LinkedHashMap<String, Object>();
stat.put("pkName", fPoketmon); // 포켓몬 이름 저장
//해당 포켓몬의 poketmonAllStat 스탯데이터를 복사하여 새로운 stat 맵 구조에 추가
stat.putAll(pArchive.poketmonAllStat.get(fPoketmon));
// 기본 스탯 변경 +(int)(Math.random()*20-10)
stat.put("hp", (int) stat.get("hp") + (int) (Math.random() * 20 - 10)); // hp값 변경
stat.put("power", (int) stat.get("power") + (int) (Math.random() * 20 - 10)); // power값 변경
stat.put("speed", (int) stat.get("speed") + (int) (Math.random() * 20 - 10)); // speed값 변경
return stat;
}
// 포켓몬 스킬 초기화 메소드
Map<String, Integer> initPoketmonSkill() {
Map<String, Integer> skills = new LinkedHashMap<String, Integer>();
// 포켓몬에 해당하는 타입의 스킬 리스트를 담음.
List<String> s = pArchive.typeSkillsMap.get(pArchive.poketmonAllStat.get(fPoketmon).get("type"));
// 랜덤으로 두 개의 스킬 생성
int rd = (int) (Math.random() * s.size());
int rd2 = (int) (Math.random() * s.size());
// 랜덤 값이 같으면 랜덤을 한번 더 돌림.
while (rd == rd2) {
rd2 = (int) (Math.random() * s.size());
}
skills.put(s.get(rd), pArchive.skillPowerMap.get(s.get(rd)));
skills.put(s.get(rd2), pArchive.skillPowerMap.get(s.get(rd2)));
return skills;
}
public String getfPoketmon() {
return fPoketmon;
}
public void setfPoketmon(String[] fPoketmon) {
// 파이리, 꼬부기, 이상해씨 중 하나 선택
this.fPoketmon = poketmon[(int) (Math.random() * 2)];
}
}
*Poketmon 클래스
import java.util.LinkedHashMap;
import java.util.Map;
public class Poketmon {
String pName; // 포켓몬 닉네임
int hp; // 현재 hp
Map<String, Object> stat = new LinkedHashMap<String, Object>(); // 스탯들 (포켓몬이름,hp,power,speed,type)
Map<String, Integer> skillsPowerMap = new LinkedHashMap<String, Integer>(); // 해당 타입의 랜덤한 2개 스킬의 이름과 파워
public Poketmon(String pName, Map<String, Object> stat, Map<String, Integer> skillsPowerMap) {
this.pName = pName;
this.stat = stat;
this.skillsPowerMap = skillsPowerMap;
setHp();
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public int getHp() {
return hp;
}
public void setHp() {
this.hp = (int) stat.get("hp");
}
public Map<String, Object> getStat() {
return stat;
}
public void setStat(Map<String, Object> stat) {
this.stat = stat;
}
public Map<String, Integer> getSkillsPowerMap() {
return skillsPowerMap;
}
public void setSkillsPowerMap(Map<String, Integer> skillsPowerMap) {
this.skillsPowerMap = skillsPowerMap;
}
}
*Run 클래스(메인)
import java.util.Scanner;
public class Run {
public static void main(String[] args) {
//포켓몬 스킬
String[]skills = {"몸통박치기", "할퀴기","울부짖기", "하이드로펌프", "물대포", "파도타기",
"불대문자", "니트로차지", "솔라빔", "풀베기"};
//포켓몬 스킬파워
int[] skillPower = {60,50,20,100,90,90,120,70,110,80};
//각 스킬을 쓸 수 있는 포켓몬 타입
String[][] skillType = {{"물","불","풀"}, {"불","풀"}, {"물","불","풀"}, {"물"},{"물"},{"물"},{"불"}
,{"불"},{"풀"},{"풀"}};
//포켓몬
String[]pks = {"꼬부기", "파이리", "이상해씨","뚜벅초", "고라파덕", "가디"};
//포켓몬 타입
String[]pkType = {"물","불","풀","풀", "물","불"};
//포켓몬 스탯 (내부배열은 hp, power, speed 순)
int[][] pkStat = {{250,90,90},{150,120,90},{200,100,90},{150,80,80},{160,80,80},{150,90,100}};
Scanner sc = new Scanner(System.in);
System.out.println("파이리, 꼬부기, 이상해씨 중 플레이어의 포켓몬을 뽑습니다.");
PoketmonArchive pa = new PoketmonArchive(pks, pkStat, skills, skillPower, pkType, skillType);
PoketmonCenter pc = new PoketmonCenter(pa);
System.out.println(pc.getfPoketmon()+"의 이름을 입력해주세요.");
String pName = sc.next();
System.out.println(pName+"의 상태입니다.");
Poketmon p = pc.initPoketmon(pName);
System.out.println("현재 체력 "+p.getHp());
System.out.println("능력창"+p.getStat());
System.out.println("스킬창"+p.getSkillsPowerMap());
}
}
-PoketmonArchive 클래스에서 Map <String, Object> stat은 반복문을 돌면서 poketmonAllStat 맵에 추가되면 초기화되고 새로 담아야 하기 때문에 반복문 안에서 반복적으로 새로 stat 인스턴스를 만들어야함.
-PoketmonCenter 클래스에서 포켓몬을 생성할 때 아카이브에 맵구조로 저장해놓은 데이터들 중 해당 포켓몬의 스탯, 스킬이 담긴 맵 테이블을 정확히 가져올 수 있어야 함.
'연습문제 및 실습 자료' 카테고리의 다른 글
EMS 토이프로젝트 (0) | 2023.08.14 |
---|---|
자바 맵(MAP) 문제2 - 포켓몬스터(응용) (0) | 2023.08.09 |
자바 Set구조 문제 - 로또 만들기 (0) | 2023.08.07 |
자바 맵(MAP) 문제 - 키오스크 응용(8) (0) | 2023.08.07 |
자바 컬렉션 문제 - 테트리스 게임 (0) | 2023.08.04 |