프로젝트_리뷰

JAVA - 포켓몬게임

javaboiii 2024. 7. 11. 14:52

JAVA

 

※ 요구사항

[포켓몬스터 게임 프로그램을 작성해주세요.]

class 포켓몬

String 타입 // 모든 포켓몬은 타입이 반드시 존재한다. ex) 전기, 물, ...

String 이름 // 모든 포켓몬은 이름이 반드시 존재한다. ex) 피카츄, 꼬부기, ...

int 레벨 // 새로 잡은 포켓몬의 레벨은 1~5 랜덤한 값을 가진다.

int 경험치 // 새로 잡은 포켓몬의 경험치는 0이다.

void attack() // 50%의 확률로 성공 -> 성공시 50~500 사이의 경험치 획득

void hello() // 피카츄는 삐까삐까, 꼬부기는 꼬북꼬북 등의 울음소리를 출력한다.

void levelUp() // 경험치가 100을 채울때마다 레벨은 +1

 

 

class 피카츄 attack() // 전기타입 -> 전기충격 hello() // 삐까삐까

class 꼬부기 attack() // 물타입 -> 물대포 hello() // 꼬북꼬북

syso(포켓몬객체); 수행시 [피카츄 전기타입 Lv5 exp10]으로 출력

  1. 게임하기(공격) 2. 전체상태출력 3. 울음소리듣기 4. 포켓몬잡기 0. 게임종료

# 피카츄,꼬부기 대신 다른 포켓몬들로 구현할 것!

 

회의 내용 + 설계 내용 + 최종 코드

https://www.notion.so/7a30616331b94a69bd3d384d90886a2d?v=99dba02366a8429d8233d177a3ec10f9&pvs=4

 

포켓몬스터 | Notion

Built with Notion, the all-in-one connected workspace with publishing capabilities.

daffy-biology-97e.notion.site

 

본인파트

3. 울음소리듣기

 

package teamproject;

import java.util.Random;
import java.util.Scanner;

class Pokemon{
	int pokemonNum;
	String type;
	String name;
	int level;
	int exp;
	static Random rand = new Random();
	Pokemon(int pokemonNum,String type, String name){
		this.pokemonNum = pokemonNum;
		this.type = type;
		this.name = name;
		this.level = rand.nextInt(5)+1;
		this.exp = 0;
	}
	void attack() {

	}
	void hello() {
		System.out.print("["+this.name+": ");
	}
	void levelUP() {

	}
	@Override
	public String toString() {
		return "["+this.name+" "+this.type+" lv."+this.level+" exp."+this.exp+"]";
	}

}

class Lucky extends Pokemon{
	Lucky(int pokemonNum){
		this(pokemonNum,"럭키");
	}
	Lucky(int pokemonNum,String name){
		super(pokemonNum,"노말",name);
	}
	@Override
	void hello() {
		super.hello();
		System.out.println("완전 럭키비키 쟈나 !]");
	}
}

class Hudin extends Pokemon{
	Hudin(int pokemonNum){
		this(pokemonNum, "후딘");
	}
	Hudin(int pokemonNum, String name){
		super(pokemonNum,"에스퍼",name);
	}
	@Override
	void hello() {
		super.hello();
		System.out.println("숟가락]");
	}
}

class Rizamong extends Pokemon{
	Rizamong(int PokemonNum){
		this(PokemonNum, "리자몽");
	}
	Rizamong(int pokemonNum, String name){
		super(pokemonNum,"불",name);
	}
	@Override
	void hello() {
		super.hello();
		System.out.println("리자몽]");
	}
}

class Pangdori extends Pokemon{
	Pangdori(int pokemonNum){
		this(pokemonNum, "팽도리");
	}
	Pangdori(int pokemonNum, String name){
		super(pokemonNum,"물",name);
	}
	@Override
	void hello() {
		super.hello();
		System.out.println("팽]");
	}
}

class Natu extends Pokemon{
	Natu(int pokemonNum){
		this(pokemonNum, "네이티오");
	}
	Natu(int pokemonNum, String name){
		super(pokemonNum,"에스퍼", name);
	}
	@Override
	void hello() {
		super.hello();
		System.out.println("안녕하세요 네이티오 입니다]");
	}
}

class Mew extends Pokemon{
	Mew(int pokemonNum){
		this(pokemonNum,"뮤");
	}
	Mew(int pokemonNum, String name){
		super(pokemonNum,"에스퍼", name);
	}
	@Override
	void hello() {
		super.hello();
		System.out.println("뮤뮤]");
	}
}

public class PokemonGame {
	public static boolean isEmpty(int cnt) {
		if(cnt<=0) {
			System.out.println("사용할 수 있는 포켓몬이 없습니다");
			return true;
		}
		return false;
	}

	public static void printList(Pokemon[] datas, int cnt) {
		System.out.println("=== 나의 포켓몬 ===");
		for (int i = 0; i < cnt; i++) {
			System.out.println((i+1)+"번 포겟몬 "+datas[i]);
		}
		System.out.println("===============");
	}
	
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int PK=1;

    Pokemon[] datas = new Pokemon[6];
    datas[0] = new Lucky(PK++);
    datas[1] = new Hudin(PK++);

    int cnt = 2;

    while(true) {
        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 menu = sc.nextInt();

        if(menu==0) { //게임종료
            System.out.println("포켓몬 게임을 종료합니다");
            break;
        }
        else if(menu==1) { // 게임하기

        }
        else if(menu==2) { // 전체상태출력
            if(isEmpty(cnt)) {
                continue;
            }
            printList(datas, cnt);
        }
        else if(menu==3) { // 울음소리듣기
            if(isEmpty(cnt)) {
                continue;
            }
            int selecNum;
            while(true) {
                printList(datas, cnt);
                System.out.println("듣고 싶은 포켓몬번호 선택 >>");
                sc.nextLine(); // 버퍼지우기

                if(sc.hasNextInt()) { // 숫자인지 아닌지
                    selecNum = sc.nextInt();
                    if(0<selecNum && selecNum <= cnt) { // 유효성 검사
                        datas[selecNum-1].hello();
                        break;
                    }
                    else {
                        System.out.println("유효한 숫자만 입력하세요");
                    }
                }
                else {
                    System.out.println("숫자만 입력해주세요");
                    continue;
                }


//					if(0<selecNum && selecNum <= cnt) {
//						datas[selecNum-1].hello();
//						break;
//					}
//					else {
//						System.out.println("잘못 입력");
//					}


            }
        }
        else if(menu==4) { // 포켓몬잡기

        }
        else {
            System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
        }


    } // 1번째 while문

}
}

 

 

버퍼를 지워주지 않으면

듣고 싶은 포켓몬번호 선택 >>
숫자만 입력해주세요
=== 나의 포켓몬 ===
1번 포겟몬 [럭키 노말 lv.2 exp.0]
2번 포겟몬 [후딘 에스퍼 lv.5 exp.0]
===============
듣고 싶은 포켓몬번호 선택 >>
숫자만 입력해주세요
=== 나의 포켓몬 ===
1번 포겟몬 [럭키 노말 lv.2 exp.0]
2번 포겟몬 [후딘 에스퍼 lv.5 exp.0]
===============
듣고 싶은 포켓몬번호 선택 >>
숫자만 입력해주세요
=== 나의 포켓몬 ===
1번 포겟몬 [럭키 노말 lv.2 exp.0]
2번 포겟몬 [후딘 에스퍼 lv.5 exp.0]
===============
듣고 싶은 포켓몬번호 선택 >>

가 무한 반복된다.

 


[코드리뷰]

 

메서드 사용할때 인자여부

인자에대한 설명 주석도 부족

타겟,목표,자료,시장,경쟁상대 조사가 부족했다.

void levelUp(int level, int newExp, int exp) {
		// 경험치가 100을 채울때마다 레벨은 +1
		this.level = newExp / 100 + this.level;
		this.exp = newExp % 100 + this.exp;
		if (this.exp >= 100) { // 경험치가 100 넘으면 +1 레벨업
			this.exp = this.exp - 100;
			this.level++;
		}
		if (this.level >=  MAX_LEVEL) { // 최고레벨 50일 때,경험치 0으로 고정
			System.out.println("최고 레벨 50");
			this.level = MAX_LEVEL;
			this.exp = 0;
		}
	}

거의 모든 게임에서의 레벨업은 +1 +1 +1 형식

한번에 +5가 되지 않음 —> 타겟,목표,자료,시장,경쟁상대 조사가 부족했다

 

levelUp() 메서드에서는 this.level과 this.exp가 사용되고 있기 때문에

인자로 받을 필요가 없고 필요 시 설명이 필요한 코드

—> 메서드 사용할때 인자여부/인자에대한 설명 주석도 부족

 

levelUp() 메서드는 로직이 잘못됨

 

[수정사항 반영 ]

void levelUp(int newExp) {
		int newLevel = newExp/100; //획득한 경험치에 의해서 레벨업하는 값
		//newLevel만큼 반복해서 +1 씩 레벨업

		for(int i=0; i<newLevel;i++) {
			System.out.println("레벨이 +1 올랐습니다.");
			this.level ++;
		}
		this.exp += newExp%100;
		if(this.exp>=100) {
			System.out.println("레벨이 +1 올랐습니다.");
			this.level++;
			this.exp= this.exp-100;
		}
		//만약 레벨이 50이 된다면 레벨업 X
		if(this.level >= MAX_LEVEL) {
			System.out.println("최대 레벨에 도달하였습니다.");
			this.level = MAX_LEVEL;
			this.exp = 0;
		}
		// 그 이전에 50레벨에서 공격하기가 이루어질 경우, 레벨업은 시도조차 하지 않도록!
	}

 


 

만들어둔 생성자가 1개 사용이 덜되고있음

class Lucky extends Pokemon { // 럭키
	Lucky(int num, String name) {
		super(num, "노말", name);
	}	

	Lucky(int num) {
		this(num, "럭키");
	}
}

만들어둔 생성자가 1개 사용이 덜되고있음

—>럭키 객체를 생성하면 바로 부모생성자를 호출 (다른 자식 클래스도 마찬가지)

 

[수정사항 반영 후]

class Lucky extends Pokemon { // 럭키
	Lucky(int num, String name) { // PK값은 시스템에서 지정-> 객체에 부여
		// 이름은 사용자가 지정하거나 종명을 활용
		super(num, "노말", name);
	}	
	// 입력하지 않을 경우 종명을 활용하는 것!
	// 이름이 할당되지 않는 것이 아님!
}

 

본인이 작성한 코드에 주석이 없잖아요~~~

System.out.print(pokemonName + "(으)로 하시겠습니까? (Y/N) : ");
String answer = sc.next();//사용자가 입력한 대답
if(answer.equalsIgnoreCase("Y")) {
	break;
}
System.out.print("다시 입력해주세요 : ");
}

본인이 작성한 코드에 주석이 없잖아요~~~

—> equalsIgnoreCase()와 같은 함수 등

함께 개발하는 개발자의 이해를 돕기 위해 주석을 달아 설명해야함

 

 

[수정사항 반영 후]

System.out.print(pokemonName + "(으)로 하시겠습니까? (Y/N) : ");
    String answer = sc.next();//사용자가 입력한 대답
    if(answer.equalsIgnoreCase("Y")) {
        break; // equalsIgnoreCase()함수는 대소문자를 구별하지 않는함수.
    }
    System.out.print("다시 입력해주세요 : ");

 


 

UI/UX 사용자 친화적이어야 선택! — Good

attack() 메서드에서와 main()의 게임하기 등에서
출력되는 멘트
자료조사, 실제 포켓몬 게임 경험 등을 통한 멘트 설정

 

코드를 개발자가 사용하기 편하게!~~  — Good

// 상수정의:메뉴 번호
final int EXIT = 0, PLAY = 1, INFO = 2, HOWLING = 3, CATCH = 4; //배열 활용 상수화해서 유지보수 용이하게 만듬
//메뉴 항목 배열
String[] menus = new String[] {"[게임종료]", "[게임하기]", "[전체상태출력]", "[울음소리듣기]", "[포켓몬잡기]"};
//메뉴 텍스트 생성
String menuText = "메뉴출력 \\n"; 

for (int i = 0; i < menus.length; i++) {
    menuText += i + ". " + menus[i] + "\\n";
}

    System.out.println(menuText);

 

  1. 메뉴를 상수화하는 배열을 활용하여 반복되는 부분의 의미를 명확하게 파악할수 있도록 수정하였습니다.
  2. 오류 감소, 코드 재사용성 , 유지보수의 용이성 , 코드 최적화 및 가독성을 높였습니다.(위: 수정 전 /아래: 수정 후)

 

계획/설계가

while(true){

System.out.println(굉장히 어렵고 고단하고 힘들고 피곤하다);

}

 

 

'프로젝트_리뷰' 카테고리의 다른 글

프로젝트 - 결제 API 흐름  (0) 2024.10.28
WEB - 중간 프로젝트 발표 팀 피드백  (1) 2024.09.30
Web - 웹 프로젝트 1차 피드백  (1) 2024.09.01
JAVA -쇼핑몰 프로그램  (15) 2024.07.24
JAVA - UP, DOWN GAME  (1) 2024.07.01