스파르타 내일 배움캠프 Flutter 개발반 3주차를 진행중에 있는데 2번째 개인 과제로 Dart를 이용한 콘솔 RPG 게임을 만들어 보자 라는 주제의 과제를 받았다.
프로젝트를 진행하면서 많은 트러블 슈팅 상황이 발생 하였는데 관련해서 블로그에 정리 후 추후에 나를 되돌아보는 시간에 다시금 이 포스팅을 보고 어떤 부분에서 실수를 저질렀고 어떤 부분을 개선해야할지 돌아 볼 수 있는 계기가 있었으면 좋겠다는 생각에
글을 써보려 한다.
1. 캐릭터 & 몬스터 데이터 로드 오류
문제 발생
1.characters.txt 또는 monsters.txt 파일이 존재하지 않거나,
2.파일 포맷이 잘못되어 데이터 파싱에 실패하는 경우.
발생 상황 예시
Unhandled exception: 캐릭터 파일이 없습니다.
Unhandled exception: 잘못된 캐릭터 데이터
해결 방법
//파일 존재 여부 체크
final file = File('characters.txt');
if (!file.existsSync()) throw Exception('캐릭터 파일이 없습니다.');
//데이터 포맷 검증
final stats = file.readAsStringSync().split(',');
if (stats.length != 3) throw FormatException('잘못된 캐릭터 데이터');
//예외처리 추가
try {
final file = File('characters.txt');
final contents = file.readAsStringSync();
final stats = contents.split(',');
if (stats.length != 3) throw FormatException('데이터 포맷 오류');
} catch (e) {
print('캐릭터 데이터를 불러오는 데 실패했습니다: $e');
exit(1);
}
파일이 없다면 게임이 실행되지 않도록 exit(1) 처리!
2. 무기 강화 실패 시 무기 초기화 오류
문제 발생
1. 무기 강화 실패 시 공격력이 비정상적으로 감소하는 버그 발생.
2. 실패할 때마다 공격력이 계속 감소하여 음수가 될 수도 있음.
무기 강화 실패!
⚠️ 무기가 초기화되었습니다!
공격력: -15
해결 방법
//공격력 감소 로직을 수정하여 0 이하로 떨어지지 않도록 방어 코드 추가
if (weaponLevel >= 4) {
print('⚠️ 무기가 초기화되었습니다!');
weaponLevel = 0;
attack = max(0, attack - attackBonus.values.reduce((a, b) => a + b)); // 0 이하 방지
}
무기 초기화 시 attack 값이 0 미만이 되지 않도록 max(0, attack - 감소량) 적용!
3. 전투 중 몬스터 체력이 0인데 계속 공격하는 버그
문제 발생
1. 몬스터 체력이 0이 되었음에도 전투가 계속 진행되는 문제 발생.
2. 몬스터가 죽었음에도 계속 공격을 시도함.
몬스터 체력: 0
몬스터가 플레이어를 공격했습니다! (데미지: 15)
해결 방법
//체력이 0 이하가 되면 즉시 전투 종료
if (monster.health <= 0) {
print('\n${monster.name}을(를) 물리쳤습니다!');
return; // ✅ 전투 종료
}
//battle 함수 내 몬스터가 죽었는지 체크 후 즉시 리턴 추가
while (player!.health > 0 && monster.health > 0) {
// 캐릭터 공격
player!.attackMonster(monster);
if (monster.health <= 0) {
print('${monster.name}이(가) 쓰러졌습니다!');
return; // ✅ 즉시 전투 종료
}
// 몬스터 공격
monster.attackCharacter(player!);
}
몬스터의 체력이 0 이하가 되면 전투 루프를 빠져나가도록 return 추가!
4. 가챠 시스템에서 뽑기 후 스탯이 반영되지 않는 문제
문제 발생
1. 가챠(뽑기)를 했지만 공격력/방어력 상승이 반영되지 않는 문제 발생.
2. 단순히 메시지만 출력되고, 실제 게임 내 스탯이 변하지 않음.
가챠를 돌립니다...
[희귀] 전설의 검 획득! (공격력 +5, 방어력 +3)
현재 능력치 - 공격력: 10, 방어력: 5 (변화 없음)
해결 방법
//객체의 상태를 즉시 업데이트하도록 보장
void gachaDraw() {
if (gold < 10) {
print('❌ 골드 부족! (필요 골드: 10, 보유 골드: $gold)');
return;
}
gold -= 10;
print('\n🎲 가챠를 돌립니다...');
int chance = Random().nextInt(100);
if (chance < 70) {
attack += 2;
defense += 1;
print('[⚔️ 일반] 무기 획득! (공격력 +2, 방어력 +1)');
} else if (chance < 95) {
attack += 5;
defense += 3;
print('[🔥 희귀] 전설의 검 획득! (공격력 +5, 방어력 +3)');
} else {
attack += 10;
defense += 5;
print('[💎 전설] 신의 무기 획득! (공격력 +10, 방어력 +5)');
}
// ✅ 변경된 능력치를 즉시 출력하여 반영되었는지 확인
print('✅ 현재 능력치 - 공격력: $attack, 방어력: $defense');
}
변경된 값을 즉시 출력하도록 보장하여 디버깅이 용이하게 함!
이처럼 프로젝트를 진행하다 보면 어떤곳에서
어떤식으로 에러가 날줄 모르기 때문에 항상 긴장하고 집중하면서 작업을 진행해야한다.
추후 팀프로젝트를 진행하게 된다면 TDD를 적용하여 테스트 지향 프로그래밍을 한번 진행해보고싶기도 하다.
'Mystudy' 카테고리의 다른 글
| Flutter 앱 개발 중 겪은 트러블슈팅 2가지: 네이버 지역 검색 API와의 전쟁 (0) | 2025.04.22 |
|---|---|
| [Flutter] 기차 예매 앱 개발 중 만난 문제와 해결법 (0) | 2025.04.02 |
| Dart 콘솔에서 한글 인식 문제 - 트러블슈팅 (0) | 2025.03.14 |
| 플러터 위젯 트리란 무엇인가? (0) | 2025.03.04 |
| Flutter 상태 관리: 어떤 방법을 선택해야 할까? (0) | 2025.02.28 |