JAVA 입문자 Text RPG 만들기 8일차
8일차
System.out.print("\n1.Fight\n2.AutoBattle\n3.Run\nCh : ");
테스트할 때 빨리 보기 위해 오토 배틀 시스템을 만들었어요.
public String AutoBetter (String Lv){
Random rd = new Random();
int LV = Integer.parseInt(Lv);
int count = 0;
if(LV >= 10 && LV < 12){
count = 1;
}else if(LV >= 12 && LV < 14){
count = 2;
}else if(LV >= 14 && LV < 16){
count = 3;
}else if(LV >= 16) {
count = 4;
}
while(true){
int Sk_Ch = rd.nextInt(count)+1;
if(count < Sk_Ch || Sk_Ch == 0){
}else{
// damage(Sk_Ch);
return Integer.toString(Sk_Ch);
}
}
}
똑같은 코드에서 랜덤으로 선택하는 것과 메소드만 새로 추가했어요.
메커니즘은 그냥 선택에서 랜덤으로 바뀐 거뿐이기 때문에 잘 작동합니다.
public void Main() throws IOException{ // 선택 후 계속 보일 메뉴
Item();
State State = new State(); // 정보창
Lv_m Lv_m = new Lv_m();
Point Point = new Point(); // 스탯분배
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
while(true){
System.out.print("\n\n1.State\n2.Adventure\n3.Point\n4.Claas Up\n5.Signature Item\n6.Exit\nCh : ");
String MainCh = bf.readLine();
if(MainCh.equals("1")){
State.State();
}else if(MainCh.equals("2")){
Lv_m.Lv_m();
}else if(MainCh.equals("3")){
Point.Point();
}else if(MainCh.equals("4")){
ClassUp();
}else if(MainCh.equals("5")){ // 새로 추가한 부분 장비 강화
P_item(); // 플레이어 이름으로 강화 장비 분류 후 강화할 장비 선택
}else if(MainCh.equals("6")){
Exit();
return;
}else{
System.out.println("RE");
}
}
}
어제 하고자 했던 장비 시스템을 만들었어요.
나중에 순서를 다시 한번 정리해도 괜찮을 거 같아요.
public void Item(){ // 아이템 목록 불러오기
File itemList = new File("C:/Users/user/Desktop/js 공부/itmeList.txt");
//FileReader를 인자로 하는 BufferedReader 객체 생성
try{
BufferedReader br = new BufferedReader(new FileReader(itemList));
String CK = br.readLine();
while(CK != null){
item.add(CK);
CK = br.readLine();
}
br.close();
} catch (NullPointerException e){
e.getStackTrace();
} catch (FileNotFoundException e){
e.getStackTrace();
} catch (IOException e){
e.getStackTrace();
}
}
아이템 불러오기!
아이템 리스트도 메모장으로 만들어서 새로운 플레이어를 만들 때 들어가는 값을 추가해줬어요.
아래 코드에서 확인할게요.
File itemList = new File("C:/Users/user/Desktop/js 공부/itmeList.txt");
String weapon = "0";
String weapon_D = "0";
String armor = "0";
String armor_D = "0";
try{
FileWriter fw = new FileWriter(itemList, true);
fw.write(""+name);
fw.write(","+weapon);
fw.write(","+weapon_D);
fw.write(","+armor);
fw.write(","+armor_D);
fw.close();
} catch (Exception e){
e.getStackTrace();
}
플레이어 추가 시 입력했던 이름과 기본값들을 넣어줬습니다.
이름을 왜 넣었냐 하면 나중에 플레이어 별 장비들을 가져오기 위해 맨 앞에 플레이어의 이름을 넣어줬어요.
public void P_item_ST_VO(){ // 선택 플레이어 장비 불러오기
P_item = new ArrayList<String>(); // 초기화
String Name[];
System.out.println("\n\n"+List_P_M.Playerchoice.get(0)+" Itme");
for(int i = 0; i < item.size(); i++){
Name = item.get(i).split(","); // 아이템 리스트에서 , 를 기준으로 자름
if(List_P_M.Playerchoice.get(0).equals(Name[0])){ // 아이템 리스트 맨 앞의 문자열은 플레이어 이름으로 지정해놨기에 같은 이름이 있다면 조건 시작
for(int j=0; j < Name.length; j++){
P_item.add(Name[j]); // 플레이어의 아이템 분류 ( 강화 , 데미지)
}
item.remove(i);
}
}
}
현재 선택한 플레이어에 맞는 장비들을 불러와서 저장합니다.
public void P_item() throws IOException{ // 해당 플레이어 장비 강화
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
Item Item = new Item();
System.out.println("1. Weapon ["+P_item.get(1)+"] Atk ["+P_item.get(2)+"]");
System.out.println("2. Armor ["+P_item.get(3)+"] Def ["+P_item.get(4)+"]");
System.out.print("Ch : ");
String Ch = bf.readLine();
if(Ch.equals("1")){ // 무기 선택시
Item.Weapon();
}else if(Ch.equals("2")){ // 방어구 선택시
Item.Armor();
}else{
System.out.println("RE");
}
}
캐릭터의 아이템을 볼 수 있고 어떤 걸 강화할지 선택할 수 있는 메소드입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
public class Item {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
Random rd = new Random();
public Item(){
}
public int Weapon() throws IOException{
System.out.println("\n1. Weapon ["+Choice.P_item.get(1)+"] Atk ["+Choice.P_item.get(2)+"]");
int R_choice = 0;
while(true){
System.out.print("\n1.reinforcement\n2.Exit\nCh : "); // 강화 선택 ( 강화 영어가 뭔지 모르겠네..)
String Ch = bf.readLine();
if(Ch.equals("1")){
R_choice = 1;
reinforcement(R_choice);
}else if(Ch.equals("2")){
return 0;
}else{
System.out.println("RE");
}
}
}
public int Armor() throws IOException{
System.out.println("\n2. Armor ["+Choice.P_item.get(3)+"] Def ["+Choice.P_item.get(4)+"]");
int R_choice = 0;
while(true){
System.out.print("\n1.reinforcement\n2.Exit\nCh : "); // 강화 선택 ( 강화 영어가 뭔지 모르겠네..)
String Ch = bf.readLine();
if(Ch.equals("1")){
R_choice = 3;
reinforcement(R_choice);
}else if(Ch.equals("2")){
return 0;
}else{
System.out.println("RE");
}
}
}
public void reinforcement(int Ch) throws IOException{
while(true){
String Name = "";
String SubName = "";
if(Ch == 1){ // 무기일 경우
Name = "Weapon";
SubName = "Atk";
}else{ // 방어구일 경우
Name = "Armor";
SubName = "Def";
}
int star = Integer.parseInt(Choice.P_item.get(Ch)); // 플레이어 강화 수치
int AtK_Def = Integer.parseInt(Choice.P_item.get(Ch+1)); // 플레이어 강화 공격력 , 방어력
int P_Money = Integer.parseInt(List_P_M.Playerchoice.get(6)); // 플레이어 현재 돈
int dem = 0; // 증가 대미지 , 방어력
if(Ch == 1){ // 무기일 경우
dem = 2;
}else{ // 방어구일 경우
dem = 1;
}
int Max = 95; // 최대 성공률
int rand = 5 * star; // 강화별 성공률
int rein_Money = 20 * star; // 강화별 비용
if(rein_Money == 0){
rein_Money = 20; // 첫강화 일경우 강화비용 10으로 고정)
}
System.out.print("\n"+Name+"["+star+"] "+SubName+" ["+AtK_Def+"]"); // 강화 전
System.out.println(" -> "+Name+" ["+(star+1)+"] "+SubName+" ["+(AtK_Def+dem)+"]"); // 강화 후
System.out.println("rein Money : "+rein_Money);
System.out.println("Success rate : "+(Max-rand)+"%"); // 강화 확률
if(star < 10){
System.out.println("Break[false] & Star_Down[false]");
}else if(star >= 15){
System.out.println("Break[true] & Star_Down[true]");
}else{
System.out.println("Break[false] & Star_Down[true]");
}
System.out.print("1. Y\n2. N\nCh : ");
String Y_N = bf.readLine();
if(P_Money < rein_Money){ // 플레이어가 돈이 적을 경우
System.out.println("Lack of money.");
System.out.println("Money : "+P_Money);
return;
}
if(Y_N.equals("1")){
P_Money -= rein_Money;
List_P_M.Playerchoice.set(6, Integer.toString(P_Money)); // 플레이어 돈 차감
for(int i = 0; i < 3; i++){
try { // 강화중 표현하기 위한 지연함수
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i == 2){
System.out.println("!!!");
}else{
System.out.print("...");
}
}
int R_Rand = rd.nextInt(100)+1; // 1 ~ 100 중 숫자 하나를 랜덤하게 구한다.
if(R_Rand <= Max-rand){ // 랜덤하게 구한 숫자가 확률안에 있을경우 성공
star += 1;
AtK_Def += dem;
System.out.println(" -> "+Name+" ["+star+"] "+SubName+" ["+AtK_Def+"]"); // 강화 성공
Choice.P_item.set(Ch, Integer.toString(star));
Choice.P_item.set((Ch+1), Integer.toString(AtK_Def));
}else{
if(star < 10){ // 현재 강화 수치가 10강 보다 작을경우 단계가 하락하지않음
System.out.println(" -> "+Name+" ["+star+"] "+SubName+" ["+AtK_Def+"]"); // 강화 실패
}else if(star >= 15){ // 15강 부터는 파괴 확률 적용
int Break = rd.nextInt(100)+1; // 1 ~ 100 중 숫자 하나를 랜덤하게 구한다.
if(Break <= 10){ // 랜덤하게 구한 숫자가 10보다 작을경우 장비 파괴
star = 0;
AtK_Def = 0;
System.out.println("Item Break...");
System.out.println(" -> "+Name+" ["+star+"] "+SubName+" ["+AtK_Def+"]"); // 강화 실패
Choice.P_item.set(Ch, Integer.toString(star));
Choice.P_item.set((Ch+1), Integer.toString(AtK_Def));
}else{
star -= 1;
AtK_Def -= dem;
System.out.println("Item failure...");
System.out.println(" -> "+Name+" ["+star+"] "+SubName+" ["+AtK_Def+"]"); // 강화 실패
Choice.P_item.set(Ch, Integer.toString(star));
Choice.P_item.set((Ch+1), Integer.toString(AtK_Def));
}
}else{ // 10강 이상부터는 실패시 단계 하락
star -= 1;
AtK_Def -= dem;
System.out.println("Item failure...");
System.out.println(" -> "+Name+" ["+star+"] "+SubName+" ["+AtK_Def+"]"); // 강화 실패
Choice.P_item.set(Ch, Integer.toString(star));
Choice.P_item.set((Ch+1), Integer.toString(AtK_Def));
}
}
}else if(Y_N.equals("2")){
return;
}else{
System.out.println("RE");
}
}
}
}
장비 선택 및 강화 시스템을 담은 클래스입니다. (* 여기서부터 갑자기 일이 생겨 어디까지 했는지 기억이 잘..ㅎ)
그래도 주석을 많이 달아놔서 금방 알아볼 수 있었네요.
이제 배틀 시스템에 장비의 성능만큼 공격력 , 방어력이 올라야겠죠?
int PlayerHp = Integer.parseInt(List_P_M.Playerchoice.get(3));
int PlayerAtk = Integer.parseInt(List_P_M.Playerchoice.get(4));
int PlayerWP = Integer.parseInt(Choice.P_item.get(2)); // 플레이어 장비 공격력
PlayerAtk += PlayerWP;
int PlayerDef = Integer.parseInt(List_P_M.Playerchoice.get(5));
int PlayerDF = Integer.parseInt(Choice.P_item.get(4)); // 플레이어 장비 방어력
PlayerDef += PlayerDF;
공격력 및 방어력을 + 해줬습니다.
여기서 디버깅해보다가 생각지도 못한 곳에서 에러를 발견해 고쳤습니다.
while(true){
System.out.print("Ch : ");
String Sk_Ch = bf.readLine();
if(count < Integer.parseInt(Sk_Ch) && Integer.parseInt(Sk_Ch) == 0){
System.out.println("RE");
}else{
return SK;
}
}
}
위의 원래 코드에서 문자열을 입력 시 에러가 나버리는 오류를 찾았습니다. 플레이어 선택할 때의 문제점과 비슷하네요.
while(true){
System.out.print("Ch : ");
String Sk_Ch = bf.readLine();
int SK = CKtrue(Sk_Ch,count);
if(SK == 0){
System.out.println("RE");
}else{
if(count < Integer.parseInt(Sk_Ch) && Integer.parseInt(Sk_Ch) == 0){
System.out.println("RE");
}else{
return SK;
}
}
}
위의 CKture메소드를 이용해서 바꿔줬습니다.
static int CKtrue(String Ch, int count){ // 스킬 문자열 걸러내기
int CK = 0;
try{
int ck = Integer.parseInt(Ch);
CK = ck;
if(CK > count){
CK = 0;
}else if(CK == 0){
CK = 0;
}else if(CK <= count){
return CK;
}
} catch(NumberFormatException e){
CK = 0;
}
return CK;
}
CKture메소드 코드입니다.
이렇게 8일 차가 마무리가 됐는데 사실 저번 주 금요일 만들다 일이 생겨서 갑작스럽게 꺼버렸습니다..
어디서 마지막으로 에러가 났는지만 기억나고 뭘 만들었는지 기억이 잘 안 나서 일단 최대한 추가한 것들을 적어봤어요..ㅠ
나름 금요일은 공부가 잘돼서 많이 추가했는데 망해버렸네요.
그래도 나름 알차게 적은 거 같아요!
내일은 많이 추가한 거 같기도 하고 직업을 늘리거나 스킬의 세부화? 라던지 아니면 상점 시스템도 괜찮겠네요.
구상 많이 해서 추가해봐야겠어요.