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]으로 출력
- 게임하기(공격) 2. 전체상태출력 3. 울음소리듣기 4. 포켓몬잡기 0. 게임종료
# 피카츄,꼬부기 대신 다른 포켓몬들로 구현할 것!
회의 내용 + 설계 내용 + 최종 코드
https://www.notion.so/7a30616331b94a69bd3d384d90886a2d?v=99dba02366a8429d8233d177a3ec10f9&pvs=4
본인파트
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);
- 메뉴를 상수화하는 배열을 활용하여 반복되는 부분의 의미를 명확하게 파악할수 있도록 수정하였습니다.
- 오류 감소, 코드 재사용성 , 유지보수의 용이성 , 코드 최적화 및 가독성을 높였습니다.(위: 수정 전 /아래: 수정 후)
계획/설계가
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 |