오늘 만들어본 프로그램은 포켓몬 게임이다. 배열에 포켓몬을 저장하고 포켓몬 목록 출력, 포켓몬 시합 참여, 포켓몬 잡기 등을 할 수 있는 프로그램이다.
[내가 작성하던...코드]
Scanner sc = new Scanner(System.in);
Random rand = new Random();
String[] poList = new String[3]; // 내 도감
int cnt = 0; // 아직 한마리도 안잡음
poList[0] = "꼬부기"; // 한마리 잡음
cnt++;
int[] poLvList = new int[3]; //레벨이 저장된 배열
poLvList[0] = 5;
String[] pokemon = new String[5]; // 다섯 마리 도감. 잡을 수 있는 포켓몬 목록
pokemon[0] ="야돈";
pokemon[1] ="고라파덕";
pokemon[2] ="메타몽";
pokemon[3] ="두두";
pokemon[4] ="네이티오";
while(true) {
System.out.println("===== 메뉴 =====");
System.out.println("1. 포켓몬 전체 출력"); // R
System.out.println("2. 포켓몬 잡기");
System.out.println("3. 포켓몬 정보 출력"); // 레벨 정보(정수값) // R 먼저!
System.out.println("4. 포켓몬 시합");
System.out.println("0. 프로그램 종료");
System.out.println("================");
System.out.println("");
int action = sc.nextInt();
if(action == 0) {
System.out.println("게임을 종료합니다...");
break;
}
else if(action == 1) {
System.out.println("=== 내 포켓몬 목록 ===");
for(int i = 0; i< cnt; i++) {
System.out.println((i+1) + ". " + poList[i]);
}
System.out.println("==================");
} else if(action == 2) {
// 랜덤으로 1마리 튀어나오게 !
// 잡을래 말래?
// 잡을래 하면
// 몬스터볼을 던진다
// 70% 확률로 성공
// 성공 >> 도감에 저장
// 실패 >> ㅠㅠ 빠져나감 -> 잡는다고 했을 때가 핵심 기능이라서 핵심으로 못가게 만드는 코드는 위로 보내는 게 낫다.
// yes가 아닌 경우를 yes인 경우보다 위로 던지는게 좋다.
int randNum = rand.nextInt(5); // 0-4 인덱스
System.out.println("야생의 " + pokemon[randNum] + "이(가) 나타났다!");
if(poList[2] != null) {
System.out.println("도감이 가득 찼습니다 ! 몬스터볼을 던질 수 없습니다 ... ");
continue;
} else {
System.out.println("몬스터볼을 던질까? (YES, NO)");
System.out.println(">> ");
}
String ans = sc.next(); // 문자열 입력이라 next 사용
if(!ans.equals("YES")) { // != 는 연산자이다. 연산자는 원시타입과 비교한다.
// 10 != 11 이런거.. String은 원시타입이 아니기에 (참조형) 연산자로 비교할 수 없다.
// String 끼리 값을 비교할 때는 equls() 함수를 사용해야한다!
System.out.println("도망쳤습니다...");
continue; // 안잡으면 2번을 아예 끝냄
} else { // YES가 아닌 모든 대답은 못잡는다
System.out.println("!!!!!!!!몬스터볼 던지기!!!!!!!!!");
int rNum = rand.nextInt(100); // 70% 성공 확률 // 0~99
// 1부터 70까지 나오면 성공!
if(rNum <= 30) { // 실패
System.out.println("ㅠㅠ.. 실패했습니다...");
continue;
}
System.out.println("신난다!!!" + pokemon[randNum] + "을(를) 잡았습니다!!!");
// 숫자 100개 찍어서 70개 중 나오면 70%
poList[cnt]=pokemon[randNum];
poLvList[cnt++] = rand.nextInt(4) + 1; // 1~4
System.out.println("포켓몬 이름을 지어주시겠습니까? (YES, NO)");
String ans3 = sc.next();
if(ans3.equals("YES")) {
System.out.println("포켓몬 이름 입력 >>");
String name = sc.next();
poList[cnt] = name;
String s = poList[cnt];
String s1 = replace(poList[cnt], name);
poList[cnt] = s1; // 이름 어케 바꿈?????
//poList[cnt] = name;
//pokemon[randNum] = name;
/*for(int i = 0; i<3; i++) {
if(poList[i] == null) {
poList[i] = name;
}
}*/
System.out.println("이름 변경 완료!");
System.out.println(name + "을 도감에 저장하였습니다!");
continue;
}
else {
System.out.println(pokemon[randNum] + "를 도감에 저장하였습니다!");
continue;
}
}
} // 여기서 DEPTH 따지기.. YES인 부분과 NO인 부분 순서!! 어떤 걸 if문으로 보낼지
else if(action==3) {
int num;
while(true) {
System.out.print("번호 입력 >> ");
num=sc.nextInt();
if(1<=num && num<=cnt) {
break;
}
System.out.println("없는 번호입니다!");
}
System.out.println(poList[num-1]+"은(는) Lv."+poLvList[num-1]+" 입니다.");
}
else if(action==4) {
int randNum = rand.nextInt(5);
System.out.println("시합에 출전합니다! 상대 포켓몬은 " + pokemon[randNum] + "입니다!" );
System.out.println("어떤 포켓몬을 내보내시겠습니까?");
System.out.println("=== 내 포켓몬 목록 ===");
for(int i = 0; i< cnt; i++) {
System.out.println((i+1) + ". " + poList[i]);
}
System.out.println(">>");
int select = sc.nextInt(4);
if(select < 0 || select > 3) {
System.out.println("정확한 번호를 입력해주세요!");
}
System.out.println(poList[select-1] + "를 몬스터볼에서 꺼냈습니다! 공격하시겠습니까? (YES, NO)");
String ans2 = sc.next();
if(!ans2.equals("YES")) {
System.out.println("도망쳤습니다.... 시합이 종료되었습니다.");
}
int rNum2 = rand.nextInt(100);
if(rNum2 > 50) { // 0-49 승리
System.out.println("시합에서 승리하였습니다! " + poList[select-1] + "의 레벨이 1레벨 증가했습니다!");
poLvList[select-1]++;
} else { // 50-99 패배
System.out.println("패배했습니다... 시합을 종료합니다.");
}
}
else {
System.out.println("유효하지 않은 메뉴 번호입니다!");
}
}
}
포켓몬을 잡고 포켓몬 이름을 지어주는 부분에서 계속 헤맸다.
뭔가 replace 메서드를 쓰고 싶은데 아직 안 배웠으니 그러면 안될 것 같고, 또, 안 쓰자니 이름이 안바뀌고... 여기서 계속계속~ 헤맸다
[주어졌던 문제들]
아래는 한글코딩했던 문제들이다.
1.4번 코딩하기
- 내가 가진 포켓몬 중 1마리를 꺼내서 시합에 내보낸다. 50% 확률로 승리 >> 레벨 1업/ 패배 >> 그냥 넘어가기
내 도감은 poList
poList에서 한 마리를 선택하여 내보낸다
시합에 참여합니다! ㅇㅇㅇ이 나타났습니다!
포켓몬은 마찬가지로 잡을 수 있는 포켓몬 도감에서 꺼낸다.
포켓몬 선택하라는 메세지 출력
포켓몬 도감 출력해주기
포켓몬 선택은 사용자의 입력을 받기
사용자의 입력을 받아서 배열에서 한 마리의 포켓몬을 꺼낸다
ㅇㅇㅇ을 몬스터볼에서 꺼냈습니다! 공격하시겠습니까 (YES, NO)
만약 YES를 선택하면
50%의 확률로 승리해서 레벨 업하고 (승리했습니다! ㅇㅇㅇ이 레벨업했습니다!)
50%의 확률로 패배해서 그냥 넘어간다. (패배했습니다..)
NO를 선택하면 (도망쳤습니다...시합이 종료됩니다.) 출력 후 넘어가기
2. 2. 포켓몬 잡을 때 이미 3마리 갖고 있으면 몬스터볼 못던지게 하기(고찰 ㄱㄱ)
몬스터볼을 던지기 전에 배열 3개가 꽉 찼는지 확인하기?
2번 인덱스가 차면 도감이 가득 찼다고 가정
만약 (배열이 가득 찼다면)
도감이 도감이 꽉 찼습니다! 몬스터볼을 던질 수 없습니다... 출력하고
배열에 빈 자리가 있다면
몬스터볼을 던질까? (YES, NO) 출력하기
3. 3마리 일 때 새로운 포켓몬을 잡았다면, 방출 후 데려가기가 가능하다면? 어떻게 코딩할지? (심화)
3마리일때 새로운 포켓몬을 잡음.
이때 배열에서 한 가지 요소를 빼고 새로운 포켓몬을 그 자리에 들여야 함.
배열에서 어떤 포켓몬을 방출할 것인지 사용자의 입력을 받음
방출 당하면... 배열의 특징이 어떻더라 흠
배열의 특징...
여기서 배열도 요소를 중간에 넣었다 뺐다가 맘대로 할 수 있는지 잠깐 생각했던 것 같다.
4. 메뉴 2번할 때 포켓몬 이름을 정할 수 있다면???
포켓몬 이름을 지어주시겠습니까? (YES, NO) 출력하기
* 만약 (NO를 선택하면) {
* (입력된 문자열)을 도감에 저장하였습니다!만 출력 후 초기화면
} (YES를 입력하면) {
사용자 입력 받기 문자열로
원래 이름에서 입력된 문자열로 교체
이름 변경 완료!
(입력된 문자열)을 도감에 저장하였습니다! 출력 후 초기화면
}
새로 잡은 포켓몬을 빈 배열에 저장하는 것인데... 빈 배열이 없다면 애초에 저장할 수 없다.
랜덤으로 뽑은 포켓몬을 잡는다.
잡으면 포켓몬 이름을 지어줄지 묻는다.
사용자가 YES를 입력하면 포켓몬 이름 입력창을 출력한다.
사용자의 입력을 받는다.
이름을 입력받으면 랜덤으로 뽑은 포켓몬 이름을 입력받은 이름으로 교체한다.
포켓몬 이름 정하는 부분에서 막혔다 ㅠㅠ
5. 메뉴 3번이나 4번 할 때 유효성 검사 추가하기
많이 해봤으니 패스...
[강사님 코드]
// 1. 학생부
// 2. 쇼핑몰(자판기,키오스크)
// 3. 게임 ◀
Scanner sc=new Scanner(System.in);
Random rand=new Random();
String[] poList=new String[3]; // 트레이너의 도감
int cnt=0;
poList[0]="꼬부기"; // "홍길동"
cnt++;
int[] poLvList=new int[3];
poLvList[0]=5; // "꼬부기"는 레벨 "5"로 시작
String[] pokemon=new String[5];
pokemon[0]="야돈";
pokemon[1]="고라파덕";
pokemon[2]="메타몽";
pokemon[3]="두두";
pokemon[4]="네이티오";
while(true) {
System.out.println();
System.out.println("===== 메 뉴 =====");
System.out.println("1. 포켓몬 전체 출력");
System.out.println("2. 포켓몬 잡기");
System.out.println("3. 포켓몬 정보 출력");
System.out.println("4. 포켓몬 시합");
System.out.println("0. 프로그램 종료");
System.out.println("====================");
System.out.print("메뉴 입력 >> ");
int action=sc.nextInt();
if(action==0) {
System.out.println("게임을 종료합니다...");
break;
}
else if(action==1) {
System.out.println("=== 내 포켓몬 목록 ===");
for(int i=0;i<cnt;i++) {
System.out.println((i+1)+". "+poList[i]);
}
System.out.println("====================");
}
else if(action==2) {
int randNum=rand.nextInt(5); // 0~4
System.out.println("야생의 "+pokemon[randNum]+"이(가) 나타났다!");
System.out.println("몬스터볼을 던질까? (YES, NO)");
System.out.print(">> ");
String ans=sc.next();
// "정규표현식"
/*
// ans : YES yes Yes yES yeS YEs
// [1] DB(SQL), Script 등에서 많이 활용되는 방법
// 사용자의 입력값을 "정제(가공)"
// ex) 대소문자를 구분하지않습니다. >> 안내
ans=ans.toUpperCase();
// 로그 log ★
System.out.println("[로그] ans 값 대문자로 가공되었는지 체크 : "+ans);
*/
// [2] 금지어 기능
String[] datas=new String[100];
datas[0]="yes";
datas[1]="YES";
datas[2]="Yes";
datas[3]="yES";
boolean flag=false;
for(String v:datas) {
if(v.equals(ans)) {
flag=true;
break;
}
}
if(!flag) { // ☆ 연산자로는 문자열 타입 계산 xxx
System.out.println("도망쳤습니다...");
continue;
}
System.out.println("!!!!!몬스터볼 던지기!!!!!");
int rNum=rand.nextInt(100)+1; // 1~100
if(rNum<=30) { // 실패
System.out.println("ㅠㅠ... 실패했습니다...");
continue;
}
// 성공
System.out.println("신난다!!! "+pokemon[randNum]+"을(를) 잡았습니다!!!");
if(cnt >= poList.length) { // 도감이 가득찼다면,
System.out.println("어...?? 도감이 가득차서 "+pokemon[randNum]+"을(를) 데려올수없습니다!");
System.out.print("기존 포켓몬을 방출하시겠습니까? (YES, NO)");
System.out.print(">> ");
ans=sc.next();
if(ans.equals("YES")) {
System.out.print("몇번 포켓몬을 방출할까요? >> ");
int num=sc.nextInt();
poList[num-1]=pokemon[randNum];
poLvList[num-1]=rand.nextInt(4)+1; // 1~4
}
else {
System.out.println("포켓몬을 잡지 않았습니다...");
}
}
else {
poList[cnt]=pokemon[randNum];
poLvList[cnt++]=rand.nextInt(4)+1; // 1~4
}
}
else if(action==3) {
int num;
while(true) {
System.out.print("번호 입력 >> ");
num=sc.nextInt();
if(1<=num && num<=cnt) {
break;
}
System.out.println("없는 번호입니다!");
}
System.out.println(poList[num-1]+"은(는) Lv."+poLvList[num-1]+" 입니다.");
}
else if(action==4) { // R(selectOne) + U
// 이름으로 꺼내는 방법
// 번호로 꺼내는 방법
// >> selectOne은 반드시 "식별가능한 값"으로!
// 식별가능한 값 == PK == 주요키 ★
System.out.print("몇번 포켓몬을 꺼낼까요? >> ");
int num=sc.nextInt();
System.out.println(poList[num-1]+"이(가) 시합에 출전했습니다!");
int rNum=rand.nextInt(2);
if(rNum<=0) {
poLvList[num-1]++;
System.out.println("성공!!!");
}
else {
System.out.println("실패...");
}
}
else {
System.out.println("유효하지 않은 메뉴 번호입니다!");
}
}
}
}
확실히 이런 식으로 프로그램 작성하니까 훨씬 재밌는 것 같다. 물론 내 실력은 재미있지 않아서 열심히 해야한다!!!!
지금도 한글코딩 매번 하고 있지만 한글코딩 보고 바로 코드로 작성할 수 있도록 더욱 깔끔하고 정확한 한글코딩을 작성하기 위해 노력해야 할 것 같다. 화이팅 !!
'IT > JAVA' 카테고리의 다른 글
Java Section 06 : 배열 (0) | 2025.01.07 |
---|---|
[Day 7] 함수 (1) | 2025.01.07 |
선택정렬 - 발표 피드백 (0) | 2025.01.06 |
Java Section 05 : 제어문-2 (0) | 2025.01.06 |
선택정렬 (0) | 2025.01.06 |