JAVA Console Game/JAVA Text RPG

JAVA 입문자 Text RPG 만들기 8일차

건강한너구리 2021. 11. 1. 14:08

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일 차가 마무리가 됐는데 사실 저번 주 금요일 만들다 일이 생겨서 갑작스럽게 꺼버렸습니다..

어디서 마지막으로 에러가 났는지만 기억나고 뭘 만들었는지 기억이 잘 안 나서 일단 최대한 추가한 것들을 적어봤어요..ㅠ

나름 금요일은 공부가 잘돼서 많이 추가했는데 망해버렸네요.

그래도 나름 알차게 적은 거 같아요!

 

내일은 많이 추가한 거 같기도 하고 직업을 늘리거나 스킬의 세부화? 라던지 아니면 상점 시스템도 괜찮겠네요.

구상 많이 해서 추가해봐야겠어요.