캐릭터와 몬스터가 전투하는 게임 구현하기
기능
1) csv 파일에서 캐릭터와 몬스터의 체력, 공격력, 방어력 설정값 불러오기
2) 사용자에게 입력받아 공격 or 방어 수행하기
3) 몬스터를 처치했을 경우 다음 몬스터와 전투 진행하기
4) 전투 결과 파일에 저장하기
전투기능
1) 사용자가 공격할 경우 몬스터의 체력을 사용자의 공격력만큼 감소
2)몬스터는 공격만 가능
코드 작성 중 발생한 문제점
한 메서드의 길이가 너무 길다.
초반에 아래와 같이 작성을 했는데 메서드의 코드가 길어도 너무 길다..
가독성도 떨어지고 내가 선언한 변수가 뭔지 헷갈리고 꼬이는 지경에 이르렀음.
문제의 코드
battle(): 전투 진행 메서드
//전투 진행 메서드
Future<void> battle() async{
bool characterItem = false;
int originalPower = character.power;
int usedItem = 0;
Monster randomMonster = await getRandomMonster();
bonusHp();
while(!isTerminated){
//캐릭터의 공격 차례
print("\n${character.name}의 턴");
print("행동을 선택하세요 1: 공격 2: 방어 3: 아이템 사용");
String? inputAction = stdin.readLineSync();
try {
switch (inputAction) {
case '1':
character.attackMonster(randomMonster);
break;
case '2':
character.defend(randomMonster);
break;
case '3':
character.checkItem(characterItem);
usedItem ++;
continue;
default:
continue;
}
} catch (e) {
print("오류 발생: $e");
}
//몬스터가 공격
monsterAttack(randomMonster);
monsterTurn++;
monsterDefenceUp(randomMonster);
if(usedItem>0){
characterItem=true;
character.power=originalPower;
}
//캐릭터가 패배 했을 경우
if(character.hp <= 0){
gameResult = false;
print('몬스터에게 졌습니다.');
askWriteFile();
}
//캐릭터가 승리 했을 경우
if(randomMonster.mHp <= 0 && character.hp > 0){
killedMonster ++;
bool inputIncorrect = false;
print("${randomMonster.monName} 를 물리쳤습니다!");
while(inputIncorrect==false){
print("다음 몬스터와 싸우시겠습니까? (y/n)");
String? inputString = stdin.readLineSync();
try {
switch (inputString) {
case 'y':
monsterList.remove(randomMonster);
randomMonster =await getRandomMonster();
inputIncorrect = true;
break;
case 'n':
askWriteFile();
inputIncorrect = true;
break;
default:
print('지원하지 않는 기능입니다 ! 다시 시도해 주세요 ..');
}
} catch (e) {
print("오류 발생: $e");
}
}
}
}
}
기능을 다 메서드에 넣어버리기로 했다.
우선 위의 코드의 동작을 설명하자면
1)캐릭터 공격
2)몬스터공격
3)캐릭터가 이긴 경우
4)몬스터가 이긴 경우
이렇게 흘러갈 수 있도록 냅다 코딩을 했다.
하나 하나 분리해보기로 했다.
1. 캐릭터 공격 메서드
//캐릭터 공격 메서드
void characterTurn(randomMonster, characterItem, originalPower, usedItem){
bool validInput = false;
while(validInput==false){
print("\n${character.name}의 턴");
print("행동을 선택하세요 1: 공격 2: 방어 3: 아이템 사용");
String? inputAction = stdin.readLineSync();
try {
switch (inputAction) {
case '1':
character.attackMonster(randomMonster);
validInput = true;
case '2':
character.defend(randomMonster);
validInput = true;
case '3':
character.checkItem(characterItem);
usedItem[0]++;
default:
print('다시 입력해주세요');
}
} catch (e) {
print("오류 발생: $e");
}
}
}
2) 몬스터가 공격하는 메서드
//몬스터 공격 메서드
void monsterAttack(Monster randomMonster){
//몬스터의 공격 차례
print("\n${randomMonster.monName}의 턴");
randomMonster.attackCharacter(character);
print('\n');
character.showState();
randomMonster.showState();
print('\n');
}
3) 결과 판단하는 메서드
void judgeResult (character,randomMonster){
//캐릭터가 졌을 경우
if(character.hp<0 &&randomMonster.mHp>=0){
gameResult = false;
print('몬스터에게 졌습니다.');
askWriteFile();
}
//몬스터가 졌을 경우
if(randomMonster.mHp<0){
killedMonster ++;
bool inputIncorrect = false;
print("${randomMonster.monName} 를 물리쳤습니다!");
while(inputIncorrect==false){
print("다음 몬스터와 싸우시겠습니까? (y/n)");
String? inputString = stdin.readLineSync();
try {
switch (inputString) {
case 'y':
monsterList.remove(randomMonster);
randomMonster = getRandomMonster();
inputIncorrect = true;
break;
case 'n':
askWriteFile();
inputIncorrect = true;
break;
default:
print('지원하지 않는 기능입니다 ! 다시 시도해 주세요 ..');
}
} catch (e) {
print("오류 발생: $e");
}
}
}
}
4)수정된 battle()
Future<void> battle() async{
bool characterItem = false;
int originalPower = character.power;
List<int> usedItem = [0];
Monster randomMonster = await getRandomMonster();
bonusHp();
while(!isTerminated){
//캐릭터가 공격
characterTurn(randomMonster, characterItem, originalPower, usedItem);
//몬스터가 공격
monsterAttack(randomMonster);
monsterTurn++;
//3턴마다 몬스터 방어력 증가
monsterDefenseUp(randomMonster);
//아이템을 사용한 경우 다시 사용할 수 없도록 설정
if(usedItem[0]>0){
characterItem=true;
character.power=originalPower;
}
//결과 판단
judgeResult(character,randomMonster);
}
}
확실히 깔끔해진 것을 알 수 있다.
이렇게 길어도 되나 싶을 정도로 코드가 길다.
어떻게 하면 재사용성과 효율성이 높은 코드를 짤 수 있는지 고민해봐야겠다.
'TIL' 카테고리의 다른 글
[TIL]플러터 기초 (0) | 2024.11.11 |
---|---|
[TIL] 과제 보충 (1) | 2024.11.08 |
[TIL] 큐&연결리스트 (0) | 2024.11.06 |
[TIL] 리스트 빈도 구하기 (0) | 2024.11.05 |
[TIL] 비동기 프로그래밍 (0) | 2024.11.04 |